Skip to content

Commit 16f3d7b

Browse files
committed
Use intersectForOffsetAdd for final GEP
1 parent d478b01 commit 16f3d7b

File tree

2 files changed

+21
-5
lines changed

2 files changed

+21
-5
lines changed

llvm/lib/Transforms/InstCombine/InstructionCombining.cpp

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2681,7 +2681,7 @@ static Instruction *combineConstantOffsets(GetElementPtrInst &GEP,
26812681
if (!GEP.hasAllConstantIndices())
26822682
return nullptr;
26832683

2684-
GEPNoWrapFlags NW = GEP.getNoWrapFlags();
2684+
GEPNoWrapFlags NW = GEPNoWrapFlags::all();
26852685
SmallVector<GetElementPtrInst *> Skipped;
26862686
auto *InnerGEP = dyn_cast<GetElementPtrInst>(GEP.getPointerOperand());
26872687
while (true) {
@@ -2725,8 +2725,9 @@ static Instruction *combineConstantOffsets(GetElementPtrInst &GEP,
27252725
SkippedGEP->setNoWrapFlags(NW);
27262726

27272727
return IC.replaceInstUsesWith(
2728-
GEP, IC.Builder.CreatePtrAdd(Skipped.front(), IC.Builder.getInt(Offset),
2729-
"", NW));
2728+
GEP,
2729+
IC.Builder.CreatePtrAdd(Skipped.front(), IC.Builder.getInt(Offset), "",
2730+
NW.intersectForOffsetAdd(GEP.getNoWrapFlags())));
27302731
}
27312732

27322733
Instruction *InstCombinerImpl::visitGEPOfGEP(GetElementPtrInst &GEP,

llvm/test/Transforms/InstCombine/gep-canonicalize-constant-indices.ll

Lines changed: 17 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -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.
150152
define 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+
162177
define 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

186201
define 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

Comments
 (0)