@@ -147,10 +147,12 @@ define ptr @merge_nuw_inbounds(ptr %p, i64 %a) {
147147  ret  ptr  %gep3 
148148}
149149
150+ ; It would be okay to preserve nusw here, as the constant addition does not 
151+ ; overflow. 
150152define  ptr  @merge_nuw_nusw (ptr  %p , i64  %a ) {
151153; CHECK-LABEL: @merge_nuw_nusw( 
152154; CHECK-NEXT:    [[GEP2:%.*]] = getelementptr nusw nuw i32, ptr [[P:%.*]], i64 [[A:%.*]] 
153- ; CHECK-NEXT:    [[GEP3:%.*]] = getelementptr nusw  nuw i8, ptr [[GEP2]], i64 5 
155+ ; CHECK-NEXT:    [[GEP3:%.*]] = getelementptr nuw i8, ptr [[GEP2]], i64 5 
154156; CHECK-NEXT:    ret ptr [[GEP3]] 
155157; 
156158  %gep1  = getelementptr  nusw nuw  i8 , ptr  %p , i64  1 
@@ -159,6 +161,19 @@ define ptr @merge_nuw_nusw(ptr %p, i64 %a) {
159161  ret  ptr  %gep3 
160162}
161163
164+ ; Can't preserve nusw on the final GEP 
165+ define  ptr  @merge_nuw_nusw_overflow (ptr  %p , i64  %a ) {
166+ ; CHECK-LABEL: @merge_nuw_nusw_overflow( 
167+ ; CHECK-NEXT:    [[GEP2:%.*]] = getelementptr nusw nuw i32, ptr [[P:%.*]], i64 [[A:%.*]] 
168+ ; CHECK-NEXT:    [[GEP3:%.*]] = getelementptr nuw i8, ptr [[GEP2]], i64 -2305843009213693952 
169+ ; CHECK-NEXT:    ret ptr [[GEP3]] 
170+ ; 
171+   %gep1  = getelementptr  nusw nuw  i8 , ptr  %p , i64  u0x7000000000000000
172+   %gep2  = getelementptr  nusw nuw  i32 , ptr  %gep1 , i64  %a 
173+   %gep3  = getelementptr  nusw nuw  i8 , ptr  %gep2 , i64  u0x7000000000000000
174+   ret  ptr  %gep3 
175+ }
176+ 
162177define  ptr  @merge_missing_nuw1 (ptr  %p , i64  %a ) {
163178; CHECK-LABEL: @merge_missing_nuw1( 
164179; CHECK-NEXT:    [[GEP2:%.*]] = getelementptr i32, ptr [[P:%.*]], i64 [[A:%.*]] 
@@ -185,7 +200,7 @@ define ptr @merge_missing_nuw2(ptr %p, i64 %a) {
185200
186201define  ptr  @merge_missing_nuw3 (ptr  %p , i64  %a ) {
187202; CHECK-LABEL: @merge_missing_nuw3( 
188- ; CHECK-NEXT:    [[GEP2:%.*]] = getelementptr i32, ptr [[P:%.*]], i64 [[A:%.*]] 
203+ ; CHECK-NEXT:    [[GEP2:%.*]] = getelementptr nuw  i32, ptr [[P:%.*]], i64 [[A:%.*]] 
189204; CHECK-NEXT:    [[GEP3:%.*]] = getelementptr i8, ptr [[GEP2]], i64 5 
190205; CHECK-NEXT:    ret ptr [[GEP3]] 
191206; 
0 commit comments