[llvm-branch-commits] [llvm] 4bae0d3 - [ARM] Fix incorrect post increment from Or (#188036)
Cullen Rhodes via llvm-branch-commits
llvm-branch-commits at lists.llvm.org
Mon Mar 30 07:57:29 PDT 2026
Author: David Green
Date: 2026-03-30T14:57:19Z
New Revision: 4bae0d33b2a46b9e05feca8241ac33eb5161cbdc
URL: https://github.com/llvm/llvm-project/commit/4bae0d33b2a46b9e05feca8241ac33eb5161cbdc
DIFF: https://github.com/llvm/llvm-project/commit/4bae0d33b2a46b9e05feca8241ac33eb5161cbdc.diff
LOG: [ARM] Fix incorrect post increment from Or (#188036)
If a Or is detected by findPointerConstIncrement but not by
getPointerConstIncrement it could use an invalid increment for the
offset. Protect against cases where getPointerConstIncrement cannot
return a valid offset.
Fixes #185677
(cherry picked from commit 5012b76ae273790340283084a3d0de96aeb54866)
Added:
Modified:
llvm/lib/Target/ARM/ARMISelLowering.cpp
llvm/test/CodeGen/ARM/vld2.ll
Removed:
################################################################################
diff --git a/llvm/lib/Target/ARM/ARMISelLowering.cpp b/llvm/lib/Target/ARM/ARMISelLowering.cpp
index 4fd845fbc07ac..d7c32d764a5fb 100644
--- a/llvm/lib/Target/ARM/ARMISelLowering.cpp
+++ b/llvm/lib/Target/ARM/ARMISelLowering.cpp
@@ -15997,25 +15997,27 @@ static SDValue CombineBaseUpdate(SDNode *N,
if (findPointerConstIncrement(Addr.getNode(), &Base, &CInc)) {
unsigned Offset =
getPointerConstIncrement(Addr->getOpcode(), Base, CInc, DCI.DAG);
- for (SDUse &Use : Base->uses()) {
+ if (Offset) {
+ for (SDUse &Use : Base->uses()) {
- SDNode *User = Use.getUser();
- if (Use.getResNo() != Base.getResNo() || User == Addr.getNode() ||
- User->getNumOperands() != 2)
- continue;
+ SDNode *User = Use.getUser();
+ if (Use.getResNo() != Base.getResNo() || User == Addr.getNode() ||
+ User->getNumOperands() != 2)
+ continue;
- SDValue UserInc = User->getOperand(Use.getOperandNo() == 0 ? 1 : 0);
- unsigned UserOffset =
- getPointerConstIncrement(User->getOpcode(), Base, UserInc, DCI.DAG);
+ SDValue UserInc = User->getOperand(Use.getOperandNo() == 0 ? 1 : 0);
+ unsigned UserOffset =
+ getPointerConstIncrement(User->getOpcode(), Base, UserInc, DCI.DAG);
- if (!UserOffset || UserOffset <= Offset)
- continue;
+ if (!UserOffset || UserOffset <= Offset)
+ continue;
- unsigned NewConstInc = UserOffset - Offset;
- SDValue NewInc = DCI.DAG.getConstant(NewConstInc, SDLoc(N), MVT::i32);
- BaseUpdates.push_back({User, NewInc, NewConstInc});
- if (BaseUpdates.size() >= MaxBaseUpdates)
- break;
+ unsigned NewConstInc = UserOffset - Offset;
+ SDValue NewInc = DCI.DAG.getConstant(NewConstInc, SDLoc(N), MVT::i32);
+ BaseUpdates.push_back({User, NewInc, NewConstInc});
+ if (BaseUpdates.size() >= MaxBaseUpdates)
+ break;
+ }
}
}
diff --git a/llvm/test/CodeGen/ARM/vld2.ll b/llvm/test/CodeGen/ARM/vld2.ll
index 5d8c020dc2608..55615d52acb70 100644
--- a/llvm/test/CodeGen/ARM/vld2.ll
+++ b/llvm/test/CodeGen/ARM/vld2.ll
@@ -194,13 +194,12 @@ define <4 x float> @vld2Qf(ptr %A) nounwind {
ret <4 x float> %tmp4
}
-; FIXME: Do not update with an invalid increment
define ptr @test_or_update(ptr %p, ptr %q) {
; CHECK-LABEL: test_or_update:
; CHECK: @ %bb.0:
-; CHECK-NEXT: orr r0, r0, #3
-; CHECK-NEXT: mov r2, #2
-; CHECK-NEXT: vld2.32 {d16, d17}, [r0], r2
+; CHECK-NEXT: orr r2, r0, #3
+; CHECK-NEXT: add r0, r0, #2
+; CHECK-NEXT: vld2.32 {d16, d17}, [r2]
; CHECK-NEXT: vstr d16, [r1]
; CHECK-NEXT: mov pc, lr
%p1 = ptrtoint ptr %p to i32
More information about the llvm-branch-commits
mailing list