11; NOTE: Assertions have been autogenerated by utils/update_test_checks.py
22; RUN: opt < %s -passes=instcombine -S | FileCheck %s
33
4- define i64 @src_2add_2sext_sub (i32 %x , i32 %y , i32 %z ) {
5- ; CHECK-LABEL: define i64 @src_2add_2sext_sub(
6- ; CHECK-SAME: i32 [[X:%.*]], i32 [[Y:%.*]], i32 [[Z:%.*]]) {
7- ; CHECK-NEXT: [[SEXT1:%.*]] = sext i32 [[Y]] to i64
8- ; CHECK-NEXT: [[SEXT2:%.*]] = sext i32 [[Z]] to i64
9- ; CHECK-NEXT: [[SUB:%.*]] = sub nsw i64 [[SEXT1]], [[SEXT2]]
4+ define i64 @src_2add_2sext_sub_1 (i32 %x , i32 %y , i32 %z ) {
5+ ; CHECK-LABEL: @src_2add_2sext_sub_1(
6+ ; CHECK-NEXT: [[TMP1:%.*]] = sext i32 [[Y:%.*]] to i64
7+ ; CHECK-NEXT: [[TMP2:%.*]] = sext i32 [[Z:%.*]] to i64
8+ ; CHECK-NEXT: [[SUB:%.*]] = sub nsw i64 [[TMP1]], [[TMP2]]
109; CHECK-NEXT: ret i64 [[SUB]]
1110;
1211 %add1 = add nsw i32 %x , %y
@@ -17,11 +16,55 @@ define i64 @src_2add_2sext_sub(i32 %x, i32 %y, i32 %z) {
1716 ret i64 %sub
1817}
1918
19+ define i64 @src_2add_2sext_sub_2 (i32 %x , i32 %y , i32 %z ) {
20+ ; CHECK-LABEL: @src_2add_2sext_sub_2(
21+ ; CHECK-NEXT: [[TMP1:%.*]] = sext i32 [[Y:%.*]] to i64
22+ ; CHECK-NEXT: [[TMP2:%.*]] = sext i32 [[Z:%.*]] to i64
23+ ; CHECK-NEXT: [[SUB:%.*]] = sub nsw i64 [[TMP1]], [[TMP2]]
24+ ; CHECK-NEXT: ret i64 [[SUB]]
25+ ;
26+ %add1 = add nsw i32 %x , %y
27+ %add2 = add nsw i32 %z , %x
28+ %sext1 = sext i32 %add1 to i64
29+ %sext2 = sext i32 %add2 to i64
30+ %sub = sub i64 %sext1 , %sext2
31+ ret i64 %sub
32+ }
33+
34+ define i64 @src_2add_2sext_sub_3 (i32 %x , i32 %y , i32 %z ) {
35+ ; CHECK-LABEL: @src_2add_2sext_sub_3(
36+ ; CHECK-NEXT: [[TMP1:%.*]] = sext i32 [[Y:%.*]] to i64
37+ ; CHECK-NEXT: [[TMP2:%.*]] = sext i32 [[Z:%.*]] to i64
38+ ; CHECK-NEXT: [[SUB:%.*]] = sub nsw i64 [[TMP1]], [[TMP2]]
39+ ; CHECK-NEXT: ret i64 [[SUB]]
40+ ;
41+ %add1 = add nsw i32 %y , %x
42+ %add2 = add nsw i32 %z , %x
43+ %sext1 = sext i32 %add1 to i64
44+ %sext2 = sext i32 %add2 to i64
45+ %sub = sub i64 %sext1 , %sext2
46+ ret i64 %sub
47+ }
48+
49+ define i64 @src_2add_2sext_sub_4 (i32 %x , i32 %y , i32 %z ) {
50+ ; CHECK-LABEL: @src_2add_2sext_sub_4(
51+ ; CHECK-NEXT: [[TMP1:%.*]] = sext i32 [[Y:%.*]] to i64
52+ ; CHECK-NEXT: [[TMP2:%.*]] = sext i32 [[Z:%.*]] to i64
53+ ; CHECK-NEXT: [[SUB:%.*]] = sub nsw i64 [[TMP1]], [[TMP2]]
54+ ; CHECK-NEXT: ret i64 [[SUB]]
55+ ;
56+ %add1 = add nsw i32 %y , %x
57+ %add2 = add nsw i32 %x , %z
58+ %sext1 = sext i32 %add1 to i64
59+ %sext2 = sext i32 %add2 to i64
60+ %sub = sub i64 %sext1 , %sext2
61+ ret i64 %sub
62+ }
63+
2064define i64 @src_2add_2sext_sub_nsw (i32 %x , i32 %y , i32 %z ) {
21- ; CHECK-LABEL: define i64 @src_2add_2sext_sub_nsw(
22- ; CHECK-SAME: i32 [[X:%.*]], i32 [[Y:%.*]], i32 [[Z:%.*]]) {
23- ; CHECK-NEXT: [[SEXT1:%.*]] = sext i32 [[Y]] to i64
24- ; CHECK-NEXT: [[SEXT2:%.*]] = sext i32 [[Z]] to i64
65+ ; CHECK-LABEL: @src_2add_2sext_sub_nsw(
66+ ; CHECK-NEXT: [[SEXT1:%.*]] = sext i32 [[Y:%.*]] to i64
67+ ; CHECK-NEXT: [[SEXT2:%.*]] = sext i32 [[Z:%.*]] to i64
2568; CHECK-NEXT: [[SUB:%.*]] = sub nsw i64 [[SEXT1]], [[SEXT2]]
2669; CHECK-NEXT: ret i64 [[SUB]]
2770;
@@ -34,10 +77,9 @@ define i64 @src_2add_2sext_sub_nsw(i32 %x, i32 %y, i32 %z) {
3477}
3578
3679define i64 @src_2add_2sext_sub_nuw (i32 %x , i32 %y , i32 %z ) {
37- ; CHECK-LABEL: define i64 @src_2add_2sext_sub_nuw(
38- ; CHECK-SAME: i32 [[X:%.*]], i32 [[Y:%.*]], i32 [[Z:%.*]]) {
39- ; CHECK-NEXT: [[TMP1:%.*]] = sext i32 [[Y]] to i64
40- ; CHECK-NEXT: [[TMP2:%.*]] = sext i32 [[Z]] to i64
80+ ; CHECK-LABEL: @src_2add_2sext_sub_nuw(
81+ ; CHECK-NEXT: [[TMP1:%.*]] = sext i32 [[Y:%.*]] to i64
82+ ; CHECK-NEXT: [[TMP2:%.*]] = sext i32 [[Z:%.*]] to i64
4183; CHECK-NEXT: [[SUB:%.*]] = sub nsw i64 [[TMP1]], [[TMP2]]
4284; CHECK-NEXT: ret i64 [[SUB]]
4385;
@@ -49,10 +91,9 @@ define i64 @src_2add_2sext_sub_nuw(i32 %x, i32 %y, i32 %z) {
4991 ret i64 %sub
5092}
5193
52- define i64 @src_x_add_2sext_sub (i32 %x , i32 %y ) {
53- ; CHECK-LABEL: define i64 @src_x_add_2sext_sub(
54- ; CHECK-SAME: i32 [[X:%.*]], i32 [[Y:%.*]]) {
55- ; CHECK-NEXT: [[SUB:%.*]] = sext i32 [[Y]] to i64
94+ define i64 @src_x_add_2sext_sub_1 (i32 %x , i32 %y ) {
95+ ; CHECK-LABEL: @src_x_add_2sext_sub_1(
96+ ; CHECK-NEXT: [[SUB:%.*]] = sext i32 [[Y:%.*]] to i64
5697; CHECK-NEXT: ret i64 [[SUB]]
5798;
5899 %add1 = add nsw i32 %x , %y
@@ -62,10 +103,21 @@ define i64 @src_x_add_2sext_sub(i32 %x, i32 %y) {
62103 ret i64 %sub
63104}
64105
106+ define i64 @src_x_add_2sext_sub_2 (i32 %x , i32 %y ) {
107+ ; CHECK-LABEL: @src_x_add_2sext_sub_2(
108+ ; CHECK-NEXT: [[SUB:%.*]] = sext i32 [[Y:%.*]] to i64
109+ ; CHECK-NEXT: ret i64 [[SUB]]
110+ ;
111+ %add1 = add nsw i32 %y , %x
112+ %sext1 = sext i32 %add1 to i64
113+ %sext2 = sext i32 %x to i64
114+ %sub = sub i64 %sext1 , %sext2
115+ ret i64 %sub
116+ }
117+
65118define i64 @src_x_add_2sext_sub_nsw (i32 %x , i32 %y ) {
66- ; CHECK-LABEL: define i64 @src_x_add_2sext_sub_nsw(
67- ; CHECK-SAME: i32 [[X:%.*]], i32 [[Y:%.*]]) {
68- ; CHECK-NEXT: [[SUB:%.*]] = sext i32 [[Y]] to i64
119+ ; CHECK-LABEL: @src_x_add_2sext_sub_nsw(
120+ ; CHECK-NEXT: [[SUB:%.*]] = sext i32 [[Y:%.*]] to i64
69121; CHECK-NEXT: ret i64 [[SUB]]
70122;
71123 %add1 = add nsw i32 %x , %y
@@ -76,9 +128,8 @@ define i64 @src_x_add_2sext_sub_nsw(i32 %x, i32 %y) {
76128}
77129
78130define i64 @src_x_add_2sext_sub_nuw (i32 %x , i32 %y ) {
79- ; CHECK-LABEL: define i64 @src_x_add_2sext_sub_nuw(
80- ; CHECK-SAME: i32 [[X:%.*]], i32 [[Y:%.*]]) {
81- ; CHECK-NEXT: [[SUB:%.*]] = sext i32 [[Y]] to i64
131+ ; CHECK-LABEL: @src_x_add_2sext_sub_nuw(
132+ ; CHECK-NEXT: [[SUB:%.*]] = sext i32 [[Y:%.*]] to i64
82133; CHECK-NEXT: ret i64 [[SUB]]
83134;
84135 %add1 = add nsw i32 %x , %y
0 commit comments