[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