4
4
declare void @use (i32 )
5
5
define i1 @cmpeq_xor_cst1 (i32 %a , i32 %b ) {
6
6
; CHECK-LABEL: @cmpeq_xor_cst1(
7
- ; CHECK-NEXT: [[C :%.*]] = xor i32 [[A:%.*]], 10
8
- ; CHECK-NEXT: [[CMP:%.*]] = icmp eq i32 [[C ]], [[B:%.*]]
7
+ ; CHECK-NEXT: [[TMP1 :%.*]] = xor i32 [[A:%.*]], [[B:%.*]]
8
+ ; CHECK-NEXT: [[CMP:%.*]] = icmp eq i32 [[TMP1 ]], 10
9
9
; CHECK-NEXT: ret i1 [[CMP]]
10
10
;
11
11
%c = xor i32 %a , 10
@@ -37,8 +37,8 @@ define i1 @cmpeq_xor_cst3(i32 %a, i32 %b) {
37
37
38
38
define i1 @cmpne_xor_cst1 (i32 %a , i32 %b ) {
39
39
; CHECK-LABEL: @cmpne_xor_cst1(
40
- ; CHECK-NEXT: [[C :%.*]] = xor i32 [[A:%.*]], 10
41
- ; CHECK-NEXT: [[CMP:%.*]] = icmp ne i32 [[C ]], [[B:%.*]]
40
+ ; CHECK-NEXT: [[TMP1 :%.*]] = xor i32 [[A:%.*]], [[B:%.*]]
41
+ ; CHECK-NEXT: [[CMP:%.*]] = icmp ne i32 [[TMP1 ]], 10
42
42
; CHECK-NEXT: ret i1 [[CMP]]
43
43
;
44
44
%c = xor i32 %a , 10
@@ -83,19 +83,21 @@ define i1 @cmpeq_xor_cst1_multiuse(i32 %a, i32 %b) {
83
83
84
84
define i1 @cmpeq_xor_cst1_commuted (i32 %a , i32 %b ) {
85
85
; CHECK-LABEL: @cmpeq_xor_cst1_commuted(
86
- ; CHECK-NEXT: [[C:%.*]] = xor i32 [[A:%.*]], 10
87
- ; CHECK-NEXT: [[CMP:%.*]] = icmp eq i32 [[C]], [[B:%.*]]
86
+ ; CHECK-NEXT: [[B2:%.*]] = mul i32 [[B:%.*]], [[B]]
87
+ ; CHECK-NEXT: [[TMP1:%.*]] = xor i32 [[B2]], [[A:%.*]]
88
+ ; CHECK-NEXT: [[CMP:%.*]] = icmp eq i32 [[TMP1]], 10
88
89
; CHECK-NEXT: ret i1 [[CMP]]
89
90
;
91
+ %b2 = mul i32 %b , %b ; thwart complexity-based canonicalization
90
92
%c = xor i32 %a , 10
91
- %cmp = icmp eq i32 %b , %c
93
+ %cmp = icmp eq i32 %b2 , %c
92
94
ret i1 %cmp
93
95
}
94
96
95
97
define <2 x i1 > @cmpeq_xor_cst1_vec (<2 x i32 > %a , <2 x i32 > %b ) {
96
98
; CHECK-LABEL: @cmpeq_xor_cst1_vec(
97
- ; CHECK-NEXT: [[C :%.*]] = xor <2 x i32> [[A:%.*]], <i32 10, i32 11>
98
- ; CHECK-NEXT: [[CMP:%.*]] = icmp eq <2 x i32> [[C ]], [[B:%.*]]
99
+ ; CHECK-NEXT: [[TMP1 :%.*]] = xor <2 x i32> [[A:%.*]], [[B:%.*]]
100
+ ; CHECK-NEXT: [[CMP:%.*]] = icmp eq <2 x i32> [[TMP1 ]], <i32 10, i32 11>
99
101
; CHECK-NEXT: ret <2 x i1> [[CMP]]
100
102
;
101
103
%c = xor <2 x i32 > %a , <i32 10 , i32 11 >
@@ -106,10 +108,8 @@ define <2 x i1> @cmpeq_xor_cst1_vec(<2 x i32> %a, <2 x i32> %b) {
106
108
; tests from PR65968
107
109
define i1 @foo1 (i32 %x , i32 %y ) {
108
110
; CHECK-LABEL: @foo1(
109
- ; CHECK-NEXT: [[AND:%.*]] = and i32 [[X:%.*]], -2147483648
110
- ; CHECK-NEXT: [[NEG:%.*]] = and i32 [[Y:%.*]], -2147483648
111
- ; CHECK-NEXT: [[AND1:%.*]] = xor i32 [[NEG]], -2147483648
112
- ; CHECK-NEXT: [[CMP:%.*]] = icmp eq i32 [[AND]], [[AND1]]
111
+ ; CHECK-NEXT: [[NEG1:%.*]] = xor i32 [[Y:%.*]], [[X:%.*]]
112
+ ; CHECK-NEXT: [[CMP:%.*]] = icmp slt i32 [[NEG1]], 0
113
113
; CHECK-NEXT: ret i1 [[CMP]]
114
114
;
115
115
%and = and i32 %x , -2147483648
@@ -121,10 +121,8 @@ define i1 @foo1(i32 %x, i32 %y) {
121
121
122
122
define i1 @foo2 (i32 %x , i32 %y ) {
123
123
; CHECK-LABEL: @foo2(
124
- ; CHECK-NEXT: [[AND:%.*]] = and i32 [[X:%.*]], -2147483648
125
- ; CHECK-NEXT: [[NEG:%.*]] = and i32 [[Y:%.*]], -2147483648
126
- ; CHECK-NEXT: [[AND1:%.*]] = xor i32 [[NEG]], -2147483648
127
- ; CHECK-NEXT: [[CMP:%.*]] = icmp eq i32 [[AND]], [[AND1]]
124
+ ; CHECK-NEXT: [[NEG1:%.*]] = xor i32 [[Y:%.*]], [[X:%.*]]
125
+ ; CHECK-NEXT: [[CMP:%.*]] = icmp slt i32 [[NEG1]], 0
128
126
; CHECK-NEXT: ret i1 [[CMP]]
129
127
;
130
128
%and = and i32 %x , -2147483648
0 commit comments