forked from OSchip/llvm-project
Don't fold address calculations which use negative offsets into
the ADDRspii addressing mode. llvm-svn: 62258
This commit is contained in:
parent
502b91a35c
commit
40119780a8
|
@ -92,8 +92,8 @@ bool XCoreDAGToDAGISel::SelectADDRspii(SDValue Op, SDValue Addr,
|
|||
ConstantSDNode *CN = 0;
|
||||
if ((FIN = dyn_cast<FrameIndexSDNode>(Addr.getOperand(0)))
|
||||
&& (CN = dyn_cast<ConstantSDNode>(Addr.getOperand(1)))
|
||||
&& (CN->getSExtValue() % 4 == 0)) {
|
||||
// Constant word offset from frame pointer
|
||||
&& (CN->getSExtValue() % 4 == 0 && CN->getSExtValue() >= 0)) {
|
||||
// Constant positive word offset from frame index
|
||||
Base = CurDAG->getTargetFrameIndex(FIN->getIndex(), MVT::i32);
|
||||
Offset = CurDAG->getTargetConstant(CN->getSExtValue(), MVT::i32);
|
||||
return true;
|
||||
|
|
|
@ -0,0 +1,12 @@
|
|||
; RUN: llvm-as < %s | llc -march=xcore > %t1.s
|
||||
;; This caused a compilation failure since the
|
||||
;; address arithmetic was folded into the LDWSP instruction,
|
||||
;; resulting in a negative offset which eliminateFrameIndex was
|
||||
;; unable to eliminate.
|
||||
define i32 @test(i32 %bar) nounwind readnone {
|
||||
entry:
|
||||
%bar_addr = alloca i32
|
||||
%0 = getelementptr i32* %bar_addr, i32 -1
|
||||
%1 = load i32* %0, align 4
|
||||
ret i32 %1
|
||||
}
|
Loading…
Reference in New Issue