[llvm] 1c07ba6 - [SeparateConstOffsetFromGEP] Use getSigned() for accumulated offset

Nikita Popov via llvm-commits llvm-commits at lists.llvm.org
Fri Jan 9 01:22:52 PST 2026


Author: Nikita Popov
Date: 2026-01-09T10:22:41+01:00
New Revision: 1c07ba612d03b05b2ff72f36bd5da6b732f931e4

URL: https://github.com/llvm/llvm-project/commit/1c07ba612d03b05b2ff72f36bd5da6b732f931e4
DIFF: https://github.com/llvm/llvm-project/commit/1c07ba612d03b05b2ff72f36bd5da6b732f931e4.diff

LOG: [SeparateConstOffsetFromGEP] Use getSigned() for accumulated offset

It's a signed quantity.

Fixes the issue reported at:
https://github.com/llvm/llvm-project/pull/171456#issuecomment-3727345950

Added: 
    llvm/test/Transforms/SeparateConstOffsetFromGEP/negative-i32-offset.ll

Modified: 
    llvm/lib/Transforms/Scalar/SeparateConstOffsetFromGEP.cpp

Removed: 
    


################################################################################
diff  --git a/llvm/lib/Transforms/Scalar/SeparateConstOffsetFromGEP.cpp b/llvm/lib/Transforms/Scalar/SeparateConstOffsetFromGEP.cpp
index 333cbb6ed1384..dc47b243625b8 100644
--- a/llvm/lib/Transforms/Scalar/SeparateConstOffsetFromGEP.cpp
+++ b/llvm/lib/Transforms/Scalar/SeparateConstOffsetFromGEP.cpp
@@ -983,7 +983,7 @@ void SeparateConstOffsetFromGEP::lowerToSingleIndexGEPs(
 
   // Create a GEP with the constant offset index.
   if (AccumulativeByteOffset != 0) {
-    Value *Offset = ConstantInt::get(PtrIndexTy, AccumulativeByteOffset);
+    Value *Offset = ConstantInt::getSigned(PtrIndexTy, AccumulativeByteOffset);
     ResultPtr = Builder.CreatePtrAdd(ResultPtr, Offset, "uglygep");
   } else
     isSwapCandidate = false;

diff  --git a/llvm/test/Transforms/SeparateConstOffsetFromGEP/negative-i32-offset.ll b/llvm/test/Transforms/SeparateConstOffsetFromGEP/negative-i32-offset.ll
new file mode 100644
index 0000000000000..bdef0da85e82b
--- /dev/null
+++ b/llvm/test/Transforms/SeparateConstOffsetFromGEP/negative-i32-offset.ll
@@ -0,0 +1,16 @@
+; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --version 6
+; RUN: opt -S -passes='separate-const-offset-from-gep<lower-gep>' < %s | FileCheck %s
+target datalayout = "p:32:32"
+
+define ptr @test(ptr %p, i32 %a) {
+; CHECK-LABEL: define ptr @test(
+; CHECK-SAME: ptr [[P:%.*]], i32 [[A:%.*]]) {
+; CHECK-NEXT:    [[TMP1:%.*]] = shl i32 [[A]], 2
+; CHECK-NEXT:    [[UGLYGEP:%.*]] = getelementptr i8, ptr [[P]], i32 [[TMP1]]
+; CHECK-NEXT:    [[UGLYGEP2:%.*]] = getelementptr i8, ptr [[UGLYGEP]], i32 -4
+; CHECK-NEXT:    ret ptr [[UGLYGEP2]]
+;
+  %add = add i32 %a, -1
+  %gep = getelementptr i32, ptr %p, i32 %add
+  ret ptr %gep
+}


        


More information about the llvm-commits mailing list