Skip to content

Commit fd00ff3

Browse files
committed
[SCEVExpander] Preserve gep nuw during expansion
When expanding SCEV adds to geps, transfer the nuw flag to the resulting gep. (Note that this doesn't apply to IV increment GEPs, which go through a different code path.)
1 parent c3c2370 commit fd00ff3

File tree

15 files changed

+36
-32
lines changed

15 files changed

+36
-32
lines changed

llvm/include/llvm/Transforms/Utils/ScalarEvolutionExpander.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -450,7 +450,7 @@ class SCEVExpander : public SCEVVisitor<SCEVExpander, Value *> {
450450

451451
/// Expand a SCEVAddExpr with a pointer type into a GEP instead of using
452452
/// ptrtoint+arithmetic+inttoptr.
453-
Value *expandAddToGEP(const SCEV *Op, Value *V);
453+
Value *expandAddToGEP(const SCEV *Op, Value *V, SCEV::NoWrapFlags Flags);
454454

455455
/// Find a previous Value in ExprValueMap for expand.
456456
/// DropPoisonGeneratingInsts is populated with instructions for which

llvm/lib/Transforms/Utils/ScalarEvolutionExpander.cpp

Lines changed: 9 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -347,16 +347,19 @@ Value *SCEVExpander::InsertBinop(Instruction::BinaryOps Opcode,
347347
/// loop-invariant portions of expressions, after considering what
348348
/// can be folded using target addressing modes.
349349
///
350-
Value *SCEVExpander::expandAddToGEP(const SCEV *Offset, Value *V) {
350+
Value *SCEVExpander::expandAddToGEP(const SCEV *Offset, Value *V,
351+
SCEV::NoWrapFlags Flags) {
351352
assert(!isa<Instruction>(V) ||
352353
SE.DT.dominates(cast<Instruction>(V), &*Builder.GetInsertPoint()));
353354

354355
Value *Idx = expand(Offset);
356+
GEPNoWrapFlags NW = (Flags & SCEV::FlagNUW) ? GEPNoWrapFlags::noUnsignedWrap()
357+
: GEPNoWrapFlags::none();
355358

356359
// Fold a GEP with constant operands.
357360
if (Constant *CLHS = dyn_cast<Constant>(V))
358361
if (Constant *CRHS = dyn_cast<Constant>(Idx))
359-
return Builder.CreatePtrAdd(CLHS, CRHS);
362+
return Builder.CreatePtrAdd(CLHS, CRHS, "", NW);
360363

361364
// Do a quick scan to see if we have this GEP nearby. If so, reuse it.
362365
unsigned ScanLimit = 6;
@@ -393,7 +396,7 @@ Value *SCEVExpander::expandAddToGEP(const SCEV *Offset, Value *V) {
393396
}
394397

395398
// Emit a GEP.
396-
return Builder.CreatePtrAdd(V, Idx, "scevgep");
399+
return Builder.CreatePtrAdd(V, Idx, "scevgep", NW);
397400
}
398401

399402
/// PickMostRelevantLoop - Given two loops pick the one that's most relevant for
@@ -540,7 +543,7 @@ Value *SCEVExpander::visitAddExpr(const SCEVAddExpr *S) {
540543
X = SE.getSCEV(U->getValue());
541544
NewOps.push_back(X);
542545
}
543-
Sum = expandAddToGEP(SE.getAddExpr(NewOps), Sum);
546+
Sum = expandAddToGEP(SE.getAddExpr(NewOps), Sum, S->getNoWrapFlags());
544547
} else if (Op->isNonConstantNegative()) {
545548
// Instead of doing a negate and add, just do a subtract.
546549
Value *W = expand(SE.getNegativeSCEV(Op));
@@ -1242,7 +1245,8 @@ Value *SCEVExpander::visitAddRecExpr(const SCEVAddRecExpr *S) {
12421245
if (!S->getStart()->isZero()) {
12431246
if (isa<PointerType>(S->getType())) {
12441247
Value *StartV = expand(SE.getPointerBase(S));
1245-
return expandAddToGEP(SE.removePointerBase(S), StartV);
1248+
return expandAddToGEP(SE.removePointerBase(S), StartV,
1249+
S->getNoWrapFlags(SCEV::FlagNUW));
12461250
}
12471251

12481252
SmallVector<const SCEV *, 4> NewOps(S->operands());

llvm/test/Analysis/ScalarEvolution/scev-expander-reuse-gep.ll

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@
33
; RUN: opt -mtriple=i386-apple-macosx10.12.0 < %s -loop-reduce -S | FileCheck %s
44

55
; CHECK: %ptr4.ptr1 = select i1 %cmp.i, ptr %ptr4, ptr %ptr1
6-
; CHECK-NEXT: %scevgep = getelementptr i8, ptr %ptr4.ptr1, i32 1
6+
; CHECK-NEXT: %scevgep = getelementptr nuw i8, ptr %ptr4.ptr1, i32 1
77
; CHECK-NEXT: br label %while.cond.i
88

99
target datalayout = "e-m:o-p:32:32-f64:32:64-f80:128-n8:16:32-S128"

llvm/test/Transforms/LoopIdiom/basic-address-space.ll

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@ define void @test10(ptr addrspace(2) %X) nounwind ssp {
1313
; CHECK: bb.nph:
1414
; CHECK-NEXT: [[I_04:%.*]] = phi i16 [ 0, [[ENTRY:%.*]] ], [ [[INC12:%.*]], [[FOR_INC10:%.*]] ]
1515
; CHECK-NEXT: [[TMP0:%.*]] = mul nuw nsw i16 [[I_04]], 100
16-
; CHECK-NEXT: [[SCEVGEP:%.*]] = getelementptr i8, ptr addrspace(2) [[X]], i16 [[TMP0]]
16+
; CHECK-NEXT: [[SCEVGEP:%.*]] = getelementptr nuw i8, ptr addrspace(2) [[X]], i16 [[TMP0]]
1717
; CHECK-NEXT: br label [[FOR_BODY5:%.*]]
1818
; CHECK: for.body5:
1919
; CHECK-NEXT: [[J_02:%.*]] = phi i16 [ 0, [[BB_NPH]] ], [ [[INC:%.*]], [[FOR_BODY5]] ]

llvm/test/Transforms/LoopIdiom/basic.ll

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -481,7 +481,7 @@ define void @test10(ptr %X) nounwind ssp {
481481
; CHECK-NEXT: [[INDVAR:%.*]] = phi i64 [ [[INDVAR_NEXT:%.*]], [[FOR_INC10:%.*]] ], [ 0, [[ENTRY:%.*]] ]
482482
; CHECK-NEXT: [[I_04:%.*]] = phi i32 [ 0, [[ENTRY]] ], [ [[INC12:%.*]], [[FOR_INC10]] ]
483483
; CHECK-NEXT: [[TMP0:%.*]] = mul nuw nsw i64 [[INDVAR]], 100
484-
; CHECK-NEXT: [[SCEVGEP:%.*]] = getelementptr i8, ptr [[X]], i64 [[TMP0]]
484+
; CHECK-NEXT: [[SCEVGEP:%.*]] = getelementptr nuw i8, ptr [[X]], i64 [[TMP0]]
485485
; CHECK-NEXT: br label [[FOR_BODY5:%.*]]
486486
; CHECK: for.body5:
487487
; CHECK-NEXT: [[J_02:%.*]] = phi i32 [ 0, [[BB_NPH]] ], [ [[INC:%.*]], [[FOR_BODY5]] ]
@@ -682,7 +682,7 @@ define void @PR14241(ptr %s, i64 %size) {
682682
; CHECK-NEXT: entry:
683683
; CHECK-NEXT: [[END_IDX:%.*]] = add i64 [[SIZE:%.*]], -1
684684
; CHECK-NEXT: [[END_PTR:%.*]] = getelementptr inbounds i32, ptr [[S:%.*]], i64 [[END_IDX]]
685-
; CHECK-NEXT: [[SCEVGEP:%.*]] = getelementptr i8, ptr [[S]], i64 4
685+
; CHECK-NEXT: [[SCEVGEP:%.*]] = getelementptr nuw i8, ptr [[S]], i64 4
686686
; CHECK-NEXT: [[TMP0:%.*]] = shl i64 [[SIZE]], 2
687687
; CHECK-NEXT: [[TMP1:%.*]] = add i64 [[TMP0]], -8
688688
; CHECK-NEXT: [[TMP2:%.*]] = lshr i64 [[TMP1]], 2

llvm/test/Transforms/LoopIdiom/memset-pr52104.ll

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -6,12 +6,12 @@ define void @f(ptr nocapture nonnull align 4 dereferenceable(20) %0, i32 %1) loc
66
; CHECK-NEXT: [[TMP3:%.*]] = trunc i32 [[TMP1:%.*]] to i2
77
; CHECK-NEXT: [[TMP4:%.*]] = zext i2 [[TMP3]] to i64
88
; CHECK-NEXT: [[TMP5:%.*]] = shl nuw nsw i64 [[TMP4]], 2
9-
; CHECK-NEXT: [[UGLYGEP:%.*]] = getelementptr i8, ptr [[TMP0:%.*]], i64 [[TMP5]]
9+
; CHECK-NEXT: [[SCEVGEP:%.*]] = getelementptr nuw i8, ptr [[TMP0:%.*]], i64 [[TMP5]]
1010
; CHECK-NEXT: [[TMP6:%.*]] = sub i2 -1, [[TMP3]]
1111
; CHECK-NEXT: [[TMP7:%.*]] = zext i2 [[TMP6]] to i64
1212
; CHECK-NEXT: [[TMP8:%.*]] = shl nuw nsw i64 [[TMP7]], 2
1313
; CHECK-NEXT: [[TMP9:%.*]] = add nuw nsw i64 [[TMP8]], 4
14-
; CHECK-NEXT: call void @llvm.memset.p0.i64(ptr align 4 [[UGLYGEP]], i8 0, i64 [[TMP9]], i1 false)
14+
; CHECK-NEXT: call void @llvm.memset.p0.i64(ptr align 4 [[SCEVGEP]], i8 0, i64 [[TMP9]], i1 false)
1515
; CHECK-NEXT: br label [[TMP10:%.*]]
1616
; CHECK: 10:
1717
; CHECK-NEXT: [[TMP11:%.*]] = phi i32 [ [[TMP15:%.*]], [[TMP10]] ], [ [[TMP1]], [[TMP2:%.*]] ]

llvm/test/Transforms/LoopStrengthReduce/X86/2012-01-13-phielim.ll

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -96,7 +96,7 @@ define void @test2(i32 %n) nounwind uwtable {
9696
; CHECK-NEXT: br label [[FOR_COND468:%.*]]
9797
; CHECK: for.cond468:
9898
; CHECK-NEXT: [[LSR_IV1:%.*]] = phi i32 [ 1, [[FOR_COND468_PREHEADER]] ], [ [[LSR_IV_NEXT:%.*]], [[IF_THEN477:%.*]] ]
99-
; CHECK-NEXT: [[LSR_IV:%.*]] = phi ptr [ getelementptr inbounds (i8, ptr @tags, i64 8), [[FOR_COND468_PREHEADER]] ], [ [[SCEVGEP:%.*]], [[IF_THEN477]] ]
99+
; CHECK-NEXT: [[LSR_IV:%.*]] = phi ptr [ getelementptr inbounds nuw (i8, ptr @tags, i64 8), [[FOR_COND468_PREHEADER]] ], [ [[SCEVGEP:%.*]], [[IF_THEN477]] ]
100100
; CHECK-NEXT: [[K_0:%.*]] = load i32, ptr [[LSR_IV]], align 4
101101
; CHECK-NEXT: [[CMP469:%.*]] = icmp slt i32 [[LSR_IV1]], [[N:%.*]]
102102
; CHECK-NEXT: br i1 [[CMP469]], label [[FOR_BODY471:%.*]], label [[FOR_INC498_PREHEADER:%.*]]

llvm/test/Transforms/LoopStrengthReduce/post-inc-icmpzero.ll

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@ define void @_Z15IntegerToStringjjR7Vector2(i32 %i, i32 %radix, ptr nocapture %r
1818
; CHECK-NEXT: [[ADD_PTR:%.*]] = getelementptr [33 x i16], ptr [[BUFFER]], i64 0, i64 33
1919
; CHECK-NEXT: [[SUB_PTR_LHS_CAST:%.*]] = ptrtoint ptr [[ADD_PTR]] to i64
2020
; CHECK-NEXT: [[SUB_PTR_RHS_CAST:%.*]] = ptrtoint ptr [[ADD_PTR]] to i64
21-
; CHECK-NEXT: [[SCEVGEP3:%.*]] = getelementptr i8, ptr [[BUFFER]], i64 64
21+
; CHECK-NEXT: [[SCEVGEP3:%.*]] = getelementptr nuw i8, ptr [[BUFFER]], i64 64
2222
; CHECK-NEXT: br label [[DO_BODY:%.*]]
2323
; CHECK: do.body:
2424
; CHECK-NEXT: [[LSR_IV10:%.*]] = phi i64 [ [[LSR_IV_NEXT11:%.*]], [[DO_BODY]] ], [ -1, [[ENTRY:%.*]] ]

llvm/test/Transforms/LoopVectorize/AArch64/sve-interleaved-accesses.ll

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1461,7 +1461,7 @@ define void @PR34743(ptr %a, ptr %b, i64 %n) #1 {
14611461
; CHECK-NEXT: [[TMP5:%.*]] = and i64 [[TMP4]], -4
14621462
; CHECK-NEXT: [[TMP6:%.*]] = getelementptr i8, ptr [[B:%.*]], i64 [[TMP5]]
14631463
; CHECK-NEXT: [[SCEVGEP:%.*]] = getelementptr i8, ptr [[TMP6]], i64 4
1464-
; CHECK-NEXT: [[SCEVGEP1:%.*]] = getelementptr i8, ptr [[A]], i64 2
1464+
; CHECK-NEXT: [[SCEVGEP1:%.*]] = getelementptr nuw i8, ptr [[A]], i64 2
14651465
; CHECK-NEXT: [[TMP7:%.*]] = getelementptr i8, ptr [[A]], i64 [[TMP5]]
14661466
; CHECK-NEXT: [[SCEVGEP2:%.*]] = getelementptr i8, ptr [[TMP7]], i64 6
14671467
; CHECK-NEXT: [[BOUND0:%.*]] = icmp ugt ptr [[SCEVGEP2]], [[B]]
@@ -1521,10 +1521,10 @@ define void @PR34743(ptr %a, ptr %b, i64 %n) #1 {
15211521
; CHECK-NEXT: [[SCALAR_RECUR_INIT:%.*]] = phi i16 [ [[VECTOR_RECUR_EXTRACT]], [[MIDDLE_BLOCK]] ], [ [[DOTPRE]], [[ENTRY]] ], [ [[DOTPRE]], [[VECTOR_MEMCHECK]] ]
15221522
; CHECK-NEXT: br label [[LOOP:%.*]]
15231523
; CHECK: loop:
1524-
; CHECK-NEXT: [[SCALAR_RECUR:%.*]] = phi i16 [ [[SCALAR_RECUR_INIT]], [[SCALAR_PH]] ], [ [[LOAD2:%.*]], [[LOOP]] ]
1524+
; CHECK-NEXT: [[TMP33:%.*]] = phi i16 [ [[SCALAR_RECUR_INIT]], [[SCALAR_PH]] ], [ [[LOAD2:%.*]], [[LOOP]] ]
15251525
; CHECK-NEXT: [[IV:%.*]] = phi i64 [ [[BC_RESUME_VAL]], [[SCALAR_PH]] ], [ [[IV2:%.*]], [[LOOP]] ]
15261526
; CHECK-NEXT: [[I:%.*]] = phi i64 [ [[BC_RESUME_VAL3]], [[SCALAR_PH]] ], [ [[I1:%.*]], [[LOOP]] ]
1527-
; CHECK-NEXT: [[CONV:%.*]] = sext i16 [[SCALAR_RECUR]] to i32
1527+
; CHECK-NEXT: [[CONV:%.*]] = sext i16 [[TMP33]] to i32
15281528
; CHECK-NEXT: [[I1]] = add nuw nsw i64 [[I]], 1
15291529
; CHECK-NEXT: [[IV1:%.*]] = or disjoint i64 [[IV]], 1
15301530
; CHECK-NEXT: [[IV2]] = add nuw nsw i64 [[IV]], 2

llvm/test/Transforms/LoopVectorize/induction.ll

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1561,7 +1561,7 @@ define void @scalarize_induction_variable_04(ptr %a, ptr %p, i32 %n) {
15611561
; CHECK-NEXT: [[MIN_ITERS_CHECK:%.*]] = icmp ult i64 [[TMP2]], 2
15621562
; CHECK-NEXT: br i1 [[MIN_ITERS_CHECK]], label [[SCALAR_PH:%.*]], label [[VECTOR_MEMCHECK:%.*]]
15631563
; CHECK: vector.memcheck:
1564-
; CHECK-NEXT: [[SCEVGEP:%.*]] = getelementptr i8, ptr [[P:%.*]], i64 4
1564+
; CHECK-NEXT: [[SCEVGEP:%.*]] = getelementptr nuw i8, ptr [[P:%.*]], i64 4
15651565
; CHECK-NEXT: [[TMP3:%.*]] = add i32 [[N]], -1
15661566
; CHECK-NEXT: [[TMP4:%.*]] = zext i32 [[TMP3]] to i64
15671567
; CHECK-NEXT: [[TMP5:%.*]] = shl nuw nsw i64 [[TMP4]], 3
@@ -1626,7 +1626,7 @@ define void @scalarize_induction_variable_04(ptr %a, ptr %p, i32 %n) {
16261626
; IND-NEXT: [[MIN_ITERS_CHECK:%.*]] = icmp eq i32 [[TMP0]], 0
16271627
; IND-NEXT: br i1 [[MIN_ITERS_CHECK]], label [[SCALAR_PH:%.*]], label [[VECTOR_MEMCHECK:%.*]]
16281628
; IND: vector.memcheck:
1629-
; IND-NEXT: [[SCEVGEP:%.*]] = getelementptr i8, ptr [[P:%.*]], i64 4
1629+
; IND-NEXT: [[SCEVGEP:%.*]] = getelementptr nuw i8, ptr [[P:%.*]], i64 4
16301630
; IND-NEXT: [[TMP3:%.*]] = add i32 [[N]], -1
16311631
; IND-NEXT: [[TMP4:%.*]] = zext i32 [[TMP3]] to i64
16321632
; IND-NEXT: [[TMP5:%.*]] = shl nuw nsw i64 [[TMP4]], 3
@@ -1689,7 +1689,7 @@ define void @scalarize_induction_variable_04(ptr %a, ptr %p, i32 %n) {
16891689
; UNROLL-NEXT: [[MIN_ITERS_CHECK:%.*]] = icmp ult i32 [[TMP0]], 3
16901690
; UNROLL-NEXT: br i1 [[MIN_ITERS_CHECK]], label [[SCALAR_PH:%.*]], label [[VECTOR_MEMCHECK:%.*]]
16911691
; UNROLL: vector.memcheck:
1692-
; UNROLL-NEXT: [[SCEVGEP:%.*]] = getelementptr i8, ptr [[P:%.*]], i64 4
1692+
; UNROLL-NEXT: [[SCEVGEP:%.*]] = getelementptr nuw i8, ptr [[P:%.*]], i64 4
16931693
; UNROLL-NEXT: [[TMP3:%.*]] = add i32 [[N]], -1
16941694
; UNROLL-NEXT: [[TMP4:%.*]] = zext i32 [[TMP3]] to i64
16951695
; UNROLL-NEXT: [[TMP5:%.*]] = shl nuw nsw i64 [[TMP4]], 3
@@ -1766,7 +1766,7 @@ define void @scalarize_induction_variable_04(ptr %a, ptr %p, i32 %n) {
17661766
; UNROLL-NO-IC-NEXT: [[MIN_ITERS_CHECK:%.*]] = icmp ult i64 [[TMP2]], 4
17671767
; UNROLL-NO-IC-NEXT: br i1 [[MIN_ITERS_CHECK]], label [[SCALAR_PH:%.*]], label [[VECTOR_MEMCHECK:%.*]]
17681768
; UNROLL-NO-IC: vector.memcheck:
1769-
; UNROLL-NO-IC-NEXT: [[SCEVGEP:%.*]] = getelementptr i8, ptr [[P:%.*]], i64 4
1769+
; UNROLL-NO-IC-NEXT: [[SCEVGEP:%.*]] = getelementptr nuw i8, ptr [[P:%.*]], i64 4
17701770
; UNROLL-NO-IC-NEXT: [[TMP3:%.*]] = add i32 [[N]], -1
17711771
; UNROLL-NO-IC-NEXT: [[TMP4:%.*]] = zext i32 [[TMP3]] to i64
17721772
; UNROLL-NO-IC-NEXT: [[TMP5:%.*]] = shl nuw nsw i64 [[TMP4]], 3
@@ -1845,7 +1845,7 @@ define void @scalarize_induction_variable_04(ptr %a, ptr %p, i32 %n) {
18451845
; INTERLEAVE-NEXT: [[MIN_ITERS_CHECK:%.*]] = icmp ult i32 [[TMP0]], 8
18461846
; INTERLEAVE-NEXT: br i1 [[MIN_ITERS_CHECK]], label [[SCALAR_PH:%.*]], label [[VECTOR_MEMCHECK:%.*]]
18471847
; INTERLEAVE: vector.memcheck:
1848-
; INTERLEAVE-NEXT: [[SCEVGEP:%.*]] = getelementptr i8, ptr [[P:%.*]], i64 4
1848+
; INTERLEAVE-NEXT: [[SCEVGEP:%.*]] = getelementptr nuw i8, ptr [[P:%.*]], i64 4
18491849
; INTERLEAVE-NEXT: [[TMP3:%.*]] = add i32 [[N]], -1
18501850
; INTERLEAVE-NEXT: [[TMP4:%.*]] = zext i32 [[TMP3]] to i64
18511851
; INTERLEAVE-NEXT: [[TMP5:%.*]] = shl nuw nsw i64 [[TMP4]], 3

llvm/test/Transforms/LoopVectorize/interleaved-accesses.ll

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1478,7 +1478,7 @@ define void @PR34743(ptr %a, ptr %b, i64 %n) {
14781478
; CHECK-NEXT: [[TMP3:%.*]] = and i64 [[TMP2]], -4
14791479
; CHECK-NEXT: [[TMP4:%.*]] = getelementptr i8, ptr [[B:%.*]], i64 [[TMP3]]
14801480
; CHECK-NEXT: [[SCEVGEP:%.*]] = getelementptr i8, ptr [[TMP4]], i64 4
1481-
; CHECK-NEXT: [[SCEVGEP1:%.*]] = getelementptr i8, ptr [[A]], i64 2
1481+
; CHECK-NEXT: [[SCEVGEP1:%.*]] = getelementptr nuw i8, ptr [[A]], i64 2
14821482
; CHECK-NEXT: [[TMP5:%.*]] = getelementptr i8, ptr [[A]], i64 [[TMP3]]
14831483
; CHECK-NEXT: [[SCEVGEP2:%.*]] = getelementptr i8, ptr [[TMP5]], i64 6
14841484
; CHECK-NEXT: [[BOUND0:%.*]] = icmp ugt ptr [[SCEVGEP2]], [[B]]

llvm/test/Transforms/LoopVectorize/multiple-strides-vectorization.ll

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -38,12 +38,12 @@ define void @Test(ptr nocapture %obj, i64 %z) #0 {
3838
; CHECK-NEXT: [[I:%.*]] = phi i64 [ 0, [[TMP0:%.*]] ], [ [[I_NEXT:%.*]], [[DOTOUTER:%.*]] ]
3939
; CHECK-NEXT: [[TMP3:%.*]] = shl nuw nsw i64 [[I]], 7
4040
; CHECK-NEXT: [[TMP4:%.*]] = add i64 [[TMP3]], 256
41-
; CHECK-NEXT: [[SCEVGEP:%.*]] = getelementptr i8, ptr [[OBJ]], i64 [[TMP4]]
41+
; CHECK-NEXT: [[SCEVGEP:%.*]] = getelementptr nuw i8, ptr [[OBJ]], i64 [[TMP4]]
4242
; CHECK-NEXT: [[TMP5:%.*]] = add i64 [[TMP2]], [[TMP3]]
4343
; CHECK-NEXT: [[SCEVGEP1:%.*]] = getelementptr i8, ptr [[OBJ]], i64 [[TMP5]]
4444
; CHECK-NEXT: [[TMP6:%.*]] = shl nuw nsw i64 [[I]], 2
4545
; CHECK-NEXT: [[TMP7:%.*]] = add i64 [[TMP6]], 128
46-
; CHECK-NEXT: [[SCEVGEP3:%.*]] = getelementptr i8, ptr [[OBJ]], i64 [[TMP7]]
46+
; CHECK-NEXT: [[SCEVGEP3:%.*]] = getelementptr nuw i8, ptr [[OBJ]], i64 [[TMP7]]
4747
; CHECK-NEXT: [[TMP8:%.*]] = add i64 [[TMP6]], 132
4848
; CHECK-NEXT: [[SCEVGEP4:%.*]] = getelementptr i8, ptr [[OBJ]], i64 [[TMP8]]
4949
; CHECK-NEXT: [[TMP9:%.*]] = getelementptr inbounds [[STRUCT_S:%.*]], ptr [[OBJ]], i64 0, i32 1, i64 [[I]]
@@ -107,12 +107,12 @@ define void @Test(ptr nocapture %obj, i64 %z) #0 {
107107
; CHECK-NEXT: br i1 [[EXITCOND_INNER]], label [[DOTOUTER]], label [[DOTINNER]], !llvm.loop [[LOOP11:![0-9]+]]
108108
;
109109
; CHECK-HOIST-LABEL: @Test(
110-
; CHECK-HOIST-NEXT: [[SCEVGEP:%.*]] = getelementptr i8, ptr [[OBJ:%.*]], i64 256
110+
; CHECK-HOIST-NEXT: [[SCEVGEP:%.*]] = getelementptr nuw i8, ptr [[OBJ:%.*]], i64 256
111111
; CHECK-HOIST-NEXT: [[TMP1:%.*]] = shl i64 [[Z:%.*]], 2
112112
; CHECK-HOIST-NEXT: [[TMP2:%.*]] = add i64 [[TMP1]], 4224
113113
; CHECK-HOIST-NEXT: [[SCEVGEP1:%.*]] = getelementptr i8, ptr [[OBJ]], i64 [[TMP2]]
114114
; CHECK-HOIST-NEXT: [[SCEVGEP2:%.*]] = getelementptr i8, ptr [[OBJ]], i64 [[TMP1]]
115-
; CHECK-HOIST-NEXT: [[SCEVGEP3:%.*]] = getelementptr i8, ptr [[OBJ]], i64 128
115+
; CHECK-HOIST-NEXT: [[SCEVGEP3:%.*]] = getelementptr nuw i8, ptr [[OBJ]], i64 128
116116
; CHECK-HOIST-NEXT: br label [[DOTOUTER_PREHEADER:%.*]]
117117
; CHECK-HOIST: .outer.preheader:
118118
; CHECK-HOIST-NEXT: [[I:%.*]] = phi i64 [ 0, [[TMP0:%.*]] ], [ [[I_NEXT:%.*]], [[DOTOUTER:%.*]] ]

llvm/test/Transforms/LoopVectorize/runtime-checks-difference.ll

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -184,7 +184,7 @@ define void @nested_loop_outer_iv_addrec_invariant_in_inner1(ptr %a, ptr %b, i64
184184

185185
; CHECK: outer.header:
186186
; CHECK: [[OUTER_IV_SHL_2:%.]] = shl i64 %outer.iv, 2
187-
; CHECK-NEXT: [[A_GEP_UPPER:%.*]] = getelementptr i8, ptr %a, i64 [[OUTER_IV_SHL_2]]
187+
; CHECK-NEXT: [[A_GEP_UPPER:%.*]] = getelementptr nuw i8, ptr %a, i64 [[OUTER_IV_SHL_2]]
188188
; CHECK-NEXT: [[OUTER_IV_4:%.]] = add i64 [[OUTER_IV_SHL_2]], 4
189189
; CHECK-NEXT: [[A_GEP_UPPER_4:%.*]] = getelementptr i8, ptr %a, i64 [[OUTER_IV_4]]
190190
; CHECK: [[MIN_ITERS_CHECK:%.*]] = icmp ult i64 [[N:%.*]], 4
@@ -234,7 +234,7 @@ define void @nested_loop_outer_iv_addrec_invariant_in_inner2(ptr %a, ptr %b, i64
234234

235235
; CHECK: outer.header:
236236
; CHECK: [[OUTER_IV_SHL_2:%.]] = shl i64 %outer.iv, 2
237-
; CHECK-NEXT: [[A_GEP_UPPER:%.*]] = getelementptr i8, ptr %a, i64 [[OUTER_IV_SHL_2]]
237+
; CHECK-NEXT: [[A_GEP_UPPER:%.*]] = getelementptr nuw i8, ptr %a, i64 [[OUTER_IV_SHL_2]]
238238
; CHECK-NEXT: [[OUTER_IV_4:%.]] = add i64 [[OUTER_IV_SHL_2]], 4
239239
; CHECK-NEXT: [[A_GEP_UPPER_4:%.*]] = getelementptr i8, ptr %a, i64 [[OUTER_IV_4]]
240240
; CHECK: [[MIN_ITERS_CHECK:%.*]] = icmp ult i64 [[N:%.*]], 4

llvm/test/Transforms/LoopVersioning/add-phi-update-users.ll

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,7 @@ define void @f1() {
2727
; CHECK-NEXT: [[SCEVGEP:%.*]] = getelementptr i8, ptr [[T0]], i64 2
2828
; CHECK-NEXT: br label [[FOR_BODY_LVER_CHECK:%.*]]
2929
; CHECK: for.body.lver.check:
30-
; CHECK-NEXT: [[BOUND0:%.*]] = icmp ult ptr [[T0]], getelementptr inbounds (i8, ptr @b, i64 2)
30+
; CHECK-NEXT: [[BOUND0:%.*]] = icmp ult ptr [[T0]], getelementptr inbounds nuw (i8, ptr @b, i64 2)
3131
; CHECK-NEXT: [[BOUND1:%.*]] = icmp ult ptr @b, [[SCEVGEP]]
3232
; CHECK-NEXT: [[FOUND_CONFLICT:%.*]] = and i1 [[BOUND0]], [[BOUND1]]
3333
; CHECK-NEXT: br i1 [[FOUND_CONFLICT]], label [[FOR_BODY_PH_LVER_ORIG:%.*]], label [[FOR_BODY_PH:%.*]]

llvm/test/Transforms/LoopVersioning/bound-check-partially-known.ll

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -11,14 +11,14 @@ define void @bound_check_partially_known_1(i32 %N) {
1111
; CHECK-NEXT: loop.lver.check:
1212
; CHECK-NEXT: [[N_EXT:%.*]] = zext i32 [[N]] to i64
1313
; CHECK-NEXT: [[TMP0:%.*]] = shl nuw nsw i64 [[N_EXT]], 3
14-
; CHECK-NEXT: [[SCEVGEP:%.*]] = getelementptr i8, ptr @global, i64 [[TMP0]]
14+
; CHECK-NEXT: [[SCEVGEP:%.*]] = getelementptr nuw i8, ptr @global, i64 [[TMP0]]
1515
; CHECK-NEXT: [[TMP1:%.*]] = shl nuw nsw i64 [[N_EXT]], 4
1616
; CHECK-NEXT: [[SCEVGEP1:%.*]] = getelementptr i8, ptr @global, i64 [[TMP1]]
1717
; CHECK-NEXT: [[TMP2:%.*]] = add nuw nsw i64 [[TMP0]], 256000
1818
; CHECK-NEXT: [[SCEVGEP2:%.*]] = getelementptr i8, ptr @global, i64 [[TMP2]]
1919
; CHECK-NEXT: [[BOUND1:%.*]] = icmp ult ptr @global, [[SCEVGEP1]]
2020
; CHECK-NEXT: [[BOUND0:%.*]] = icmp ult ptr [[SCEVGEP]], [[SCEVGEP2]]
21-
; CHECK-NEXT: [[BOUND13:%.*]] = icmp ult ptr getelementptr inbounds (i8, ptr @global, i64 256000), [[SCEVGEP1]]
21+
; CHECK-NEXT: [[BOUND13:%.*]] = icmp ult ptr getelementptr inbounds nuw (i8, ptr @global, i64 256000), [[SCEVGEP1]]
2222
; CHECK-NEXT: [[FOUND_CONFLICT:%.*]] = and i1 [[BOUND0]], [[BOUND13]]
2323
; CHECK-NEXT: br i1 [[FOUND_CONFLICT]], label [[LOOP_PH_LVER_ORIG:%.*]], label [[LOOP_PH:%.*]]
2424
; CHECK: loop.ph.lver.orig:

0 commit comments

Comments
 (0)