@@ -99,16 +99,54 @@ define i32 @test3(i32 %A) {
9999}
100100
101101; D = B + -A = B - A
102- define i32 @test4 (i32 %A , i32 %B ) {
102+ define i32 @test4 (i32 %A , i32 %BB ) {
103103; 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:%.*]]
105106; CHECK-NEXT: ret i32 [[D]]
106107;
108+ %B = xor i32 %BB , 1 ; thwart complexity-based canonicalization
107109 %C = sub i32 0 , %A
108110 %D = add i32 %B , %C
109111 ret i32 %D
110112}
111113
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+
112150; D = -A + B = B - A
113151define i32 @test5 (i32 %A , i32 %B ) {
114152; CHECK-LABEL: @test5(
0 commit comments