Skip to content

Commit f0e8dd6

Browse files
committed
[InstCombine] Optimize TrueVal through knownbits from cond in selectInst
There are two type of change with this patch. When the Cond of SelectInst is ICmpInst. first is a special case where optimizations can be made. For example, in the case of (icmp eq (xor x, y) -1), it is impossible to estimate the bits of x and y, but the relationship between the bits of x and y is known. We define this as NoCommonBits | AllCommonBits. if (and x, y) is a trueval with this cond, then x and y are in NoCommonBits state, so (and x, y) is zero. second is that if the cond allows us to estimate the KnownBits of X or Y, then if TrueVal is a BinOp consisting of X or Y, we can optimize it. For example, if (icmp eq (or x, y) 0), then both x and y have KnownBits that can be estimated to be 0. Therefore, something like (select (icmp eq (or x, y) 0), (xor x, y), (or x, y)) can be optimized to (or x, y).
1 parent fc8ce0e commit f0e8dd6

File tree

2 files changed

+25
-62
lines changed

2 files changed

+25
-62
lines changed

llvm/test/Transforms/InstCombine/select-of-bittest.ll

Lines changed: 12 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -7,9 +7,8 @@
77
define i8 @src_and_bit(i8 %x, i8 %y) {
88
; CHECK-LABEL: @src_and_bit(
99
; CHECK-NEXT: [[AND:%.*]] = and i8 [[X:%.*]], 3
10-
; CHECK-NEXT: [[AND1:%.*]] = and i8 [[X]], 2
1110
; CHECK-NEXT: [[CMP:%.*]] = icmp eq i8 [[AND]], 2
12-
; CHECK-NEXT: [[COND:%.*]] = select i1 [[CMP]], i8 [[AND1]], i8 1
11+
; CHECK-NEXT: [[COND:%.*]] = select i1 [[CMP]], i8 2, i8 1
1312
; CHECK-NEXT: ret i8 [[COND]]
1413
;
1514
%and = and i8 %x, 3
@@ -22,9 +21,8 @@ define i8 @src_and_bit(i8 %x, i8 %y) {
2221
define <2 x i8> @src_and_bit_vec(<2 x i8> %x, <2 x i8> %y) {
2322
; CHECK-LABEL: @src_and_bit_vec(
2423
; CHECK-NEXT: [[AND:%.*]] = and <2 x i8> [[X:%.*]], <i8 3, i8 3>
25-
; CHECK-NEXT: [[AND1:%.*]] = and <2 x i8> [[X]], <i8 2, i8 2>
2624
; CHECK-NEXT: [[CMP:%.*]] = icmp eq <2 x i8> [[AND]], <i8 2, i8 2>
27-
; CHECK-NEXT: [[COND:%.*]] = select <2 x i1> [[CMP]], <2 x i8> [[AND1]], <2 x i8> <i8 1, i8 1>
25+
; CHECK-NEXT: [[COND:%.*]] = select <2 x i1> [[CMP]], <2 x i8> <i8 2, i8 2>, <2 x i8> <i8 1, i8 1>
2826
; CHECK-NEXT: ret <2 x i8> [[COND]]
2927
;
3028
%and = and <2 x i8> %x, <i8 3, i8 3>
@@ -37,9 +35,8 @@ define <2 x i8> @src_and_bit_vec(<2 x i8> %x, <2 x i8> %y) {
3735
define <2 x i8> @src_and_bit_vec_poison(<2 x i8> %x, <2 x i8> %y) {
3836
; CHECK-LABEL: @src_and_bit_vec_poison(
3937
; CHECK-NEXT: [[AND:%.*]] = and <2 x i8> [[X:%.*]], <i8 poison, i8 3>
40-
; CHECK-NEXT: [[AND1:%.*]] = and <2 x i8> [[X]], <i8 poison, i8 2>
4138
; CHECK-NEXT: [[CMP:%.*]] = icmp eq <2 x i8> [[AND]], <i8 2, i8 2>
42-
; CHECK-NEXT: [[COND:%.*]] = select <2 x i1> [[CMP]], <2 x i8> [[AND1]], <2 x i8> <i8 1, i8 1>
39+
; CHECK-NEXT: [[COND:%.*]] = select <2 x i1> [[CMP]], <2 x i8> <i8 2, i8 2>, <2 x i8> <i8 1, i8 1>
4340
; CHECK-NEXT: ret <2 x i8> [[COND]]
4441
;
4542
%and = and <2 x i8> %x, <i8 poison, i8 3>
@@ -52,9 +49,8 @@ define <2 x i8> @src_and_bit_vec_poison(<2 x i8> %x, <2 x i8> %y) {
5249
define <2 x i8> @src_and_bit_vec_poison2(<2 x i8> %x, <2 x i8> %y) {
5350
; CHECK-LABEL: @src_and_bit_vec_poison2(
5451
; CHECK-NEXT: [[AND:%.*]] = and <2 x i8> [[X:%.*]], <i8 poison, i8 3>
55-
; CHECK-NEXT: [[AND1:%.*]] = and <2 x i8> [[X]], <i8 poison, i8 2>
5652
; CHECK-NEXT: [[CMP:%.*]] = icmp eq <2 x i8> [[AND]], <i8 2, i8 2>
57-
; CHECK-NEXT: [[COND:%.*]] = select <2 x i1> [[CMP]], <2 x i8> [[AND1]], <2 x i8> <i8 1, i8 1>
53+
; CHECK-NEXT: [[COND:%.*]] = select <2 x i1> [[CMP]], <2 x i8> <i8 2, i8 2>, <2 x i8> <i8 1, i8 1>
5854
; CHECK-NEXT: ret <2 x i8> [[COND]]
5955
;
6056
%and = and <2 x i8> %x, <i8 poison, i8 3>
@@ -68,13 +64,11 @@ define <2 x i8> @src_and_bit_vec_poison2(<2 x i8> %x, <2 x i8> %y) {
6864
; ====================== OR =======================
6965
define i8 @src_or_bit(i8 %x, i8 %y, i8 %z) {
7066
; CHECK-LABEL: @src_or_bit(
71-
; CHECK-NEXT: [[AND:%.*]] = and i8 [[Z:%.*]], 3
7267
; CHECK-NEXT: [[AND1:%.*]] = shl i8 [[Y:%.*]], 2
7368
; CHECK-NEXT: [[SHL:%.*]] = and i8 [[AND1]], 12
7469
; CHECK-NEXT: [[OR:%.*]] = or i8 [[SHL]], [[X:%.*]]
7570
; CHECK-NEXT: [[CMP:%.*]] = icmp eq i8 [[OR]], 3
76-
; CHECK-NEXT: [[OR2:%.*]] = or i8 [[AND]], [[X]]
77-
; CHECK-NEXT: [[COND:%.*]] = select i1 [[CMP]], i8 [[OR2]], i8 1
71+
; CHECK-NEXT: [[COND:%.*]] = select i1 [[CMP]], i8 3, i8 1
7872
; CHECK-NEXT: ret i8 [[COND]]
7973
;
8074
%and = and i8 %z, 3
@@ -88,13 +82,11 @@ define i8 @src_or_bit(i8 %x, i8 %y, i8 %z) {
8882
}
8983
define <2 x i8> @src_or_bit_vec(<2 x i8> %x, <2 x i8> %y, <2 x i8> %z) {
9084
; CHECK-LABEL: @src_or_bit_vec(
91-
; CHECK-NEXT: [[AND:%.*]] = and <2 x i8> [[Z:%.*]], <i8 3, i8 3>
9285
; CHECK-NEXT: [[AND1:%.*]] = shl <2 x i8> [[Y:%.*]], <i8 2, i8 2>
9386
; CHECK-NEXT: [[SHL:%.*]] = and <2 x i8> [[AND1]], <i8 12, i8 12>
9487
; CHECK-NEXT: [[OR:%.*]] = or <2 x i8> [[SHL]], [[X:%.*]]
9588
; CHECK-NEXT: [[CMP:%.*]] = icmp eq <2 x i8> [[OR]], <i8 3, i8 3>
96-
; CHECK-NEXT: [[OR2:%.*]] = or <2 x i8> [[AND]], [[X]]
97-
; CHECK-NEXT: [[COND:%.*]] = select <2 x i1> [[CMP]], <2 x i8> [[OR2]], <2 x i8> <i8 1, i8 1>
89+
; CHECK-NEXT: [[COND:%.*]] = select <2 x i1> [[CMP]], <2 x i8> <i8 3, i8 3>, <2 x i8> <i8 1, i8 1>
9890
; CHECK-NEXT: ret <2 x i8> [[COND]]
9991
;
10092
%and = and <2 x i8> %z, <i8 3, i8 3>
@@ -108,13 +100,11 @@ define <2 x i8> @src_or_bit_vec(<2 x i8> %x, <2 x i8> %y, <2 x i8> %z) {
108100
}
109101
define <2 x i8> @src_or_bit_vec_poison(<2 x i8> %x, <2 x i8> %y, <2 x i8> %z) {
110102
; CHECK-LABEL: @src_or_bit_vec_poison(
111-
; CHECK-NEXT: [[AND:%.*]] = and <2 x i8> [[Z:%.*]], <i8 3, i8 poison>
112103
; CHECK-NEXT: [[AND1:%.*]] = shl <2 x i8> [[Y:%.*]], <i8 2, i8 poison>
113104
; CHECK-NEXT: [[SHL:%.*]] = and <2 x i8> [[AND1]], <i8 12, i8 poison>
114105
; CHECK-NEXT: [[OR:%.*]] = or <2 x i8> [[SHL]], [[X:%.*]]
115106
; CHECK-NEXT: [[CMP:%.*]] = icmp eq <2 x i8> [[OR]], <i8 3, i8 3>
116-
; CHECK-NEXT: [[OR2:%.*]] = or <2 x i8> [[AND]], [[X]]
117-
; CHECK-NEXT: [[COND:%.*]] = select <2 x i1> [[CMP]], <2 x i8> [[OR2]], <2 x i8> <i8 1, i8 1>
107+
; CHECK-NEXT: [[COND:%.*]] = select <2 x i1> [[CMP]], <2 x i8> <i8 3, i8 3>, <2 x i8> <i8 1, i8 1>
118108
; CHECK-NEXT: ret <2 x i8> [[COND]]
119109
;
120110
%and = and <2 x i8> %z, <i8 3, i8 poison>
@@ -128,13 +118,11 @@ define <2 x i8> @src_or_bit_vec_poison(<2 x i8> %x, <2 x i8> %y, <2 x i8> %z) {
128118
}
129119
define <2 x i8> @src_or_bit_vec_poison2(<2 x i8> %x, <2 x i8> %y, <2 x i8> %z) {
130120
; CHECK-LABEL: @src_or_bit_vec_poison2(
131-
; CHECK-NEXT: [[AND:%.*]] = and <2 x i8> [[Z:%.*]], <i8 poison, i8 3>
132121
; CHECK-NEXT: [[AND1:%.*]] = shl <2 x i8> [[Y:%.*]], <i8 poison, i8 2>
133122
; CHECK-NEXT: [[SHL:%.*]] = and <2 x i8> [[AND1]], <i8 poison, i8 12>
134123
; CHECK-NEXT: [[OR:%.*]] = or <2 x i8> [[SHL]], [[X:%.*]]
135124
; CHECK-NEXT: [[CMP:%.*]] = icmp eq <2 x i8> [[OR]], <i8 3, i8 3>
136-
; CHECK-NEXT: [[OR2:%.*]] = or <2 x i8> [[AND]], [[X]]
137-
; CHECK-NEXT: [[COND:%.*]] = select <2 x i1> [[CMP]], <2 x i8> [[OR2]], <2 x i8> <i8 1, i8 1>
125+
; CHECK-NEXT: [[COND:%.*]] = select <2 x i1> [[CMP]], <2 x i8> <i8 3, i8 3>, <2 x i8> <i8 1, i8 1>
138126
; CHECK-NEXT: ret <2 x i8> [[COND]]
139127
;
140128
%and = and <2 x i8> %z, <i8 poison, i8 3>
@@ -152,8 +140,7 @@ define i8 @src_xor_bit(i8 %x, i8 %y) {
152140
; CHECK-NEXT: [[AND:%.*]] = and i8 [[Y:%.*]], 12
153141
; CHECK-NEXT: [[XOR:%.*]] = xor i8 [[AND]], [[X:%.*]]
154142
; CHECK-NEXT: [[CMP:%.*]] = icmp eq i8 [[XOR]], 3
155-
; CHECK-NEXT: [[AND1:%.*]] = and i8 [[X]], 3
156-
; CHECK-NEXT: [[COND:%.*]] = select i1 [[CMP]], i8 [[AND1]], i8 1
143+
; CHECK-NEXT: [[COND:%.*]] = select i1 [[CMP]], i8 3, i8 1
157144
; CHECK-NEXT: ret i8 [[COND]]
158145
;
159146
%and = and i8 %y, 12
@@ -168,8 +155,7 @@ define <2 x i8> @src_xor_bit_vec(<2 x i8> %x, <2 x i8> %y) {
168155
; CHECK-NEXT: [[AND:%.*]] = and <2 x i8> [[Y:%.*]], <i8 12, i8 12>
169156
; CHECK-NEXT: [[XOR:%.*]] = xor <2 x i8> [[AND]], [[X:%.*]]
170157
; CHECK-NEXT: [[CMP:%.*]] = icmp eq <2 x i8> [[XOR]], <i8 3, i8 3>
171-
; CHECK-NEXT: [[AND1:%.*]] = and <2 x i8> [[X]], <i8 3, i8 3>
172-
; CHECK-NEXT: [[COND:%.*]] = select <2 x i1> [[CMP]], <2 x i8> [[AND1]], <2 x i8> <i8 1, i8 1>
158+
; CHECK-NEXT: [[COND:%.*]] = select <2 x i1> [[CMP]], <2 x i8> <i8 3, i8 3>, <2 x i8> <i8 1, i8 1>
173159
; CHECK-NEXT: ret <2 x i8> [[COND]]
174160
;
175161
%and = and <2 x i8> %y, <i8 12, i8 12>
@@ -184,8 +170,7 @@ define <2 x i8> @src_xor_bit_vec_poison(<2 x i8> %x, <2 x i8> %y) {
184170
; CHECK-NEXT: [[AND:%.*]] = and <2 x i8> [[Y:%.*]], <i8 poison, i8 12>
185171
; CHECK-NEXT: [[XOR:%.*]] = xor <2 x i8> [[AND]], [[X:%.*]]
186172
; CHECK-NEXT: [[CMP:%.*]] = icmp eq <2 x i8> [[XOR]], <i8 3, i8 3>
187-
; CHECK-NEXT: [[AND1:%.*]] = and <2 x i8> [[X]], <i8 poison, i8 3>
188-
; CHECK-NEXT: [[COND:%.*]] = select <2 x i1> [[CMP]], <2 x i8> [[AND1]], <2 x i8> <i8 1, i8 1>
173+
; CHECK-NEXT: [[COND:%.*]] = select <2 x i1> [[CMP]], <2 x i8> <i8 3, i8 3>, <2 x i8> <i8 1, i8 1>
189174
; CHECK-NEXT: ret <2 x i8> [[COND]]
190175
;
191176
%and = and <2 x i8> %y, <i8 poison, i8 12>
@@ -200,8 +185,7 @@ define <2 x i8> @src_xor_bit_vec_poison2(<2 x i8> %x, <2 x i8> %y) {
200185
; CHECK-NEXT: [[AND:%.*]] = and <2 x i8> [[Y:%.*]], <i8 poison, i8 12>
201186
; CHECK-NEXT: [[XOR:%.*]] = xor <2 x i8> [[AND]], [[X:%.*]]
202187
; CHECK-NEXT: [[CMP:%.*]] = icmp eq <2 x i8> [[XOR]], <i8 3, i8 3>
203-
; CHECK-NEXT: [[AND1:%.*]] = and <2 x i8> [[X]], <i8 3, i8 3>
204-
; CHECK-NEXT: [[COND:%.*]] = select <2 x i1> [[CMP]], <2 x i8> [[AND1]], <2 x i8> <i8 1, i8 1>
188+
; CHECK-NEXT: [[COND:%.*]] = select <2 x i1> [[CMP]], <2 x i8> <i8 3, i8 3>, <2 x i8> <i8 1, i8 1>
205189
; CHECK-NEXT: ret <2 x i8> [[COND]]
206190
;
207191
%and = and <2 x i8> %y, <i8 poison, i8 12>

llvm/test/Transforms/InstCombine/select.ll

Lines changed: 13 additions & 34 deletions
Original file line numberDiff line numberDiff line change
@@ -3701,12 +3701,8 @@ exit:
37013701
define i32 @src_and_eq_0_or_xor(i32 %x, i32 %y) {
37023702
; CHECK-LABEL: @src_and_eq_0_or_xor(
37033703
; CHECK-NEXT: entry:
3704-
; CHECK-NEXT: [[AND:%.*]] = and i32 [[Y:%.*]], [[X:%.*]]
3705-
; CHECK-NEXT: [[CMP:%.*]] = icmp eq i32 [[AND]], 0
3706-
; CHECK-NEXT: [[OR:%.*]] = or i32 [[Y]], [[X]]
3707-
; CHECK-NEXT: [[XOR:%.*]] = xor i32 [[Y]], [[X]]
3708-
; CHECK-NEXT: [[COND:%.*]] = select i1 [[CMP]], i32 [[OR]], i32 [[XOR]]
3709-
; CHECK-NEXT: ret i32 [[COND]]
3704+
; CHECK-NEXT: [[XOR:%.*]] = xor i32 [[Y:%.*]], [[X:%.*]]
3705+
; CHECK-NEXT: ret i32 [[XOR]]
37103706
;
37113707
entry:
37123708
%and = and i32 %y, %x
@@ -3721,12 +3717,8 @@ entry:
37213717
define i32 @src_and_eq_0_xor_or(i32 %x, i32 %y) {
37223718
; CHECK-LABEL: @src_and_eq_0_xor_or(
37233719
; CHECK-NEXT: entry:
3724-
; CHECK-NEXT: [[AND:%.*]] = and i32 [[Y:%.*]], [[X:%.*]]
3725-
; CHECK-NEXT: [[CMP:%.*]] = icmp eq i32 [[AND]], 0
3726-
; CHECK-NEXT: [[XOR:%.*]] = xor i32 [[Y]], [[X]]
3727-
; CHECK-NEXT: [[OR:%.*]] = or i32 [[Y]], [[X]]
3728-
; CHECK-NEXT: [[COND:%.*]] = select i1 [[CMP]], i32 [[XOR]], i32 [[OR]]
3729-
; CHECK-NEXT: ret i32 [[COND]]
3720+
; CHECK-NEXT: [[OR:%.*]] = or i32 [[Y:%.*]], [[X:%.*]]
3721+
; CHECK-NEXT: ret i32 [[OR]]
37303722
;
37313723
entry:
37323724
%and = and i32 %y, %x
@@ -3743,9 +3735,8 @@ define i32 @src_and_eq_neg1_or_xor(i32 %x, i32 %y) {
37433735
; CHECK-NEXT: entry:
37443736
; CHECK-NEXT: [[AND:%.*]] = and i32 [[Y:%.*]], [[X:%.*]]
37453737
; CHECK-NEXT: [[CMP:%.*]] = icmp eq i32 [[AND]], -1
3746-
; CHECK-NEXT: [[OR:%.*]] = or i32 [[Y]], [[X]]
37473738
; CHECK-NEXT: [[XOR:%.*]] = xor i32 [[Y]], [[X]]
3748-
; CHECK-NEXT: [[COND:%.*]] = select i1 [[CMP]], i32 [[OR]], i32 [[XOR]]
3739+
; CHECK-NEXT: [[COND:%.*]] = select i1 [[CMP]], i32 -1, i32 [[XOR]]
37493740
; CHECK-NEXT: ret i32 [[COND]]
37503741
;
37513742
entry:
@@ -3763,9 +3754,8 @@ define i32 @src_and_eq_neg1_xor_or(i32 %x, i32 %y) {
37633754
; CHECK-NEXT: entry:
37643755
; CHECK-NEXT: [[AND:%.*]] = and i32 [[Y:%.*]], [[X:%.*]]
37653756
; CHECK-NEXT: [[CMP:%.*]] = icmp eq i32 [[AND]], -1
3766-
; CHECK-NEXT: [[XOR:%.*]] = xor i32 [[Y]], [[X]]
37673757
; CHECK-NEXT: [[OR:%.*]] = or i32 [[Y]], [[X]]
3768-
; CHECK-NEXT: [[COND:%.*]] = select i1 [[CMP]], i32 [[XOR]], i32 [[OR]]
3758+
; CHECK-NEXT: [[COND:%.*]] = select i1 [[CMP]], i32 0, i32 [[OR]]
37693759
; CHECK-NEXT: ret i32 [[COND]]
37703760
;
37713761
entry:
@@ -3878,9 +3868,8 @@ define i32 @src_or_eq_0_and_xor(i32 %x, i32 %y) {
38783868
; CHECK-NEXT: entry:
38793869
; CHECK-NEXT: [[OR:%.*]] = or i32 [[Y:%.*]], [[X:%.*]]
38803870
; CHECK-NEXT: [[CMP:%.*]] = icmp eq i32 [[OR]], 0
3881-
; CHECK-NEXT: [[AND:%.*]] = and i32 [[Y]], [[X]]
38823871
; CHECK-NEXT: [[XOR:%.*]] = xor i32 [[Y]], [[X]]
3883-
; CHECK-NEXT: [[COND:%.*]] = select i1 [[CMP]], i32 [[AND]], i32 [[XOR]]
3872+
; CHECK-NEXT: [[COND:%.*]] = select i1 [[CMP]], i32 0, i32 [[XOR]]
38843873
; CHECK-NEXT: ret i32 [[COND]]
38853874
;
38863875
entry:
@@ -3898,9 +3887,8 @@ define i32 @src_or_eq_0_xor_and(i32 %x, i32 %y) {
38983887
; CHECK-NEXT: entry:
38993888
; CHECK-NEXT: [[OR:%.*]] = or i32 [[Y:%.*]], [[X:%.*]]
39003889
; CHECK-NEXT: [[CMP:%.*]] = icmp eq i32 [[OR]], 0
3901-
; CHECK-NEXT: [[XOR:%.*]] = xor i32 [[Y]], [[X]]
39023890
; CHECK-NEXT: [[AND:%.*]] = and i32 [[Y]], [[X]]
3903-
; CHECK-NEXT: [[COND:%.*]] = select i1 [[CMP]], i32 [[XOR]], i32 [[AND]]
3891+
; CHECK-NEXT: [[COND:%.*]] = select i1 [[CMP]], i32 0, i32 [[AND]]
39043892
; CHECK-NEXT: ret i32 [[COND]]
39053893
;
39063894
entry:
@@ -4301,9 +4289,8 @@ define i32 @src_select_xor_max_negative_int(i32 %x, i32 %y) {
43014289
; CHECK-LABEL: @src_select_xor_max_negative_int(
43024290
; CHECK-NEXT: [[XOR:%.*]] = xor i32 [[X:%.*]], [[Y:%.*]]
43034291
; CHECK-NEXT: [[XOR0:%.*]] = icmp eq i32 [[XOR]], -1
4304-
; CHECK-NEXT: [[AND:%.*]] = and i32 [[X]], [[Y]]
43054292
; CHECK-NEXT: [[OR:%.*]] = or i32 [[X]], [[Y]]
4306-
; CHECK-NEXT: [[COND:%.*]] = select i1 [[XOR0]], i32 [[AND]], i32 [[OR]]
4293+
; CHECK-NEXT: [[COND:%.*]] = select i1 [[XOR0]], i32 0, i32 [[OR]]
43074294
; CHECK-NEXT: ret i32 [[COND]]
43084295
;
43094296
%xor = xor i32 %x, %y
@@ -4410,10 +4397,7 @@ define i32 @src_no_trans_select_or_eq0_or_xor(i32 %x, i32 %y) {
44104397
define i32 @src_no_trans_select_or_eq0_and_or(i32 %x, i32 %y) {
44114398
; CHECK-LABEL: @src_no_trans_select_or_eq0_and_or(
44124399
; CHECK-NEXT: [[OR:%.*]] = or i32 [[X:%.*]], [[Y:%.*]]
4413-
; CHECK-NEXT: [[OR0:%.*]] = icmp eq i32 [[OR]], 0
4414-
; CHECK-NEXT: [[AND:%.*]] = and i32 [[X]], [[Y]]
4415-
; CHECK-NEXT: [[COND:%.*]] = select i1 [[OR0]], i32 [[AND]], i32 [[OR]]
4416-
; CHECK-NEXT: ret i32 [[COND]]
4400+
; CHECK-NEXT: ret i32 [[OR]]
44174401
;
44184402
%or = or i32 %x, %y
44194403
%or0 = icmp eq i32 %or, 0
@@ -4425,10 +4409,7 @@ define i32 @src_no_trans_select_or_eq0_and_or(i32 %x, i32 %y) {
44254409
define i32 @src_no_trans_select_or_eq0_xor_or(i32 %x, i32 %y) {
44264410
; CHECK-LABEL: @src_no_trans_select_or_eq0_xor_or(
44274411
; CHECK-NEXT: [[OR:%.*]] = or i32 [[X:%.*]], [[Y:%.*]]
4428-
; CHECK-NEXT: [[OR0:%.*]] = icmp eq i32 [[OR]], 0
4429-
; CHECK-NEXT: [[XOR:%.*]] = xor i32 [[X]], [[Y]]
4430-
; CHECK-NEXT: [[COND:%.*]] = select i1 [[OR0]], i32 [[XOR]], i32 [[OR]]
4431-
; CHECK-NEXT: ret i32 [[COND]]
4412+
; CHECK-NEXT: ret i32 [[OR]]
44324413
;
44334414
%or = or i32 %x, %y
44344415
%or0 = icmp eq i32 %or, 0
@@ -4484,8 +4465,7 @@ define i32 @src_no_trans_select_xor_eq0_and_xor(i32 %x, i32 %y) {
44844465
; CHECK-LABEL: @src_no_trans_select_xor_eq0_and_xor(
44854466
; CHECK-NEXT: [[XOR:%.*]] = xor i32 [[X:%.*]], [[Y:%.*]]
44864467
; CHECK-NEXT: [[XOR0:%.*]] = icmp eq i32 [[XOR]], 0
4487-
; CHECK-NEXT: [[AND:%.*]] = and i32 [[X]], [[Y]]
4488-
; CHECK-NEXT: [[COND:%.*]] = select i1 [[XOR0]], i32 [[AND]], i32 [[XOR]]
4468+
; CHECK-NEXT: [[COND:%.*]] = select i1 [[XOR0]], i32 [[X]], i32 [[XOR]]
44894469
; CHECK-NEXT: ret i32 [[COND]]
44904470
;
44914471
%xor = xor i32 %x, %y
@@ -4500,8 +4480,7 @@ define i32 @src_no_trans_select_xor_eq0_or_xor(i32 %x, i32 %y) {
45004480
; CHECK-LABEL: @src_no_trans_select_xor_eq0_or_xor(
45014481
; CHECK-NEXT: [[XOR:%.*]] = xor i32 [[X:%.*]], [[Y:%.*]]
45024482
; CHECK-NEXT: [[XOR0:%.*]] = icmp eq i32 [[XOR]], 0
4503-
; CHECK-NEXT: [[OR:%.*]] = or i32 [[X]], [[Y]]
4504-
; CHECK-NEXT: [[COND:%.*]] = select i1 [[XOR0]], i32 [[OR]], i32 [[XOR]]
4483+
; CHECK-NEXT: [[COND:%.*]] = select i1 [[XOR0]], i32 [[X]], i32 [[XOR]]
45054484
; CHECK-NEXT: ret i32 [[COND]]
45064485
;
45074486
%xor = xor i32 %x, %y

0 commit comments

Comments
 (0)