[SelectionDAG] In PromoteFloatRes_BITCAST, insert a bitcast before the fp16_to_fp...
authorCraig Topper <craig.topper@intel.com>
Mon, 13 Aug 2018 05:26:49 +0000 (05:26 +0000)
committerCraig Topper <craig.topper@intel.com>
Mon, 13 Aug 2018 05:26:49 +0000 (05:26 +0000)
The bitcast can be further legalized as needed.

Fixes PR38533.

llvm-svn: 339533

llvm/lib/CodeGen/SelectionDAG/LegalizeFloatTypes.cpp
llvm/test/CodeGen/X86/pr38533.ll [new file with mode: 0644]

index 9aa0ea1..feca1c1 100644 (file)
@@ -1941,8 +1941,10 @@ void DAGTypeLegalizer::PromoteFloatResult(SDNode *N, unsigned ResNo) {
 SDValue DAGTypeLegalizer::PromoteFloatRes_BITCAST(SDNode *N) {
   EVT VT = N->getValueType(0);
   EVT NVT = TLI.getTypeToTransformTo(*DAG.getContext(), VT);
-  return DAG.getNode(GetPromotionOpcode(VT, NVT), SDLoc(N), NVT,
-                     N->getOperand(0));
+  // Input type isn't guaranteed to be i16 so bitcast if not. The bitcast
+  // will be legalized further if necessary.
+  SDValue Cast = DAG.getBitcast(MVT::i16, N->getOperand(0));
+  return DAG.getNode(GetPromotionOpcode(VT, NVT), SDLoc(N), NVT, Cast);
 }
 
 SDValue DAGTypeLegalizer::PromoteFloatRes_ConstantFP(SDNode *N) {
diff --git a/llvm/test/CodeGen/X86/pr38533.ll b/llvm/test/CodeGen/X86/pr38533.ll
new file mode 100644 (file)
index 0000000..4c57d84
--- /dev/null
@@ -0,0 +1,11 @@
+; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
+; RUN: llc < %s -mtriple=x86_64-unknown | FileCheck %s
+
+define void @constant_fold_vector_to_half() {
+; CHECK-LABEL: constant_fold_vector_to_half:
+; CHECK:       # %bb.0:
+; CHECK-NEXT:    movw $16384, (%rax) # imm = 0x4000
+; CHECK-NEXT:    retq
+  store volatile half bitcast (<4 x i4> <i4 0, i4 0, i4 0, i4 4> to half), half* undef
+  ret void
+}