mirror of
https://github.com/RPCS3/llvm-mirror.git
synced 2024-11-23 19:23:23 +01:00
Don't fold address calculations which use negative offsets into
the ADDRspii addressing mode. llvm-svn: 62258
This commit is contained in:
parent
71ffa94e3f
commit
ce265d8cf9
@ -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;
|
||||
|
12
test/CodeGen/XCore/2009-01-08-Crash.ll
Normal file
12
test/CodeGen/XCore/2009-01-08-Crash.ll
Normal file
@ -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
Block a user