@@ -99,16 +99,54 @@ define i32 @test3(i32 %A) {
99
99
}
100
100
101
101
; D = B + -A = B - A
102
- define i32 @test4 (i32 %A , i32 %B ) {
102
+ define i32 @test4 (i32 %A , i32 %BB ) {
103
103
; CHECK-LABEL: @test4(
104
- ; CHECK-NEXT: [[D:%.*]] = sub i32 [[B:%.*]], [[A:%.*]]
104
+ ; CHECK-NEXT: [[B:%.*]] = xor i32 [[BB:%.*]], 1
105
+ ; CHECK-NEXT: [[D:%.*]] = sub i32 [[B]], [[A:%.*]]
105
106
; CHECK-NEXT: ret i32 [[D]]
106
107
;
108
+ %B = xor i32 %BB , 1 ; thwart complexity-based canonicalization
107
109
%C = sub i32 0 , %A
108
110
%D = add i32 %B , %C
109
111
ret i32 %D
110
112
}
111
113
114
+ define i32 @test4_both_nsw (i32 %A , i32 %BB ) {
115
+ ; CHECK-LABEL: @test4_both_nsw(
116
+ ; CHECK-NEXT: [[B:%.*]] = xor i32 [[BB:%.*]], 1
117
+ ; CHECK-NEXT: [[D:%.*]] = sub i32 [[B]], [[A:%.*]]
118
+ ; CHECK-NEXT: ret i32 [[D]]
119
+ ;
120
+ %B = xor i32 %BB , 1 ; thwart complexity-based canonicalization
121
+ %C = sub nsw i32 0 , %A
122
+ %D = add nsw i32 %B , %C
123
+ ret i32 %D
124
+ }
125
+
126
+ define i32 @test4_neg_nsw (i32 %A , i32 %BB ) {
127
+ ; CHECK-LABEL: @test4_neg_nsw(
128
+ ; CHECK-NEXT: [[B:%.*]] = xor i32 [[BB:%.*]], 1
129
+ ; CHECK-NEXT: [[D:%.*]] = sub i32 [[B]], [[A:%.*]]
130
+ ; CHECK-NEXT: ret i32 [[D]]
131
+ ;
132
+ %B = xor i32 %BB , 1 ; thwart complexity-based canonicalization
133
+ %C = sub nsw i32 0 , %A
134
+ %D = add i32 %B , %C
135
+ ret i32 %D
136
+ }
137
+
138
+ define i32 @test4_add_nsw (i32 %A , i32 %BB ) {
139
+ ; CHECK-LABEL: @test4_add_nsw(
140
+ ; CHECK-NEXT: [[B:%.*]] = xor i32 [[BB:%.*]], 1
141
+ ; CHECK-NEXT: [[D:%.*]] = sub i32 [[B]], [[A:%.*]]
142
+ ; CHECK-NEXT: ret i32 [[D]]
143
+ ;
144
+ %B = xor i32 %BB , 1 ; thwart complexity-based canonicalization
145
+ %C = sub i32 0 , %A
146
+ %D = add nsw i32 %B , %C
147
+ ret i32 %D
148
+ }
149
+
112
150
; D = -A + B = B - A
113
151
define i32 @test5 (i32 %A , i32 %B ) {
114
152
; CHECK-LABEL: @test5(
0 commit comments