44define i64 @add_select_zext (i1 %c ) {
55; CHECK-LABEL: define i64 @add_select_zext
66; CHECK-SAME: (i1 [[C:%.*]]) {
7- ; CHECK-NEXT: [[SEL:%.*]] = select i1 [[C]], i64 64, i64 1
8- ; CHECK-NEXT: [[EXT:%.*]] = zext i1 [[C]] to i64
9- ; CHECK-NEXT: [[ADD:%.*]] = add nuw nsw i64 [[SEL]], [[EXT]]
7+ ; CHECK-NEXT: [[ADD:%.*]] = select i1 [[C]], i64 65, i64 1
108; CHECK-NEXT: ret i64 [[ADD]]
119;
1210 %sel = select i1 %c , i64 64 , i64 1
@@ -18,9 +16,7 @@ define i64 @add_select_zext(i1 %c) {
1816define i64 @add_select_sext (i1 %c ) {
1917; CHECK-LABEL: define i64 @add_select_sext
2018; CHECK-SAME: (i1 [[C:%.*]]) {
21- ; CHECK-NEXT: [[SEL:%.*]] = select i1 [[C]], i64 64, i64 1
22- ; CHECK-NEXT: [[EXT:%.*]] = sext i1 [[C]] to i64
23- ; CHECK-NEXT: [[ADD:%.*]] = add nsw i64 [[SEL]], [[EXT]]
19+ ; CHECK-NEXT: [[ADD:%.*]] = select i1 [[C]], i64 63, i64 1
2420; CHECK-NEXT: ret i64 [[ADD]]
2521;
2622 %sel = select i1 %c , i64 64 , i64 1
@@ -32,10 +28,7 @@ define i64 @add_select_sext(i1 %c) {
3228define i64 @add_select_not_zext (i1 %c ) {
3329; CHECK-LABEL: define i64 @add_select_not_zext
3430; CHECK-SAME: (i1 [[C:%.*]]) {
35- ; CHECK-NEXT: [[SEL:%.*]] = select i1 [[C]], i64 64, i64 1
36- ; CHECK-NEXT: [[NOT_C:%.*]] = xor i1 [[C]], true
37- ; CHECK-NEXT: [[EXT:%.*]] = zext i1 [[NOT_C]] to i64
38- ; CHECK-NEXT: [[ADD:%.*]] = add nuw nsw i64 [[SEL]], [[EXT]]
31+ ; CHECK-NEXT: [[ADD:%.*]] = select i1 [[C]], i64 64, i64 2
3932; CHECK-NEXT: ret i64 [[ADD]]
4033;
4134 %sel = select i1 %c , i64 64 , i64 1
@@ -48,10 +41,7 @@ define i64 @add_select_not_zext(i1 %c) {
4841define i64 @add_select_not_sext (i1 %c ) {
4942; CHECK-LABEL: define i64 @add_select_not_sext
5043; CHECK-SAME: (i1 [[C:%.*]]) {
51- ; CHECK-NEXT: [[SEL:%.*]] = select i1 [[C]], i64 64, i64 1
52- ; CHECK-NEXT: [[NOT_C:%.*]] = xor i1 [[C]], true
53- ; CHECK-NEXT: [[EXT:%.*]] = sext i1 [[NOT_C]] to i64
54- ; CHECK-NEXT: [[ADD:%.*]] = add nsw i64 [[SEL]], [[EXT]]
44+ ; CHECK-NEXT: [[ADD:%.*]] = select i1 [[C]], i64 64, i64 0
5545; CHECK-NEXT: ret i64 [[ADD]]
5646;
5747 %sel = select i1 %c , i64 64 , i64 1
@@ -64,9 +54,7 @@ define i64 @add_select_not_sext(i1 %c) {
6454define i64 @sub_select_sext (i1 %c , i64 %arg ) {
6555; CHECK-LABEL: define i64 @sub_select_sext
6656; CHECK-SAME: (i1 [[C:%.*]], i64 [[ARG:%.*]]) {
67- ; CHECK-NEXT: [[SEL:%.*]] = select i1 [[C]], i64 64, i64 [[ARG]]
68- ; CHECK-NEXT: [[EXT_NEG:%.*]] = zext i1 [[C]] to i64
69- ; CHECK-NEXT: [[SUB:%.*]] = add i64 [[SEL]], [[EXT_NEG]]
57+ ; CHECK-NEXT: [[SUB:%.*]] = select i1 [[C]], i64 65, i64 [[ARG]]
7058; CHECK-NEXT: ret i64 [[SUB]]
7159;
7260 %sel = select i1 %c , i64 64 , i64 %arg
@@ -78,10 +66,7 @@ define i64 @sub_select_sext(i1 %c, i64 %arg) {
7866define i64 @sub_select_not_zext (i1 %c , i64 %arg ) {
7967; CHECK-LABEL: define i64 @sub_select_not_zext
8068; CHECK-SAME: (i1 [[C:%.*]], i64 [[ARG:%.*]]) {
81- ; CHECK-NEXT: [[SEL:%.*]] = select i1 [[C]], i64 [[ARG]], i64 64
82- ; CHECK-NEXT: [[NOT_C:%.*]] = xor i1 [[C]], true
83- ; CHECK-NEXT: [[EXT_NEG:%.*]] = sext i1 [[NOT_C]] to i64
84- ; CHECK-NEXT: [[SUB:%.*]] = add i64 [[SEL]], [[EXT_NEG]]
69+ ; CHECK-NEXT: [[SUB:%.*]] = select i1 [[C]], i64 [[ARG]], i64 63
8570; CHECK-NEXT: ret i64 [[SUB]]
8671;
8772 %sel = select i1 %c , i64 %arg , i64 64
@@ -94,10 +79,7 @@ define i64 @sub_select_not_zext(i1 %c, i64 %arg) {
9479define i64 @sub_select_not_sext (i1 %c , i64 %arg ) {
9580; CHECK-LABEL: define i64 @sub_select_not_sext
9681; CHECK-SAME: (i1 [[C:%.*]], i64 [[ARG:%.*]]) {
97- ; CHECK-NEXT: [[SEL:%.*]] = select i1 [[C]], i64 [[ARG]], i64 64
98- ; CHECK-NEXT: [[NOT_C:%.*]] = xor i1 [[C]], true
99- ; CHECK-NEXT: [[EXT_NEG:%.*]] = zext i1 [[NOT_C]] to i64
100- ; CHECK-NEXT: [[SUB:%.*]] = add i64 [[SEL]], [[EXT_NEG]]
82+ ; CHECK-NEXT: [[SUB:%.*]] = select i1 [[C]], i64 [[ARG]], i64 65
10183; CHECK-NEXT: ret i64 [[SUB]]
10284;
10385 %sel = select i1 %c , i64 %arg , i64 64
@@ -122,9 +104,7 @@ define i64 @mul_select_zext(i1 %c, i64 %arg) {
122104define i64 @mul_select_sext (i1 %c ) {
123105; CHECK-LABEL: define i64 @mul_select_sext
124106; CHECK-SAME: (i1 [[C:%.*]]) {
125- ; CHECK-NEXT: [[EXT:%.*]] = sext i1 [[C]] to i64
126- ; CHECK-NEXT: [[TMP1:%.*]] = select i1 [[C]], i64 6, i64 0
127- ; CHECK-NEXT: [[MUL:%.*]] = shl i64 [[EXT]], [[TMP1]]
107+ ; CHECK-NEXT: [[MUL:%.*]] = select i1 [[C]], i64 -64, i64 0
128108; CHECK-NEXT: ret i64 [[MUL]]
129109;
130110 %sel = select i1 %c , i64 64 , i64 1
@@ -168,10 +148,7 @@ define <2 x i64> @vector_test(i1 %c) {
168148define i64 @multiuse_add (i1 %c ) {
169149; CHECK-LABEL: define i64 @multiuse_add
170150; CHECK-SAME: (i1 [[C:%.*]]) {
171- ; CHECK-NEXT: [[SEL:%.*]] = select i1 [[C]], i64 64, i64 1
172- ; CHECK-NEXT: [[EXT:%.*]] = zext i1 [[C]] to i64
173- ; CHECK-NEXT: [[ADD:%.*]] = add nuw nsw i64 [[SEL]], [[EXT]]
174- ; CHECK-NEXT: [[ADD2:%.*]] = add nuw nsw i64 [[ADD]], 1
151+ ; CHECK-NEXT: [[ADD2:%.*]] = select i1 [[C]], i64 66, i64 2
175152; CHECK-NEXT: ret i64 [[ADD2]]
176153;
177154 %sel = select i1 %c , i64 64 , i64 1
@@ -184,10 +161,7 @@ define i64 @multiuse_add(i1 %c) {
184161define i64 @multiuse_select (i1 %c ) {
185162; CHECK-LABEL: define i64 @multiuse_select
186163; CHECK-SAME: (i1 [[C:%.*]]) {
187- ; CHECK-NEXT: [[SEL:%.*]] = select i1 [[C]], i64 64, i64 0
188- ; CHECK-NEXT: [[EXT_NEG:%.*]] = sext i1 [[C]] to i64
189- ; CHECK-NEXT: [[ADD:%.*]] = add nsw i64 [[SEL]], [[EXT_NEG]]
190- ; CHECK-NEXT: [[MUL:%.*]] = mul nsw i64 [[SEL]], [[ADD]]
164+ ; CHECK-NEXT: [[MUL:%.*]] = select i1 [[C]], i64 4032, i64 0
191165; CHECK-NEXT: ret i64 [[MUL]]
192166;
193167 %sel = select i1 %c , i64 64 , i64 0
@@ -200,9 +174,8 @@ define i64 @multiuse_select(i1 %c) {
200174define i64 @select_non_const_sides (i1 %c , i64 %arg1 , i64 %arg2 ) {
201175; CHECK-LABEL: define i64 @select_non_const_sides
202176; CHECK-SAME: (i1 [[C:%.*]], i64 [[ARG1:%.*]], i64 [[ARG2:%.*]]) {
203- ; CHECK-NEXT: [[EXT_NEG:%.*]] = sext i1 [[C]] to i64
204- ; CHECK-NEXT: [[SEL:%.*]] = select i1 [[C]], i64 [[ARG1]], i64 [[ARG2]]
205- ; CHECK-NEXT: [[SUB:%.*]] = add i64 [[SEL]], [[EXT_NEG]]
177+ ; CHECK-NEXT: [[TMP1:%.*]] = add i64 [[ARG1]], -1
178+ ; CHECK-NEXT: [[SUB:%.*]] = select i1 [[C]], i64 [[TMP1]], i64 [[ARG2]]
206179; CHECK-NEXT: ret i64 [[SUB]]
207180;
208181 %ext = zext i1 %c to i64
@@ -214,9 +187,9 @@ define i64 @select_non_const_sides(i1 %c, i64 %arg1, i64 %arg2) {
214187define i6 @sub_select_sext_op_swapped_non_const_args (i1 %c , i6 %argT , i6 %argF ) {
215188; CHECK-LABEL: define i6 @sub_select_sext_op_swapped_non_const_args
216189; CHECK-SAME: (i1 [[C:%.*]], i6 [[ARGT:%.*]], i6 [[ARGF:%.*]]) {
217- ; CHECK-NEXT : [[SEL :%.*]] = select i1 [[C]], i6 [[ARGT]], i6 [[ARGF]]
218- ; CHECK-NEXT : [[EXT :%.*]] = sext i1 [[C]] to i6
219- ; CHECK-NEXT: [[SUB:%.*]] = sub i6 [[EXT ]], [[SEL ]]
190+ ; CHECK-DAG : [[TMP1 :%.*]] = xor i6 [[ARGT]], -1
191+ ; CHECK-DAG : [[TMP2 :%.*]] = sub i6 0, [[ARGF]]
192+ ; CHECK-NEXT: [[SUB:%.*]] = select i1 [[C]], i6 [[TMP1 ]], i6 [[TMP2 ]]
220193; CHECK-NEXT: ret i6 [[SUB]]
221194;
222195 %sel = select i1 %c , i6 %argT , i6 %argF
@@ -228,9 +201,9 @@ define i6 @sub_select_sext_op_swapped_non_const_args(i1 %c, i6 %argT, i6 %argF)
228201define i6 @sub_select_zext_op_swapped_non_const_args (i1 %c , i6 %argT , i6 %argF ) {
229202; CHECK-LABEL: define i6 @sub_select_zext_op_swapped_non_const_args
230203; CHECK-SAME: (i1 [[C:%.*]], i6 [[ARGT:%.*]], i6 [[ARGF:%.*]]) {
231- ; CHECK-NEXT : [[SEL :%.*]] = select i1 [[C]], i6 [[ARGT]], i6 [[ARGF ]]
232- ; CHECK-NEXT : [[EXT :%.*]] = zext i1 [[C]] to i6
233- ; CHECK-NEXT: [[SUB:%.*]] = sub i6 [[EXT ]], [[SEL ]]
204+ ; CHECK-DAG : [[TMP1 :%.*]] = sub i6 1, [[ARGT ]]
205+ ; CHECK-DAG : [[TMP2 :%.*]] = sub i6 0, [[ARGF]]
206+ ; CHECK-NEXT: [[SUB:%.*]] = select i1 [[C]], i6 [[TMP1 ]], i6 [[TMP2 ]]
234207; CHECK-NEXT: ret i6 [[SUB]]
235208;
236209 %sel = select i1 %c , i6 %argT , i6 %argF
0 commit comments