mirror of
https://github.com/RPCS3/llvm-mirror.git
synced 2024-12-14 23:29:51 +00:00
ARM: Negative offset support problem
This patch is to permit a negative offset usage for a non frame access. Patch by Igor Oblakov. llvm-svn: 217431
This commit is contained in:
parent
04bf7c7e7c
commit
024d56e8f8
@ -542,11 +542,11 @@ bool ARMDAGToDAGISel::SelectAddrModeImm12(SDValue N,
|
||||
}
|
||||
|
||||
if (ConstantSDNode *RHS = dyn_cast<ConstantSDNode>(N.getOperand(1))) {
|
||||
int RHSC = (int)RHS->getZExtValue();
|
||||
int RHSC = (int)RHS->getSExtValue();
|
||||
if (N.getOpcode() == ISD::SUB)
|
||||
RHSC = -RHSC;
|
||||
|
||||
if (RHSC >= 0 && RHSC < 0x1000) { // 12 bits (unsigned)
|
||||
if (RHSC > -0x1000 && RHSC < 0x1000) { // 12 bits
|
||||
Base = N.getOperand(0);
|
||||
if (Base.getOpcode() == ISD::FrameIndex) {
|
||||
int FI = cast<FrameIndexSDNode>(Base)->getIndex();
|
||||
|
17
test/CodeGen/ARM/negative-offset.ll
Normal file
17
test/CodeGen/ARM/negative-offset.ll
Normal file
@ -0,0 +1,17 @@
|
||||
; RUN: llc -mtriple=arm-eabi -O3 %s -o - | FileCheck %s
|
||||
|
||||
; Function Attrs: nounwind readonly
|
||||
define arm_aapcscc i32 @sum(i32* nocapture readonly %p) #0 {
|
||||
entry:
|
||||
;CHECK-LABEL: sum:
|
||||
;CHECK-NOT: sub
|
||||
;CHECK: ldr r{{.*}}, [r0, #-16]
|
||||
;CHECK: ldr r{{.*}}, [r0, #-8]
|
||||
%arrayidx = getelementptr inbounds i32* %p, i32 -4
|
||||
%0 = load i32* %arrayidx, align 4
|
||||
%arrayidx1 = getelementptr inbounds i32* %p, i32 -2
|
||||
%1 = load i32* %arrayidx1, align 4
|
||||
%add = add nsw i32 %1, %0
|
||||
ret i32 %add
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user