@@ -1802,22 +1802,17 @@ define i1 @test4(i32 %a) {
1802
1802
ret i1 %c
1803
1803
}
1804
1804
1805
- define { i32 , i1 } @test4multiuse (i32 %a ) {
1806
- ; CHECK-LABEL: @test4multiuse(
1807
- ; CHECK-NEXT: [[B:%.*]] = add nsw i32 [[A:%.*]], -2147483644
1808
- ; CHECK-NEXT: [[C:%.*]] = icmp slt i32 [[A]], 2147483640
1809
- ; CHECK-NEXT: [[TMP:%.*]] = insertvalue { i32, i1 } undef, i32 [[B]], 0
1810
- ; CHECK-NEXT: [[RES:%.*]] = insertvalue { i32, i1 } [[TMP]], i1 [[C]], 1
1811
- ; CHECK-NEXT: ret { i32, i1 } [[RES]]
1805
+ define {
1806
+ i32 , i1 } @test4multiuse (i32 %a ) {
1812
1807
;
1813
1808
1814
- %b = add nsw i32 %a , -2147483644
1815
- %c = icmp slt i32 %b , -4
1809
+ %b = add nsw i32 %a , -2147483644
1810
+ %c = icmp slt i32 %b , -4
1816
1811
1817
- %tmp = insertvalue { i32 , i1 } undef , i32 %b , 0
1818
- %res = insertvalue { i32 , i1 } %tmp , i1 %c , 1
1812
+ %tmp = insertvalue { i32 , i1 } undef , i32 %b , 0
1813
+ %res = insertvalue { i32 , i1 } %tmp , i1 %c , 1
1819
1814
1820
- ret { i32 , i1 } %res
1815
+ ret { i32 , i1 } %res
1821
1816
}
1822
1817
1823
1818
define <2 x i1 > @test4vec (<2 x i32 > %a ) {
@@ -2857,7 +2852,7 @@ define i1 @icmp_add_add_C_comm2(i32 %X, i32 %b) {
2857
2852
; CHECK-NEXT: [[CMP:%.*]] = icmp ugt i32 [[A]], [[TMP1]]
2858
2853
; CHECK-NEXT: ret i1 [[CMP]]
2859
2854
;
2860
- %a = udiv i32 42 , %X ; thwart complexity-based canonicalization
2855
+ %a = udiv i32 42 , %X ; thwart complexity-based canonicalization
2861
2856
%add1 = add i32 %a , %b
2862
2857
%add2 = add i32 %add1 , -1
2863
2858
%cmp = icmp ugt i32 %a , %add2
@@ -2871,7 +2866,7 @@ define i1 @icmp_add_add_C_comm2_pred(i32 %X, i32 %b) {
2871
2866
; CHECK-NEXT: [[CMP:%.*]] = icmp ule i32 [[A]], [[TMP1]]
2872
2867
; CHECK-NEXT: ret i1 [[CMP]]
2873
2868
;
2874
- %a = udiv i32 42 , %X ; thwart complexity-based canonicalization
2869
+ %a = udiv i32 42 , %X ; thwart complexity-based canonicalization
2875
2870
%add1 = add i32 %a , %b
2876
2871
%add2 = add i32 %add1 , -1
2877
2872
%cmp = icmp ule i32 %a , %add2
@@ -2886,7 +2881,7 @@ define i1 @icmp_add_add_C_comm2_wrong_pred(i32 %X, i32 %b) {
2886
2881
; CHECK-NEXT: [[CMP:%.*]] = icmp ult i32 [[A]], [[ADD2]]
2887
2882
; CHECK-NEXT: ret i1 [[CMP]]
2888
2883
;
2889
- %a = udiv i32 42 , %X ; thwart complexity-based canonicalization
2884
+ %a = udiv i32 42 , %X ; thwart complexity-based canonicalization
2890
2885
%add1 = add i32 %a , %b
2891
2886
%add2 = add i32 %add1 , -1
2892
2887
%cmp = icmp ult i32 %a , %add2
@@ -2900,7 +2895,7 @@ define i1 @icmp_add_add_C_comm3(i32 %X, i32 %b) {
2900
2895
; CHECK-NEXT: [[CMP:%.*]] = icmp ugt i32 [[A]], [[TMP1]]
2901
2896
; CHECK-NEXT: ret i1 [[CMP]]
2902
2897
;
2903
- %a = udiv i32 42 , %X ; thwart complexity-based canonicalization
2898
+ %a = udiv i32 42 , %X ; thwart complexity-based canonicalization
2904
2899
%add1 = add i32 %b , %a
2905
2900
%add2 = add i32 %add1 , -1
2906
2901
%cmp = icmp ugt i32 %a , %add2
@@ -3003,4 +2998,28 @@ define i1 @icmp_dec_notnonzero(i8 %x) {
3003
2998
ret i1 %c
3004
2999
}
3005
3000
3001
+ define i1 @icmp_addnuw_nonzero (i8 %x , i8 %y ) {
3002
+ ; CHECK-LABEL: @icmp_addnuw_nonzero(
3003
+ ; CHECK-NEXT: [[I:%.*]] = sub i8 0, [[Y:%.*]]
3004
+ ; CHECK-NEXT: [[C:%.*]] = icmp eq i8 [[I]], [[X:%.*]]
3005
+ ; CHECK-NEXT: ret i1 [[C]]
3006
+ ;
3007
+ %i = add nuw i8 %x , %y
3008
+ %c = icmp eq i8 %i , 0
3009
+ ret i1 %c
3010
+ }
3011
+
3012
+ define i1 @icmp_addnuw_nonzero_fail_multiuse (i32 %x , i32 %y ) {
3013
+ ; CHECK-LABEL: @icmp_addnuw_nonzero_fail_multiuse(
3014
+ ; CHECK-NEXT: [[I:%.*]] = add nuw i32 [[X:%.*]], [[Y:%.*]]
3015
+ ; CHECK-NEXT: [[C:%.*]] = icmp eq i32 [[I]], 0
3016
+ ; CHECK-NEXT: call void @use(i32 [[I]])
3017
+ ; CHECK-NEXT: ret i1 [[C]]
3018
+ ;
3019
+ %i = add nuw i32 %x , %y
3020
+ %c = icmp eq i32 %i , 0
3021
+ call void @use (i32 %i )
3022
+ ret i1 %c
3023
+ }
3024
+
3006
3025
declare void @llvm.assume (i1 )
0 commit comments