diff options
| author | Kalle Raiskila <kalle.raiskila@nokia.com> | 2011-03-04 12:00:11 +0000 |
|---|---|---|
| committer | Kalle Raiskila <kalle.raiskila@nokia.com> | 2011-03-04 12:00:11 +0000 |
| commit | 3531e9b0d947d0c49790eaab37c7f5d4fe35427d (patch) | |
| tree | e80fcb6bfa0e7a1763aac53805ed39cda20fe9e1 /llvm | |
| parent | e15d55366375794f66f479b248ed56b1aa5be3aa (diff) | |
| download | bcm5719-llvm-3531e9b0d947d0c49790eaab37c7f5d4fe35427d.tar.gz bcm5719-llvm-3531e9b0d947d0c49790eaab37c7f5d4fe35427d.zip | |
Allow load from constant on SPU.
A 'load <4 x i32>* null' crashes llc before this fix.
llvm-svn: 126995
Diffstat (limited to 'llvm')
| -rw-r--r-- | llvm/lib/Target/CellSPU/SPUISelDAGToDAG.cpp | 7 | ||||
| -rw-r--r-- | llvm/test/CodeGen/CellSPU/loads.ll | 7 | ||||
| -rw-r--r-- | llvm/test/CodeGen/CellSPU/stores.ll | 8 |
3 files changed, 21 insertions, 1 deletions
diff --git a/llvm/lib/Target/CellSPU/SPUISelDAGToDAG.cpp b/llvm/lib/Target/CellSPU/SPUISelDAGToDAG.cpp index d2261562e72..9351ffdc0b7 100644 --- a/llvm/lib/Target/CellSPU/SPUISelDAGToDAG.cpp +++ b/llvm/lib/Target/CellSPU/SPUISelDAGToDAG.cpp @@ -321,12 +321,17 @@ SPUDAGToDAGISel::SelectAFormAddr(SDNode *Op, SDValue N, SDValue &Base, // These match the addr256k operand type: EVT OffsVT = MVT::i16; SDValue Zero = CurDAG->getTargetConstant(0, OffsVT); + int64_t val; switch (N.getOpcode()) { case ISD::Constant: + val = dyn_cast<ConstantSDNode>(N.getNode())->getSExtValue(); + Base = CurDAG->getTargetConstant( val , MVT::i32); + Index = Zero; + return true; break; case ISD::ConstantPool: case ISD::GlobalAddress: - report_fatal_error("SPU SelectAFormAddr: Constant/Pool/Global not lowered."); + report_fatal_error("SPU SelectAFormAddr: Pool/Global not lowered."); /*NOTREACHED*/ case ISD::TargetConstant: diff --git a/llvm/test/CodeGen/CellSPU/loads.ll b/llvm/test/CodeGen/CellSPU/loads.ll index 03d7ad1153a..4771752f5f4 100644 --- a/llvm/test/CodeGen/CellSPU/loads.ll +++ b/llvm/test/CodeGen/CellSPU/loads.ll @@ -50,3 +50,10 @@ define i32 @load_misaligned( i32* %ptr ){ %rv = load i32* %ptr, align 2 ret i32 %rv } + +define <4 x i32> @load_null_vec( ) { +;CHECK: lqa +;CHECK: bi $lr + %rv = load <4 x i32>* null + ret <4 x i32> %rv +} diff --git a/llvm/test/CodeGen/CellSPU/stores.ll b/llvm/test/CodeGen/CellSPU/stores.ll index 7e0bf06b4e4..6ca5b089230 100644 --- a/llvm/test/CodeGen/CellSPU/stores.ll +++ b/llvm/test/CodeGen/CellSPU/stores.ll @@ -171,3 +171,11 @@ define void @store_v8( <8 x float> %val, <8 x float>* %ptr ) store <8 x float> %val, <8 x float>* %ptr ret void } + +define void @store_null_vec( <4 x i32> %val ) { +; FIXME - this is for some reason compiled into a il+stqd, not a sta. +;CHECK: stqd +;CHECK: bi $lr + store <4 x i32> %val, <4 x i32>* null + ret void +} |

