[clang] [llvm] [ConstantFolding] Infer getelementptr nuw flag (PR #119214)
via llvm-commits
llvm-commits at lists.llvm.org
Mon Dec 9 06:06:05 PST 2024
llvmbot wrote:
<!--LLVM PR SUMMARY COMMENT-->
@llvm/pr-subscribers-clang
@llvm/pr-subscribers-backend-systemz
Author: Nikita Popov (nikic)
<details>
<summary>Changes</summary>
Infer nuw from nusw and nneg. This is the constant expression variant of https://github.com/llvm/llvm-project/pull/111144.
Proof: https://alive2.llvm.org/ce/z/ihztLy
---
Patch is 187.43 KiB, truncated to 20.00 KiB below, full version: https://github.com/llvm/llvm-project/pull/119214.diff
82 Files Affected:
- (modified) clang/test/CodeGen/RISCV/riscv-inline-asm.c (+2-2)
- (modified) clang/test/CodeGenCXX/auto-var-init.cpp (+2-2)
- (modified) llvm/lib/Analysis/ConstantFolding.cpp (+4-1)
- (modified) llvm/test/Other/constant-fold-gep.ll (+8-8)
- (modified) llvm/test/Other/optimize-inrange-gep.ll (+1-1)
- (modified) llvm/test/Transforms/FunctionSpecialization/function-specialization-constant-expression.ll (+3-3)
- (modified) llvm/test/Transforms/GVN/PRE/load-pre-licm.ll (+1-1)
- (modified) llvm/test/Transforms/GVN/PRE/phi-translate-2.ll (+3-3)
- (modified) llvm/test/Transforms/IndVarSimplify/eliminate-exit-no-dl.ll (+1-1)
- (modified) llvm/test/Transforms/IndVarSimplify/floating-point-small-iv.ll (+2-2)
- (modified) llvm/test/Transforms/InstCombine/addrspacecast.ll (+1-1)
- (modified) llvm/test/Transforms/InstCombine/align-addr.ll (+1-1)
- (modified) llvm/test/Transforms/InstCombine/binop-select-cast-of-select-cond.ll (+1-1)
- (modified) llvm/test/Transforms/InstCombine/canonicalize-gep-constglob.ll (+6-6)
- (modified) llvm/test/Transforms/InstCombine/constant-fold-address-space-pointer.ll (+1-1)
- (modified) llvm/test/Transforms/InstCombine/constant-fold-gep.ll (+18-18)
- (modified) llvm/test/Transforms/InstCombine/fmul.ll (+1-1)
- (modified) llvm/test/Transforms/InstCombine/force-opaque-ptr.ll (+2-2)
- (modified) llvm/test/Transforms/InstCombine/fortify-folding.ll (+2-2)
- (modified) llvm/test/Transforms/InstCombine/freeze-phi.ll (+7-7)
- (modified) llvm/test/Transforms/InstCombine/gep-custom-dl.ll (+3-3)
- (modified) llvm/test/Transforms/InstCombine/getelementptr.ll (+12-12)
- (modified) llvm/test/Transforms/InstCombine/hoist-xor-by-constant-from-xor-by-value.ll (+1-1)
- (modified) llvm/test/Transforms/InstCombine/memchr-2.ll (+5-5)
- (modified) llvm/test/Transforms/InstCombine/memchr-4.ll (+1-1)
- (modified) llvm/test/Transforms/InstCombine/memchr-6.ll (+2-2)
- (modified) llvm/test/Transforms/InstCombine/memchr-7.ll (+1-1)
- (modified) llvm/test/Transforms/InstCombine/memchr-8.ll (+3-3)
- (modified) llvm/test/Transforms/InstCombine/memchr-9.ll (+18-18)
- (modified) llvm/test/Transforms/InstCombine/memchr.ll (+6-6)
- (modified) llvm/test/Transforms/InstCombine/memcmp-8.ll (+1-1)
- (modified) llvm/test/Transforms/InstCombine/memcpy-from-global.ll (+4-4)
- (modified) llvm/test/Transforms/InstCombine/memrchr-3.ll (+10-10)
- (modified) llvm/test/Transforms/InstCombine/memrchr-4.ll (+2-2)
- (modified) llvm/test/Transforms/InstCombine/merging-multiple-stores-into-successor.ll (+3-3)
- (modified) llvm/test/Transforms/InstCombine/objsize.ll (+2-2)
- (modified) llvm/test/Transforms/InstCombine/pr25342.ll (+5-5)
- (modified) llvm/test/Transforms/InstCombine/pr33453.ll (+1-1)
- (modified) llvm/test/Transforms/InstCombine/pr38984-inseltpoison.ll (+1-1)
- (modified) llvm/test/Transforms/InstCombine/pr38984.ll (+1-1)
- (modified) llvm/test/Transforms/InstCombine/ptr-replace-alloca.ll (+5-5)
- (modified) llvm/test/Transforms/InstCombine/rem.ll (+2-2)
- (modified) llvm/test/Transforms/InstCombine/select-and-or.ll (+1-1)
- (modified) llvm/test/Transforms/InstCombine/simplify-libcalls-i16.ll (+30-17)
- (modified) llvm/test/Transforms/InstCombine/simplify-libcalls.ll (+30-17)
- (modified) llvm/test/Transforms/InstCombine/stpcpy-1.ll (+2-2)
- (modified) llvm/test/Transforms/InstCombine/stpcpy_chk-1.ll (+5-5)
- (modified) llvm/test/Transforms/InstCombine/stpncpy-1.ll (+2-2)
- (modified) llvm/test/Transforms/InstCombine/str-int-2.ll (+1-1)
- (modified) llvm/test/Transforms/InstCombine/str-int-3.ll (+1-1)
- (modified) llvm/test/Transforms/InstCombine/str-int-4.ll (+20-20)
- (modified) llvm/test/Transforms/InstCombine/str-int-5.ll (+25-25)
- (modified) llvm/test/Transforms/InstCombine/str-int.ll (+1-1)
- (modified) llvm/test/Transforms/InstCombine/strcall-bad-sig.ll (+5-5)
- (modified) llvm/test/Transforms/InstCombine/strcall-no-nul.ll (+10-10)
- (modified) llvm/test/Transforms/InstCombine/strchr-1.ll (+3-3)
- (modified) llvm/test/Transforms/InstCombine/strchr-3.ll (+6-6)
- (modified) llvm/test/Transforms/InstCombine/strcmp-4.ll (+2-2)
- (modified) llvm/test/Transforms/InstCombine/strlcpy-1.ll (+2-2)
- (modified) llvm/test/Transforms/InstCombine/strlen-1.ll (+1-1)
- (modified) llvm/test/Transforms/InstCombine/strlen-6.ll (+9-9)
- (modified) llvm/test/Transforms/InstCombine/strpbrk-1.ll (+1-1)
- (modified) llvm/test/Transforms/InstCombine/strrchr-1.ll (+3-3)
- (modified) llvm/test/Transforms/InstCombine/strrchr-3.ll (+4-4)
- (modified) llvm/test/Transforms/InstCombine/strstr-1.ll (+1-1)
- (modified) llvm/test/Transforms/InstCombine/vec_demanded_elts-inseltpoison.ll (+1-1)
- (modified) llvm/test/Transforms/InstCombine/vec_demanded_elts.ll (+1-1)
- (modified) llvm/test/Transforms/InstCombine/wcslen-1.ll (+2-2)
- (modified) llvm/test/Transforms/InstSimplify/ConstProp/gep-constanfolding-error.ll (+1-1)
- (modified) llvm/test/Transforms/InstSimplify/ConstProp/gep.ll (+2-2)
- (modified) llvm/test/Transforms/InstSimplify/ConstProp/icmp-global.ll (+3-3)
- (modified) llvm/test/Transforms/InstSimplify/compare.ll (+1-1)
- (modified) llvm/test/Transforms/InstSimplify/past-the-end.ll (+2-2)
- (modified) llvm/test/Transforms/InstSimplify/simplify-nested-bitcast.ll (+1-1)
- (modified) llvm/test/Transforms/LoopVectorize/X86/pr42674.ll (+1-1)
- (modified) llvm/test/Transforms/NewGVN/loadforward.ll (+1-1)
- (modified) llvm/test/Transforms/PhaseOrdering/SystemZ/sub-xor.ll (+24-24)
- (modified) llvm/test/Transforms/PhaseOrdering/X86/excessive-unrolling.ll (+84-84)
- (modified) llvm/test/Transforms/SCCP/2009-09-24-byval-ptr.ll (+1-1)
- (modified) llvm/test/Transforms/SCCP/apint-bigint2.ll (+2-2)
- (modified) llvm/test/Transforms/SLPVectorizer/AArch64/gather-cost.ll (+4-4)
- (modified) llvm/test/Transforms/SLPVectorizer/X86/pr47623.ll (+10-10)
``````````diff
diff --git a/clang/test/CodeGen/RISCV/riscv-inline-asm.c b/clang/test/CodeGen/RISCV/riscv-inline-asm.c
index de90e513ea1ff1..9da306807ed0dc 100644
--- a/clang/test/CodeGen/RISCV/riscv-inline-asm.c
+++ b/clang/test/CodeGen/RISCV/riscv-inline-asm.c
@@ -90,9 +90,9 @@ extern int var, arr[2][2];
struct Pair { int a, b; } pair;
// CHECK-LABEL: test_s(
-// CHECK: call void asm sideeffect "// $0 $1 $2", "s,s,s"(ptr nonnull @var, ptr nonnull getelementptr inbounds (i8, ptr @arr, {{.*}}), ptr nonnull @test_s)
+// CHECK: call void asm sideeffect "// $0 $1 $2", "s,s,s"(ptr nonnull @var, ptr nonnull getelementptr inbounds nuw (i8, ptr @arr, {{.*}}), ptr nonnull @test_s)
// CHECK: call void asm sideeffect "// $0", "s"(ptr nonnull getelementptr inbounds nuw (i8, ptr @pair, {{.*}}))
-// CHECK: call void asm sideeffect "// $0 $1 $2", "S,S,S"(ptr nonnull @var, ptr nonnull getelementptr inbounds (i8, ptr @arr, {{.*}}), ptr nonnull @test_s)
+// CHECK: call void asm sideeffect "// $0 $1 $2", "S,S,S"(ptr nonnull @var, ptr nonnull getelementptr inbounds nuw (i8, ptr @arr, {{.*}}), ptr nonnull @test_s)
void test_s(void) {
asm("// %0 %1 %2" :: "s"(&var), "s"(&arr[1][1]), "s"(test_s));
asm("// %0" :: "s"(&pair.b));
diff --git a/clang/test/CodeGenCXX/auto-var-init.cpp b/clang/test/CodeGenCXX/auto-var-init.cpp
index cf92ad62d72844..94386e44573b5f 100644
--- a/clang/test/CodeGenCXX/auto-var-init.cpp
+++ b/clang/test/CodeGenCXX/auto-var-init.cpp
@@ -1338,7 +1338,7 @@ TEST_UNINIT(base, base);
// PATTERN-O0: call void @llvm.memcpy{{.*}} @__const.test_base_uninit.uninit{{.+}}), !annotation [[AUTO_INIT]]
// ZERO-LABEL: @test_base_uninit()
// ZERO-O0: call void @llvm.memset{{.*}}, i8 0,{{.+}}), !annotation [[AUTO_INIT]]
-// ZERO-O1: store ptr getelementptr inbounds inrange(-16, 16) (i8, ptr @_ZTV4base, i64 16), {{.*}}, align 8
+// ZERO-O1: store ptr getelementptr inbounds nuw inrange(-16, 16) (i8, ptr @_ZTV4base, i64 16), {{.*}}, align 8
// ZERO-O1-NOT: !annotation
TEST_BRACES(base, base);
@@ -1359,7 +1359,7 @@ TEST_UNINIT(derived, derived);
// ZERO-LABEL: @test_derived_uninit()
// ZERO-O0: call void @llvm.memset{{.*}}, i8 0, {{.+}}), !annotation [[AUTO_INIT]]
// ZERO-O1: store i64 0, {{.*}} align 8, !annotation [[AUTO_INIT]]
-// ZERO-O1: store ptr getelementptr inbounds inrange(-16, 16) (i8, ptr @_ZTV7derived, i64 16), {{.*}} align 8
+// ZERO-O1: store ptr getelementptr inbounds nuw inrange(-16, 16) (i8, ptr @_ZTV7derived, i64 16), {{.*}} align 8
TEST_BRACES(derived, derived);
// CHECK-LABEL: @test_derived_braces()
diff --git a/llvm/lib/Analysis/ConstantFolding.cpp b/llvm/lib/Analysis/ConstantFolding.cpp
index efbccee76f2c51..27f682d2400f93 100644
--- a/llvm/lib/Analysis/ConstantFolding.cpp
+++ b/llvm/lib/Analysis/ConstantFolding.cpp
@@ -952,7 +952,6 @@ Constant *SymbolicallyEvaluateGEP(const GEPOperator *GEP,
}
// Try to infer inbounds for GEPs of globals.
- // TODO(gep_nowrap): Also infer nuw flag.
if (!NW.isInBounds() && Offset.isNonNegative()) {
bool CanBeNull, CanBeFreed;
uint64_t DerefBytes =
@@ -961,6 +960,10 @@ Constant *SymbolicallyEvaluateGEP(const GEPOperator *GEP,
NW |= GEPNoWrapFlags::inBounds();
}
+ // nusw + nneg -> nuw
+ if (NW.hasNoUnsignedSignedWrap() && Offset.isNonNegative())
+ NW |= GEPNoWrapFlags::noUnsignedWrap();
+
// Otherwise canonicalize this to a single ptradd.
LLVMContext &Ctx = Ptr->getContext();
return ConstantExpr::getGetElementPtr(Type::getInt8Ty(Ctx), Ptr,
diff --git a/llvm/test/Other/constant-fold-gep.ll b/llvm/test/Other/constant-fold-gep.ll
index e0d535e6952730..a4c55c62840a6c 100644
--- a/llvm/test/Other/constant-fold-gep.ll
+++ b/llvm/test/Other/constant-fold-gep.ll
@@ -106,10 +106,10 @@
; PLAIN: @Y = global ptr getelementptr inbounds ([3 x { i32, i32 }], ptr getelementptr inbounds ([3 x { i32, i32 }], ptr @ext, i64 1), i64 1)
; PLAIN: @Z = global ptr getelementptr inbounds (i32, ptr getelementptr inbounds ([3 x { i32, i32 }], ptr @ext, i64 0, i64 1, i32 0), i64 1)
-; OPT: @Y = local_unnamed_addr global ptr getelementptr inbounds (i8, ptr @ext, i64 48)
-; OPT: @Z = local_unnamed_addr global ptr getelementptr inbounds (i8, ptr @ext, i64 12)
-; TO: @Y = local_unnamed_addr global ptr getelementptr inbounds (i8, ptr @ext, i64 48)
-; TO: @Z = local_unnamed_addr global ptr getelementptr inbounds (i8, ptr @ext, i64 12)
+; OPT: @Y = local_unnamed_addr global ptr getelementptr inbounds nuw (i8, ptr @ext, i64 48)
+; OPT: @Z = local_unnamed_addr global ptr getelementptr inbounds nuw (i8, ptr @ext, i64 12)
+; TO: @Y = local_unnamed_addr global ptr getelementptr inbounds nuw (i8, ptr @ext, i64 48)
+; TO: @Z = local_unnamed_addr global ptr getelementptr inbounds nuw (i8, ptr @ext, i64 12)
@ext = external global [3 x { i32, i32 }]
@Y = global ptr getelementptr inbounds ([3 x { i32, i32 }], ptr getelementptr inbounds ([3 x { i32, i32 }], ptr @ext, i64 1), i64 1)
@@ -433,10 +433,10 @@ define ptr @fO() nounwind {
; PLAIN: ret ptr %t
; PLAIN: }
; OPT: define ptr @fZ() local_unnamed_addr #0 {
-; OPT: ret ptr getelementptr inbounds (i8, ptr @ext, i64 12)
+; OPT: ret ptr getelementptr inbounds nuw (i8, ptr @ext, i64 12)
; OPT: }
; TO: define ptr @fZ() local_unnamed_addr #0 {
-; TO: ret ptr getelementptr inbounds (i8, ptr @ext, i64 12)
+; TO: ret ptr getelementptr inbounds nuw (i8, ptr @ext, i64 12)
; TO: }
; SCEV: Classifying expressions for: @fZ
; SCEV: %t = bitcast ptr getelementptr inbounds (i32, ptr getelementptr inbounds ([3 x { i32, i32 }], ptr @ext, i64 0, i64 1, i32 0), i64 1) to ptr
@@ -457,14 +457,14 @@ define ptr @different_addrspace() nounwind noinline {
%p = getelementptr inbounds i8, ptr addrspacecast (ptr addrspace(12) @p12 to ptr),
i32 2
ret ptr %p
-; OPT: ret ptr getelementptr inbounds (i8, ptr addrspacecast (ptr addrspace(12) @p12 to ptr), i64 2)
+; OPT: ret ptr getelementptr inbounds nuw (i8, ptr addrspacecast (ptr addrspace(12) @p12 to ptr), i64 2)
}
define ptr @same_addrspace() nounwind noinline {
; OPT: same_addrspace
%p = getelementptr inbounds i8, ptr @p0, i32 2
ret ptr %p
-; OPT: ret ptr getelementptr inbounds (i8, ptr @p0, i64 2)
+; OPT: ret ptr getelementptr inbounds nuw (i8, ptr @p0, i64 2)
}
@gv1 = internal global i32 1
diff --git a/llvm/test/Other/optimize-inrange-gep.ll b/llvm/test/Other/optimize-inrange-gep.ll
index 66cf7f2c17f98e..6dea44005353c6 100644
--- a/llvm/test/Other/optimize-inrange-gep.ll
+++ b/llvm/test/Other/optimize-inrange-gep.ll
@@ -20,7 +20,7 @@ define void @foo(ptr %p) {
;
; CHECK-LABEL: define void @foo(
; CHECK-SAME: ptr nocapture writeonly initializes((0, 8)) [[P:%.*]]) local_unnamed_addr #[[ATTR0:[0-9]+]] {
-; CHECK-NEXT: store ptr getelementptr inbounds inrange(-24, 0) (i8, ptr @vtable, i64 24), ptr [[P]], align 8
+; CHECK-NEXT: store ptr getelementptr inbounds nuw inrange(-24, 0) (i8, ptr @vtable, i64 24), ptr [[P]], align 8
; CHECK-NEXT: ret void
;
store ptr getelementptr inrange(-24, 0) ({ [3 x ptr], [3 x ptr] }, ptr @vtable, i32 0, i32 0, i32 3), ptr %p
diff --git a/llvm/test/Transforms/FunctionSpecialization/function-specialization-constant-expression.ll b/llvm/test/Transforms/FunctionSpecialization/function-specialization-constant-expression.ll
index 0c24169d02c2c5..0e0854c8807c2e 100644
--- a/llvm/test/Transforms/FunctionSpecialization/function-specialization-constant-expression.ll
+++ b/llvm/test/Transforms/FunctionSpecialization/function-specialization-constant-expression.ll
@@ -30,13 +30,13 @@ define internal i64 @zoo(i1 %flag) {
; CHECK-NEXT: entry:
; CHECK-NEXT: br i1 [[FLAG:%.*]], label [[PLUS:%.*]], label [[MINUS:%.*]]
; CHECK: plus:
-; CHECK-NEXT: [[TMP0:%.*]] = call i64 @func2.specialized.2(ptr getelementptr inbounds (i8, ptr @Global, i64 8))
+; CHECK-NEXT: [[TMP0:%.*]] = call i64 @func2.specialized.2(ptr getelementptr inbounds nuw (i8, ptr @Global, i64 8))
; CHECK-NEXT: br label [[MERGE:%.*]]
; CHECK: minus:
-; CHECK-NEXT: [[TMP1:%.*]] = call i64 @func2.specialized.1(ptr getelementptr inbounds (i8, ptr @Global, i64 16))
+; CHECK-NEXT: [[TMP1:%.*]] = call i64 @func2.specialized.1(ptr getelementptr inbounds nuw (i8, ptr @Global, i64 16))
; CHECK-NEXT: br label [[MERGE]]
; CHECK: merge:
-; CHECK-NEXT: [[TMP2:%.*]] = phi i64 [ ptrtoint (ptr getelementptr inbounds (i8, ptr @Global, i64 8) to i64), [[PLUS]] ], [ ptrtoint (ptr getelementptr inbounds (i8, ptr @Global, i64 16) to i64), [[MINUS]] ]
+; CHECK-NEXT: [[TMP2:%.*]] = phi i64 [ ptrtoint (ptr getelementptr inbounds nuw (i8, ptr @Global, i64 8) to i64), [[PLUS]] ], [ ptrtoint (ptr getelementptr inbounds nuw (i8, ptr @Global, i64 16) to i64), [[MINUS]] ]
; CHECK-NEXT: ret i64 [[TMP2]]
;
entry:
diff --git a/llvm/test/Transforms/GVN/PRE/load-pre-licm.ll b/llvm/test/Transforms/GVN/PRE/load-pre-licm.ll
index 6a05d5b17dde86..7028edb4732bdd 100644
--- a/llvm/test/Transforms/GVN/PRE/load-pre-licm.ll
+++ b/llvm/test/Transforms/GVN/PRE/load-pre-licm.ll
@@ -8,7 +8,7 @@ target triple = "i386-apple-darwin11.0.0"
define void @Bubble() nounwind noinline {
; CHECK-LABEL: @Bubble(
; CHECK-NEXT: entry:
-; CHECK-NEXT: [[TMP7_PRE:%.*]] = load i32, ptr getelementptr inbounds (i8, ptr @sortlist, i32 4), align 4
+; CHECK-NEXT: [[TMP7_PRE:%.*]] = load i32, ptr getelementptr inbounds nuw (i8, ptr @sortlist, i32 4), align 4
; CHECK-NEXT: br label [[WHILE_BODY5:%.*]]
; CHECK: while.body5:
; CHECK-NEXT: [[TMP7:%.*]] = phi i32 [ [[TMP7_PRE]], [[ENTRY:%.*]] ], [ [[TMP71:%.*]], [[IF_END:%.*]] ]
diff --git a/llvm/test/Transforms/GVN/PRE/phi-translate-2.ll b/llvm/test/Transforms/GVN/PRE/phi-translate-2.ll
index 39790f4cddbb7a..a38d3e50a61218 100644
--- a/llvm/test/Transforms/GVN/PRE/phi-translate-2.ll
+++ b/llvm/test/Transforms/GVN/PRE/phi-translate-2.ll
@@ -63,8 +63,8 @@ define void @test2(i64 %i) {
; CHECK: if.then:
; CHECK-NEXT: [[CALL:%.*]] = tail call i64 (...) @goo()
; CHECK-NEXT: store i64 [[CALL]], ptr @g2, align 8
-; CHECK-NEXT: [[T2_PRE:%.*]] = load i64, ptr getelementptr inbounds (i8, ptr @a, i64 24), align 8
-; CHECK-NEXT: [[T3_PRE:%.*]] = load i64, ptr getelementptr inbounds (i8, ptr @b, i64 24), align 8
+; CHECK-NEXT: [[T2_PRE:%.*]] = load i64, ptr getelementptr inbounds nuw (i8, ptr @a, i64 24), align 8
+; CHECK-NEXT: [[T3_PRE:%.*]] = load i64, ptr getelementptr inbounds nuw (i8, ptr @b, i64 24), align 8
; CHECK-NEXT: [[DOTPRE:%.*]] = mul nsw i64 [[T3_PRE]], [[T2_PRE]]
; CHECK-NEXT: br label [[IF_END]]
; CHECK: if.end:
@@ -272,7 +272,7 @@ define void @test6(ptr %ptr, i1 %arg) {
; CHECK-NEXT: br label [[IF_END]]
; CHECK: if.end:
; CHECK-NEXT: [[TMP2]] = phi i32 [ [[TMP0]], [[IF_THEN]] ], [ [[TMP1]], [[WHILE]] ]
-; CHECK-NEXT: br i1 %arg, label [[WHILE_END:%.*]], label [[WHILE]]
+; CHECK-NEXT: br i1 [[ARG:%.*]], label [[WHILE_END:%.*]], label [[WHILE]]
; CHECK: while.end:
; CHECK-NEXT: ret void
;
diff --git a/llvm/test/Transforms/IndVarSimplify/eliminate-exit-no-dl.ll b/llvm/test/Transforms/IndVarSimplify/eliminate-exit-no-dl.ll
index a3c4002626a705..3f75d0c9880f85 100644
--- a/llvm/test/Transforms/IndVarSimplify/eliminate-exit-no-dl.ll
+++ b/llvm/test/Transforms/IndVarSimplify/eliminate-exit-no-dl.ll
@@ -14,7 +14,7 @@ define void @foo() {
; CHECK-NEXT: bb:
; CHECK-NEXT: br label [[BB3:%.*]]
; CHECK: bb3:
-; CHECK-NEXT: [[TMP6:%.*]] = load i8, ptr getelementptr inbounds (i8, ptr @global, i64 1), align 1
+; CHECK-NEXT: [[TMP6:%.*]] = load i8, ptr getelementptr inbounds nuw (i8, ptr @global, i64 1), align 1
; CHECK-NEXT: br i1 false, label [[BB7:%.*]], label [[BB11:%.*]]
; CHECK: bb7:
; CHECK-NEXT: [[TMP8:%.*]] = zext i8 [[TMP6]] to i64
diff --git a/llvm/test/Transforms/IndVarSimplify/floating-point-small-iv.ll b/llvm/test/Transforms/IndVarSimplify/floating-point-small-iv.ll
index bebd314f7375ab..90d84eb5a1add5 100644
--- a/llvm/test/Transforms/IndVarSimplify/floating-point-small-iv.ll
+++ b/llvm/test/Transforms/IndVarSimplify/floating-point-small-iv.ll
@@ -357,7 +357,7 @@ define void @uitofp_fptoui_range_with_negative() {
; CHECK-NEXT: entry:
; CHECK-NEXT: br label [[FOR_BODY:%.*]]
; CHECK: for.body:
-; CHECK-NEXT: store i32 100, ptr getelementptr inbounds (i8, ptr @array, i64 400), align 4
+; CHECK-NEXT: store i32 100, ptr getelementptr inbounds nuw (i8, ptr @array, i64 400), align 4
; CHECK-NEXT: br i1 false, label [[FOR_BODY]], label [[CLEANUP:%.*]]
; CHECK: cleanup:
; CHECK-NEXT: ret void
@@ -418,7 +418,7 @@ define void @uitofp_fptosi_range_with_negative () {
; CHECK-NEXT: entry:
; CHECK-NEXT: br label [[FOR_BODY:%.*]]
; CHECK: for.body:
-; CHECK-NEXT: store i32 100, ptr getelementptr inbounds (i8, ptr @array, i64 400), align 4
+; CHECK-NEXT: store i32 100, ptr getelementptr inbounds nuw (i8, ptr @array, i64 400), align 4
; CHECK-NEXT: br i1 false, label [[FOR_BODY]], label [[CLEANUP:%.*]]
; CHECK: cleanup:
; CHECK-NEXT: ret void
diff --git a/llvm/test/Transforms/InstCombine/addrspacecast.ll b/llvm/test/Transforms/InstCombine/addrspacecast.ll
index 35a1066a6b31c2..00df5450640695 100644
--- a/llvm/test/Transforms/InstCombine/addrspacecast.ll
+++ b/llvm/test/Transforms/InstCombine/addrspacecast.ll
@@ -141,7 +141,7 @@ define i32 @memcpy_addrspacecast() nounwind {
; CHECK-NEXT: [[I:%.*]] = phi i32 [ 0, [[ENTRY:%.*]] ], [ [[I_INC:%.*]], [[LOOP_BODY]] ]
; CHECK-NEXT: [[SUM:%.*]] = phi i32 [ 0, [[ENTRY]] ], [ [[SUM_INC:%.*]], [[LOOP_BODY]] ]
; CHECK-NEXT: [[TMP0:%.*]] = trunc i32 [[I]] to i16
-; CHECK-NEXT: [[PTR:%.*]] = getelementptr i8, ptr addrspace(2) getelementptr inbounds (i8, ptr addrspace(2) @const_array, i16 4), i16 [[TMP0]]
+; CHECK-NEXT: [[PTR:%.*]] = getelementptr i8, ptr addrspace(2) getelementptr inbounds nuw (i8, ptr addrspace(2) @const_array, i16 4), i16 [[TMP0]]
; CHECK-NEXT: [[LOAD:%.*]] = load i8, ptr addrspace(2) [[PTR]], align 1
; CHECK-NEXT: [[EXT:%.*]] = zext i8 [[LOAD]] to i32
; CHECK-NEXT: [[SUM_INC]] = add i32 [[SUM]], [[EXT]]
diff --git a/llvm/test/Transforms/InstCombine/align-addr.ll b/llvm/test/Transforms/InstCombine/align-addr.ll
index 58647dc9595d82..6ef4d85fe4e412 100644
--- a/llvm/test/Transforms/InstCombine/align-addr.ll
+++ b/llvm/test/Transforms/InstCombine/align-addr.ll
@@ -81,7 +81,7 @@ define <16 x i8> @test1_as1(<2 x i64> %x) {
define <16 x i8> @test1_as1_gep(<2 x i64> %x) {
; CHECK-LABEL: @test1_as1_gep(
-; CHECK-NEXT: [[TMP:%.*]] = load <16 x i8>, ptr addrspace(1) getelementptr inbounds (i8, ptr addrspace(1) @GLOBAL_as1_gep, i32 16), align 1
+; CHECK-NEXT: [[TMP:%.*]] = load <16 x i8>, ptr addrspace(1) getelementptr inbounds nuw (i8, ptr addrspace(1) @GLOBAL_as1_gep, i32 16), align 1
; CHECK-NEXT: ret <16 x i8> [[TMP]]
;
%tmp = load <16 x i8>, ptr addrspace(1) getelementptr ([8 x i32], ptr addrspace(1) @GLOBAL_as1_gep, i16 0, i16 4), align 1
diff --git a/llvm/test/Transforms/InstCombine/binop-select-cast-of-select-cond.ll b/llvm/test/Transforms/InstCombine/binop-select-cast-of-select-cond.ll
index a3cd0328e9b590..41367d55d8894a 100644
--- a/llvm/test/Transforms/InstCombine/binop-select-cast-of-select-cond.ll
+++ b/llvm/test/Transforms/InstCombine/binop-select-cast-of-select-cond.ll
@@ -231,7 +231,7 @@ define <2 x i8> @vectorized_add(<2 x i1> %c, <2 x i8> %arg) {
define i64 @pr64669(i64 %a) {
; CHECK-LABEL: define i64 @pr64669
; CHECK-SAME: (i64 [[A:%.*]]) {
-; CHECK-NEXT: [[CMP_NOT:%.*]] = icmp eq ptr getelementptr inbounds (i8, ptr @b, i64 100), @c
+; CHECK-NEXT: [[CMP_NOT:%.*]] = icmp eq ptr getelementptr inbounds nuw (i8, ptr @b, i64 100), @c
; CHECK-NEXT: [[TMP1:%.*]] = add i64 [[A]], 1
; CHECK-NEXT: [[ADD:%.*]] = select i1 [[CMP_NOT]], i64 0, i64 [[TMP1]]
; CHECK-NEXT: ret i64 [[ADD]]
diff --git a/llvm/test/Transforms/InstCombine/canonicalize-gep-constglob.ll b/llvm/test/Transforms/InstCombine/canonicalize-gep-constglob.ll
index 53585dfde48b22..1520d6ce59548d 100644
--- a/llvm/test/Transforms/InstCombine/canonicalize-gep-constglob.ll
+++ b/llvm/test/Transforms/InstCombine/canonicalize-gep-constglob.ll
@@ -8,7 +8,7 @@ define ptr @x12(i64 %x) {
; CHECK-SAME: i64 [[X:%.*]]) {
; CHECK-NEXT: entry:
; CHECK-NEXT: [[GEP_IDX:%.*]] = mul nsw i64 [[X]], 400
-; CHECK-NEXT: [[GEP:%.*]] = getelementptr i8, ptr getelementptr inbounds (i8, ptr @glob, i64 84), i64 [[GEP_IDX]]
+; CHECK-NEXT: [[GEP:%.*]] = getelementptr i8, ptr getelementptr inbounds nuw (i8, ptr @glob, i64 84), i64 [[GEP_IDX]]
; CHECK-NEXT: ret ptr [[GEP]]
;
entry:
@@ -22,7 +22,7 @@ define ptr @x1y(i64 %x, i64 %y) {
; CHECK-NEXT: entry:
; CHECK-NEXT: [[GEP_IDX:%.*]] = mul nsw i64 [[X]], 400
; CHECK-NEXT: [[GEP_IDX1:%.*]] = shl nsw i64 [[Y]], 2
-; CHECK-NEXT: [[TMP0:%.*]] = getelementptr i8, ptr getelementptr inbounds (i8, ptr @glob, i64 116), i64 [[GEP_IDX]]
+; CHECK-NEXT: [[TMP0:%.*]] = getelementptr i8, ptr getelementptr inbounds nuw (i8, ptr @glob, i64 116), i64 [[GEP_IDX]]
; CHECK-NEXT: [[GEP:%.*]] = getelementptr i8, ptr [[TMP0]], i64 [[GEP_IDX1]]
; CHECK-NEXT: ret ptr [[GEP]]
;
@@ -35,7 +35,7 @@ define ptr @xzy(i64 %x, i64 %y, i64 %z) {
; CHECK-LABEL: define ptr @xzy(
; CHECK-SAME: i64 [[X:%.*]], i64 [[Y:%.*]], i64 [[Z:%.*]]) {
; CHECK-NEXT: entry:
-; CHECK-NEXT: [[GEP:%.*]] = getelementptr inbounds [10 x [10 x [10 x i32]]], ptr getelementptr inbounds (i8, ptr @glob, i64 40), i64 0, i64 [[X]], i64 [[Z]], i64 [[Y]]
+; CHECK-NEXT: [[GEP:%.*]] = getelementptr inbounds [10 x [10 x [10 x i32]]], ptr getelementptr inbounds nuw (i8, ptr @glob, i64 40), i64 0, i64 [[X]], i64 [[Z]], i64 [[Y]]
; CHECK-NEXT: ret ptr [[GEP]]
;
entry:
@@ -47,7 +47,7 @@ define ptr @zerox(i64 %x) {
; CHECK-LABEL: define ptr @zerox(
; CHECK-SAME: i64 [[X:%.*]]) {
; CHECK-NEXT: entry:
-; CHECK-NEXT: [[GEP:%.*]] = getelementptr inbounds [10 x i32], ptr getelementptr inbounds (i8, ptr @glob, i64 32), i64 0, i64 [[X]]
+; CHECK-NEXT: [[GEP:%.*]] = getelementptr inbounds [10 x i32], ptr getelementptr inbounds nuw (i8, ptr @glob, i64 32), i64 0, i64 [[X]]
; CHECK-NEXT: ret ptr [[GEP]]
;
entry:
@@ -60,9 +60,9 @@ define i32 @twoloads(i64 %x) {
; CHECK-SAME: i64 [[X:%.*]]) {
; CHECK-NEXT: entry:
; CHECK-NEXT: [[GEP1_IDX:%.*]] = mul nsw i64 [[X]], 400
-; CHECK-NEXT: [[GEP1:%.*]] = getelementptr i8, ptr getelementptr inbounds (i8, ptr @glob, i64 134), i64 [[GEP1_IDX]]
+; CHECK-NEXT: [[GEP1:%.*]] = getelementptr i8, ptr getelementptr inbounds nuw (i8, ptr @glob, i64 134), i64 [[GEP1_IDX]]
; CHECK-NEXT: [[GEP2_IDX:%.*]] = mul nsw i64 [[X]], 400
-; CHECK-NEXT: [[GEP2:%.*]] = getelementptr i8, ptr getelementptr inbounds (i8, ptr @glob, i64 132), i64 [[GEP2_IDX]]
+; CHECK-NEXT: [[GEP2:%.*]] = getelementptr i8, ptr getelementptr inbounds nuw (i8, ptr @glob, i64 132), i64 [[GEP2_IDX]]
; CHECK-NEXT: [[A:%.*]] = load i32, ptr [[GEP1]], align 4
; CHECK-NEXT: [[B:%.*]] = load i32, ptr [[GEP2]], align 4
; CHECK-NEXT: [[C:%.*]] = add i32 [[A]], [[B]]
diff --git a/llvm/test/Transforms/InstCombine/constant-fold-address-space-pointer.ll b/llvm/test/Transforms/InstCombine/constant-fold-address-space-pointer.ll
index dafe3900fef3b7..81052194b6b95a 100644
--- a/llvm/test/Transforms/InstCombine/constant-fold-address-space-pointer.ll
+++ b/llvm/test/Transforms/InstCombine/constant-fold-address-space-pointer.ll
@@ -225,7 +225,7 @@ define i32 @test_cast_gep_large_indices_as() {
define i32 @test_constant_cast_gep_struct_indices_as() {
; CHECK-LABEL: @test_constant_cast_gep_struct_indices_as(
-; CHECK-NEXT: [[Y:%.*]] = load i32, ptr addrspace(3) getelementptr inbounds (i8, ptr addrspace(3) @constant_fold_global_ptr, i16 16), align 4
+; CHECK-NEXT: [[Y:%.*]] = load i32, ptr addrspace(3) getelementptr inbounds nuw (i8, ptr addrspace(3) @constant_fold_global_ptr, i16 16), align 4
; CHECK-NEXT: ret i32 [[Y]]
;
%x = getelementptr %struct.foo, ptr addrspace(3) @constant_fold_global_ptr, i18 0, i32 2, i12 2
diff --git a/llvm/test/Transforms/InstCombine/constant-fold-gep.ll b/llvm/test/Transforms/InstCombine/constant-fold-gep.ll
index 54b7a6f66ecd2a..321b97f557735f 100644
--- a/llvm/test/Transforms/InstCombine/constant-fold-gep.ll
+++ b/llvm/test/Transforms/InstCombine/constant-fold-gep.ll
@@ -12,24 +12,24 @@ target dat...
[truncated]
``````````
</details>
https://github.com/llvm/llvm-project/pull/119214
More information about the llvm-commits
mailing list