diff --git a/lib/Target/Hexagon/HexagonISelDAGToDAG.cpp b/lib/Target/Hexagon/HexagonISelDAGToDAG.cpp index b689d6c573d..e26374d3781 100644 --- a/lib/Target/Hexagon/HexagonISelDAGToDAG.cpp +++ b/lib/Target/Hexagon/HexagonISelDAGToDAG.cpp @@ -104,6 +104,7 @@ public: void SelectConstant(SDNode *N); void SelectConstantFP(SDNode *N); void SelectAdd(SDNode *N); + void SelectBitcast(SDNode *N); void SelectBitOp(SDNode *N); // XformMskToBitPosU5Imm - Returns the bit position which @@ -1165,6 +1166,22 @@ void HexagonDAGToDAGISel::SelectFrameIndex(SDNode *N) { } +void HexagonDAGToDAGISel::SelectBitcast(SDNode *N) { + EVT SVT = N->getOperand(0).getValueType(); + EVT DVT = N->getValueType(0); + if (!SVT.isVector() || !DVT.isVector() || + SVT.getVectorElementType() == MVT::i1 || + DVT.getVectorElementType() == MVT::i1 || + SVT.getSizeInBits() != DVT.getSizeInBits()) { + SelectCode(N); + return; + } + + CurDAG->ReplaceAllUsesOfValueWith(SDValue(N,0), N->getOperand(0)); + CurDAG->RemoveDeadNode(N); +} + + void HexagonDAGToDAGISel::Select(SDNode *N) { if (N->isMachineOpcode()) { N->setNodeId(-1); @@ -1188,6 +1205,10 @@ void HexagonDAGToDAGISel::Select(SDNode *N) { SelectAdd(N); return; + case ISD::BITCAST: + SelectBitcast(N); + return; + case ISD::SHL: SelectSHL(N); return; diff --git a/lib/Target/Hexagon/HexagonInstrInfoVector.td b/lib/Target/Hexagon/HexagonInstrInfoVector.td index 96dd5315b87..0277d5e3c28 100644 --- a/lib/Target/Hexagon/HexagonInstrInfoVector.td +++ b/lib/Target/Hexagon/HexagonInstrInfoVector.td @@ -35,61 +35,12 @@ multiclass bitconvert_64 { (a DoubleRegs:$src)>; } -multiclass bitconvert_vec { - def : Pat <(b (bitconvert (a VectorRegs:$src))), - (b VectorRegs:$src)>; - def : Pat <(a (bitconvert (b VectorRegs:$src))), - (a VectorRegs:$src)>; -} - -multiclass bitconvert_dblvec { - def : Pat <(b (bitconvert (a VecDblRegs:$src))), - (b VecDblRegs:$src)>; - def : Pat <(a (bitconvert (b VecDblRegs:$src))), - (a VecDblRegs:$src)>; -} - -multiclass bitconvert_predvec { - def : Pat <(b (bitconvert (a VecPredRegs:$src))), - (b VectorRegs:$src)>; - def : Pat <(a (bitconvert (b VectorRegs:$src))), - (a VecPredRegs:$src)>; -} - -multiclass bitconvert_dblvec128B { - def : Pat <(b (bitconvert (a VecDblRegs128B:$src))), - (b VecDblRegs128B:$src)>; - def : Pat <(a (bitconvert (b VecDblRegs128B:$src))), - (a VecDblRegs128B:$src)>; -} - -// Bit convert vector types. -defm : bitconvert_32; +// Bit convert vector types to integers. +defm : bitconvert_32; defm : bitconvert_32; -defm : bitconvert_32; - -defm : bitconvert_64; +defm : bitconvert_64; defm : bitconvert_64; defm : bitconvert_64; -defm : bitconvert_64; -defm : bitconvert_64; -defm : bitconvert_64; - -defm : bitconvert_vec; -defm : bitconvert_vec; -defm : bitconvert_vec; - -defm : bitconvert_dblvec; -defm : bitconvert_dblvec; -defm : bitconvert_dblvec; - -defm : bitconvert_dblvec128B; -defm : bitconvert_dblvec128B; -defm : bitconvert_dblvec128B; - -defm : bitconvert_dblvec128B; -defm : bitconvert_dblvec128B; -defm : bitconvert_dblvec128B; // Vector shift support. Vector shifting in Hexagon is rather different // from internal representation of LLVM. diff --git a/test/CodeGen/Hexagon/bitconvert-vector.ll b/test/CodeGen/Hexagon/bitconvert-vector.ll new file mode 100644 index 00000000000..c090721b8ff --- /dev/null +++ b/test/CodeGen/Hexagon/bitconvert-vector.ll @@ -0,0 +1,27 @@ +; RUN: llc -march=hexagon < %s | FileCheck %s + +; This testcase would fail on a bitcast from v64i16 to v32i32. Check that +; is compiles without errors. +; CHECK: valign +; CHECK: vshuff + +target triple = "hexagon" + +declare <32 x i32> @llvm.hexagon.V6.lo.128B(<64 x i32>) #0 +declare <64 x i32> @llvm.hexagon.V6.vshuffvdd.128B(<32 x i32>, <32 x i32>, i32) #0 +declare <32 x i32> @llvm.hexagon.V6.valignbi.128B(<32 x i32>, <32 x i32>, i32) #0 + +define void @fred() #1 { +entry: + %t0 = bitcast <64 x i16> zeroinitializer to <32 x i32> + %t1 = tail call <32 x i32> @llvm.hexagon.V6.valignbi.128B(<32 x i32> %t0, <32 x i32> undef, i32 2) + %t2 = tail call <64 x i32> @llvm.hexagon.V6.vshuffvdd.128B(<32 x i32> undef, <32 x i32> %t1, i32 -2) + %t3 = tail call <32 x i32> @llvm.hexagon.V6.lo.128B(<64 x i32> %t2) + store <64 x i16> zeroinitializer, <64 x i16>* undef, align 128 + store <32 x i32> %t3, <32 x i32>* undef, align 128 + unreachable +} + + +attributes #0 = { nounwind readnone } +attributes #1 = { nounwind "target-cpu"="hexagonv60" "target-features"="+hvx,+hvx-double" }