@@ -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