@@ -80,7 +80,7 @@ define i32 @test_inbounds_nuw_trunc(ptr %base, i64 %idx) {
80
80
81
81
define i64 @test_inbounds_nuw_swapped (ptr %base , i64 %idx ) {
82
82
; CHECK-LABEL: @test_inbounds_nuw_swapped(
83
- ; CHECK-NEXT: [[P2_IDX_NEG:%.*]] = mul i64 [[IDX:%.*]], -4
83
+ ; CHECK-NEXT: [[P2_IDX_NEG:%.*]] = mul nsw i64 [[IDX:%.*]], -4
84
84
; CHECK-NEXT: ret i64 [[P2_IDX_NEG]]
85
85
;
86
86
%p2 = getelementptr inbounds [0 x i32 ], ptr %base , i64 0 , i64 %idx
@@ -104,7 +104,7 @@ define i64 @test_inbounds1_nuw_swapped(ptr %base, i64 %idx) {
104
104
105
105
define i64 @test_inbounds2_nuw_swapped (ptr %base , i64 %idx ) {
106
106
; CHECK-LABEL: @test_inbounds2_nuw_swapped(
107
- ; CHECK-NEXT: [[P2_IDX_NEG:%.*]] = mul i64 [[IDX:%.*]], -4
107
+ ; CHECK-NEXT: [[P2_IDX_NEG:%.*]] = mul nsw i64 [[IDX:%.*]], -4
108
108
; CHECK-NEXT: ret i64 [[P2_IDX_NEG]]
109
109
;
110
110
%p2 = getelementptr inbounds [0 x i32 ], ptr %base , i64 0 , i64 %idx
@@ -279,8 +279,8 @@ define i16 @test24_as1(ptr addrspace(1) %P, i16 %A) {
279
279
280
280
define i64 @test24a (ptr %P , i64 %A ){
281
281
; CHECK-LABEL: @test24a(
282
- ; CHECK-NEXT: [[DIFF_NEG :%.*]] = sub i64 0, [[A:%.*]]
283
- ; CHECK-NEXT: ret i64 [[DIFF_NEG ]]
282
+ ; CHECK-NEXT: [[GEPDIFF :%.*]] = sub nsw i64 0, [[A:%.*]]
283
+ ; CHECK-NEXT: ret i64 [[GEPDIFF ]]
284
284
;
285
285
%B = getelementptr inbounds i8 , ptr %P , i64 %A
286
286
%C = ptrtoint ptr %B to i64
@@ -291,8 +291,8 @@ define i64 @test24a(ptr %P, i64 %A){
291
291
292
292
define i16 @test24a_as1 (ptr addrspace (1 ) %P , i16 %A ) {
293
293
; CHECK-LABEL: @test24a_as1(
294
- ; CHECK-NEXT: [[DIFF_NEG :%.*]] = sub i16 0, [[A:%.*]]
295
- ; CHECK-NEXT: ret i16 [[DIFF_NEG ]]
294
+ ; CHECK-NEXT: [[GEPDIFF :%.*]] = sub nsw i16 0, [[A:%.*]]
295
+ ; CHECK-NEXT: ret i16 [[GEPDIFF ]]
296
296
;
297
297
%B = getelementptr inbounds i8 , ptr addrspace (1 ) %P , i16 %A
298
298
%C = ptrtoint ptr addrspace (1 ) %B to i16
@@ -863,11 +863,8 @@ _Z3fooPKc.exit:
863
863
864
864
define i64 @multiple_geps_one_chain (ptr %base , i64 %idx , i64 %idx2 ) {
865
865
; CHECK-LABEL: @multiple_geps_one_chain(
866
- ; CHECK-NEXT: [[P2:%.*]] = getelementptr inbounds i32, ptr [[BASE:%.*]], i64 [[IDX:%.*]]
867
- ; CHECK-NEXT: [[P3:%.*]] = getelementptr inbounds i32, ptr [[P2]], i64 [[IDX2:%.*]]
868
- ; CHECK-NEXT: [[I1:%.*]] = ptrtoint ptr [[BASE]] to i64
869
- ; CHECK-NEXT: [[I2:%.*]] = ptrtoint ptr [[P3]] to i64
870
- ; CHECK-NEXT: [[D:%.*]] = sub i64 [[I2]], [[I1]]
866
+ ; CHECK-NEXT: [[P2_IDX1:%.*]] = add i64 [[IDX:%.*]], [[IDX2:%.*]]
867
+ ; CHECK-NEXT: [[D:%.*]] = shl i64 [[P2_IDX1]], 2
871
868
; CHECK-NEXT: ret i64 [[D]]
872
869
;
873
870
%p2 = getelementptr inbounds i32 , ptr %base , i64 %idx
@@ -880,12 +877,9 @@ define i64 @multiple_geps_one_chain(ptr %base, i64 %idx, i64 %idx2) {
880
877
881
878
define i64 @multiple_geps_one_chain_commuted (ptr %base , i64 %idx , i64 %idx2 ) {
882
879
; CHECK-LABEL: @multiple_geps_one_chain_commuted(
883
- ; CHECK-NEXT: [[P2:%.*]] = getelementptr inbounds i32, ptr [[BASE:%.*]], i64 [[IDX:%.*]]
884
- ; CHECK-NEXT: [[P3:%.*]] = getelementptr inbounds i32, ptr [[P2]], i64 [[IDX2:%.*]]
885
- ; CHECK-NEXT: [[I1:%.*]] = ptrtoint ptr [[BASE]] to i64
886
- ; CHECK-NEXT: [[I2:%.*]] = ptrtoint ptr [[P3]] to i64
887
- ; CHECK-NEXT: [[D:%.*]] = sub i64 [[I1]], [[I2]]
888
- ; CHECK-NEXT: ret i64 [[D]]
880
+ ; CHECK-NEXT: [[P2_IDX1:%.*]] = add i64 [[IDX:%.*]], [[IDX2:%.*]]
881
+ ; CHECK-NEXT: [[DOTNEG:%.*]] = mul i64 [[P2_IDX1]], -4
882
+ ; CHECK-NEXT: ret i64 [[DOTNEG]]
889
883
;
890
884
%p2 = getelementptr inbounds i32 , ptr %base , i64 %idx
891
885
%p3 = getelementptr inbounds i32 , ptr %p2 , i64 %idx2
@@ -897,13 +891,10 @@ define i64 @multiple_geps_one_chain_commuted(ptr %base, i64 %idx, i64 %idx2) {
897
891
898
892
define i64 @multiple_geps_two_chains (ptr %base , i64 %idx , i64 %idx2 , i64 %idx3 ) {
899
893
; CHECK-LABEL: @multiple_geps_two_chains(
900
- ; CHECK-NEXT: [[P2:%.*]] = getelementptr inbounds i32, ptr [[BASE:%.*]], i64 [[IDX:%.*]]
901
- ; CHECK-NEXT: [[P3:%.*]] = getelementptr inbounds i32, ptr [[P2]], i64 [[IDX2:%.*]]
902
- ; CHECK-NEXT: [[P4:%.*]] = getelementptr inbounds i32, ptr [[BASE]], i64 [[IDX3:%.*]]
903
- ; CHECK-NEXT: [[I1:%.*]] = ptrtoint ptr [[P4]] to i64
904
- ; CHECK-NEXT: [[I2:%.*]] = ptrtoint ptr [[P3]] to i64
905
- ; CHECK-NEXT: [[D:%.*]] = sub i64 [[I2]], [[I1]]
906
- ; CHECK-NEXT: ret i64 [[D]]
894
+ ; CHECK-NEXT: [[P2_IDX1:%.*]] = add i64 [[IDX:%.*]], [[IDX2:%.*]]
895
+ ; CHECK-NEXT: [[TMP1:%.*]] = sub i64 [[P2_IDX1]], [[IDX3:%.*]]
896
+ ; CHECK-NEXT: [[GEPDIFF:%.*]] = shl i64 [[TMP1]], 2
897
+ ; CHECK-NEXT: ret i64 [[GEPDIFF]]
907
898
;
908
899
%p2 = getelementptr inbounds i32 , ptr %base , i64 %idx
909
900
%p3 = getelementptr inbounds i32 , ptr %p2 , i64 %idx2
@@ -916,13 +907,10 @@ define i64 @multiple_geps_two_chains(ptr %base, i64 %idx, i64 %idx2, i64 %idx3)
916
907
917
908
define i64 @multiple_geps_two_chains_commuted (ptr %base , i64 %idx , i64 %idx2 , i64 %idx3 ) {
918
909
; CHECK-LABEL: @multiple_geps_two_chains_commuted(
919
- ; CHECK-NEXT: [[P2:%.*]] = getelementptr inbounds i32, ptr [[BASE:%.*]], i64 [[IDX:%.*]]
920
- ; CHECK-NEXT: [[P3:%.*]] = getelementptr inbounds i32, ptr [[P2]], i64 [[IDX2:%.*]]
921
- ; CHECK-NEXT: [[P4:%.*]] = getelementptr inbounds i32, ptr [[BASE]], i64 [[IDX3:%.*]]
922
- ; CHECK-NEXT: [[I1:%.*]] = ptrtoint ptr [[P4]] to i64
923
- ; CHECK-NEXT: [[I2:%.*]] = ptrtoint ptr [[P3]] to i64
924
- ; CHECK-NEXT: [[D:%.*]] = sub i64 [[I1]], [[I2]]
925
- ; CHECK-NEXT: ret i64 [[D]]
910
+ ; CHECK-NEXT: [[P2_IDX1:%.*]] = add i64 [[IDX:%.*]], [[IDX2:%.*]]
911
+ ; CHECK-NEXT: [[TMP1:%.*]] = sub i64 [[IDX3:%.*]], [[P2_IDX1]]
912
+ ; CHECK-NEXT: [[GEPDIFF:%.*]] = shl i64 [[TMP1]], 2
913
+ ; CHECK-NEXT: ret i64 [[GEPDIFF]]
926
914
;
927
915
%p2 = getelementptr inbounds i32 , ptr %base , i64 %idx
928
916
%p3 = getelementptr inbounds i32 , ptr %p2 , i64 %idx2
@@ -933,18 +921,19 @@ define i64 @multiple_geps_two_chains_commuted(ptr %base, i64 %idx, i64 %idx2, i6
933
921
ret i64 %d
934
922
}
935
923
924
+ declare void @use (ptr )
925
+
936
926
define i64 @multiple_geps_two_chains_gep_base (ptr %base , i64 %base.idx , i64 %idx , i64 %idx2 , i64 %idx3 ) {
937
927
; CHECK-LABEL: @multiple_geps_two_chains_gep_base(
938
928
; CHECK-NEXT: [[GEP_BASE:%.*]] = getelementptr inbounds i32, ptr [[BASE:%.*]], i64 [[BASE_IDX:%.*]]
939
- ; CHECK-NEXT: [[P2:%.*]] = getelementptr inbounds i32, ptr [[GEP_BASE]], i64 [[IDX:%.*]]
940
- ; CHECK-NEXT: [[P3:%.*]] = getelementptr inbounds i32, ptr [[P2]], i64 [[IDX2:%.*]]
941
- ; CHECK-NEXT: [[P4:%.*]] = getelementptr inbounds i32, ptr [[GEP_BASE]], i64 [[IDX3:%.*]]
942
- ; CHECK-NEXT: [[I1:%.*]] = ptrtoint ptr [[P4]] to i64
943
- ; CHECK-NEXT: [[I2:%.*]] = ptrtoint ptr [[P3]] to i64
944
- ; CHECK-NEXT: [[D:%.*]] = sub i64 [[I2]], [[I1]]
945
- ; CHECK-NEXT: ret i64 [[D]]
929
+ ; CHECK-NEXT: call void @use(ptr [[GEP_BASE]])
930
+ ; CHECK-NEXT: [[P2_IDX1:%.*]] = add i64 [[IDX:%.*]], [[IDX2:%.*]]
931
+ ; CHECK-NEXT: [[TMP1:%.*]] = sub i64 [[P2_IDX1]], [[IDX3:%.*]]
932
+ ; CHECK-NEXT: [[GEPDIFF:%.*]] = shl i64 [[TMP1]], 2
933
+ ; CHECK-NEXT: ret i64 [[GEPDIFF]]
946
934
;
947
935
%gep.base = getelementptr inbounds i32 , ptr %base , i64 %base.idx
936
+ call void @use (ptr %gep.base )
948
937
%p2 = getelementptr inbounds i32 , ptr %gep.base , i64 %idx
949
938
%p3 = getelementptr inbounds i32 , ptr %p2 , i64 %idx2
950
939
%p4 = getelementptr inbounds i32 , ptr %gep.base , i64 %idx3
0 commit comments