[llvm] [CVP] Remove Zero-Index GEP (PR #144831)

via llvm-commits llvm-commits at lists.llvm.org
Wed Jun 18 21:01:10 PDT 2025


llvmbot wrote:


<!--LLVM PR SUMMARY COMMENT-->

@llvm/pr-subscribers-llvm-transforms

Author: Veera (veera-sivarajan)

<details>
<summary>Changes</summary>

Fixes: #<!-- -->137168

Proof: https://alive2.llvm.org/ce/z/Xoyiar

Replaces all uses of a GEP with its base pointer when all its indices are known to be in the range [0, 1).

This is the same transform as https://github.com/llvm/llvm-project/commit/87a0b1bd233a3680c32a6e17acf147d0fe90c9e9 but in CVP.

---
Full diff: https://github.com/llvm/llvm-project/pull/144831.diff


2 Files Affected:

- (modified) llvm/lib/Transforms/Scalar/CorrelatedValuePropagation.cpp (+21) 
- (added) llvm/test/Transforms/CorrelatedValuePropagation/gep.ll (+45) 


``````````diff
diff --git a/llvm/lib/Transforms/Scalar/CorrelatedValuePropagation.cpp b/llvm/lib/Transforms/Scalar/CorrelatedValuePropagation.cpp
index 4627f537dc16b..11a3a35d1ae7c 100644
--- a/llvm/lib/Transforms/Scalar/CorrelatedValuePropagation.cpp
+++ b/llvm/lib/Transforms/Scalar/CorrelatedValuePropagation.cpp
@@ -47,6 +47,7 @@ using namespace llvm;
 
 #define DEBUG_TYPE "correlated-value-propagation"
 
+STATISTIC(NumGEPs,      "Number of geps propagated");
 STATISTIC(NumPhis,      "Number of phis propagated");
 STATISTIC(NumPhiCommon, "Number of phis deleted via common incoming value");
 STATISTIC(NumSelects,   "Number of selects propagated");
@@ -1252,6 +1253,23 @@ static bool processTrunc(TruncInst *TI, LazyValueInfo *LVI) {
   return Changed;
 }
 
+// remove a GEP if all indices are in range [0, 1)
+static bool processGEP(GetElementPtrInst *GEP, LazyValueInfo *LVI) {
+  for (unsigned i = 1, e = GEP->getNumOperands(); i != e; ++i) {
+    ConstantRange Range = LVI->getConstantRangeAtUse(GEP->getOperandUse(i),
+                                                     /*UndefAllowed=*/false);
+    const APInt *C = Range.getSingleElement();
+    if (!C || !C->isZero())
+      return false;
+  }
+
+  // all indices are zero
+  Value *Ptr = GEP->getPointerOperand();
+  GEP->replaceAllUsesWith(Ptr);
+  ++NumGEPs;
+  return true;
+}
+
 static bool runImpl(Function &F, LazyValueInfo *LVI, DominatorTree *DT,
                     const SimplifyQuery &SQ) {
   bool FnChanged = false;
@@ -1318,6 +1336,9 @@ static bool runImpl(Function &F, LazyValueInfo *LVI, DominatorTree *DT,
       case Instruction::Trunc:
         BBChanged |= processTrunc(cast<TruncInst>(&II), LVI);
         break;
+      case Instruction::GetElementPtr:
+        BBChanged |= processGEP(cast<GetElementPtrInst>(&II), LVI);
+        break;
       }
     }
 
diff --git a/llvm/test/Transforms/CorrelatedValuePropagation/gep.ll b/llvm/test/Transforms/CorrelatedValuePropagation/gep.ll
new file mode 100644
index 0000000000000..d5c122b3f665e
--- /dev/null
+++ b/llvm/test/Transforms/CorrelatedValuePropagation/gep.ll
@@ -0,0 +1,45 @@
+; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --version 5
+; RUN: opt < %s -passes=correlated-propagation -S | FileCheck %s
+
+define ptr @noop_gep(ptr %ptr, i8 range(i8 0, 1) %index) {
+; CHECK-LABEL: define ptr @noop_gep(
+; CHECK-SAME: ptr [[PTR:%.*]], i8 range(i8 0, 1) [[INDEX:%.*]]) {
+; CHECK-NEXT:    [[GEP:%.*]] = getelementptr i1, ptr [[PTR]], i8 [[INDEX]]
+; CHECK-NEXT:    ret ptr [[PTR]]
+;
+  %gep = getelementptr i1, ptr %ptr, i8 %index
+  ret ptr %gep
+}
+
+
+define ptr @noop_gep_with_constant(ptr %ptr, i8 range(i8 0, 1) %index) {
+; CHECK-LABEL: define ptr @noop_gep_with_constant(
+; CHECK-SAME: ptr [[PTR:%.*]], i8 range(i8 0, 1) [[INDEX:%.*]]) {
+; CHECK-NEXT:    [[GEP:%.*]] = getelementptr [2 x i1], ptr [[PTR]], i8 0, i8 [[INDEX]]
+; CHECK-NEXT:    ret ptr [[PTR]]
+;
+  %gep = getelementptr [2 x i1], ptr %ptr, i8 0, i8 %index
+  ret ptr %gep
+}
+
+
+define ptr @noop_gep_nonzero_index_negative(ptr %ptr, i8 range(i8 0, 2) %index) {
+; CHECK-LABEL: define ptr @noop_gep_nonzero_index_negative(
+; CHECK-SAME: ptr [[PTR:%.*]], i8 range(i8 0, 2) [[INDEX:%.*]]) {
+; CHECK-NEXT:    [[GEP:%.*]] = getelementptr i1, ptr [[PTR]], i8 [[INDEX]]
+; CHECK-NEXT:    ret ptr [[GEP]]
+;
+  %gep = getelementptr i1, ptr %ptr, i8 %index
+  ret ptr %gep
+}
+
+
+define ptr @gep_no_range_negative(ptr %ptr, i8 %index) {
+; CHECK-LABEL: define ptr @gep_no_range_negative(
+; CHECK-SAME: ptr [[PTR:%.*]], i8 [[INDEX:%.*]]) {
+; CHECK-NEXT:    [[GEP:%.*]] = getelementptr i1, ptr [[PTR]], i8 [[INDEX]]
+; CHECK-NEXT:    ret ptr [[GEP]]
+;
+  %gep = getelementptr i1, ptr %ptr, i8 %index
+  ret ptr %gep
+}

``````````

</details>


https://github.com/llvm/llvm-project/pull/144831


More information about the llvm-commits mailing list