diff options
| -rw-r--r-- | llvm/lib/Target/Hexagon/HexagonISelLowering.cpp | 3 | ||||
| -rw-r--r-- | llvm/test/CodeGen/Hexagon/isel-bitcast-v8i1-i8.ll | 18 |
2 files changed, 20 insertions, 1 deletions
diff --git a/llvm/lib/Target/Hexagon/HexagonISelLowering.cpp b/llvm/lib/Target/Hexagon/HexagonISelLowering.cpp index 8cdf06252ad..9fa7cead193 100644 --- a/llvm/lib/Target/Hexagon/HexagonISelLowering.cpp +++ b/llvm/lib/Target/Hexagon/HexagonISelLowering.cpp @@ -2902,7 +2902,8 @@ HexagonTargetLowering::ReplaceNodeResults(SDNode *N, if (N->getValueType(0) == MVT::i8) { SDValue P = getInstr(Hexagon::C2_tfrpr, dl, MVT::i32, N->getOperand(0), DAG); - Results.push_back(P); + SDValue T = DAG.getAnyExtOrTrunc(P, dl, MVT::i8); + Results.push_back(T); } break; } diff --git a/llvm/test/CodeGen/Hexagon/isel-bitcast-v8i1-i8.ll b/llvm/test/CodeGen/Hexagon/isel-bitcast-v8i1-i8.ll new file mode 100644 index 00000000000..37b82433dd7 --- /dev/null +++ b/llvm/test/CodeGen/Hexagon/isel-bitcast-v8i1-i8.ll @@ -0,0 +1,18 @@ +; RUN: llc -march=hexagon < %s | FileCheck %s +; REQUIRES: asserts + +; Check that this doesn't crash. +; CHECK-LABEL: foo: +; CHECK: p[[P:[0-3]]] = vcmpb.eq +; CHECK: r[[R:[0-9]+]] = p[[P]] +; CHECK: and(r[[R]],#32) + +define i32 @foo(<8 x i8> %a0, <8 x i8> %a1) #0 { + %v0 = icmp eq <8 x i8> %a0, %a1 + %v1 = bitcast <8 x i1> %v0 to i8 + %v2 = and i8 %v1, 32 + %v3 = zext i8 %v2 to i32 + ret i32 %v3 +} + +attributes #0 = { readnone nounwind } |

