[X86] Only allow f32, f64, or f80 to be used with 'f' inline assembly constraint.
authorCraig Topper <craig.topper@gmail.com>
Wed, 13 May 2020 19:51:18 +0000 (12:51 -0700)
committerCraig Topper <craig.topper@gmail.com>
Wed, 13 May 2020 20:27:13 +0000 (13:27 -0700)
Avoids crash when using i128. Gives better error than
'scalar-to-vector conversion failed' for other types.

llvm/lib/Target/X86/X86ISelLowering.cpp
llvm/test/CodeGen/X86/asm-reject-reg-type-mismatch.ll

index 34431fd..7cfdcf2 100644 (file)
@@ -48541,7 +48541,9 @@ X86TargetLowering::getRegForInlineAsmConstraint(const TargetRegisterInfo *TRI,
         return std::make_pair(0U, &X86::RFP32RegClass);
       if (VT == MVT::f64 && !isScalarFPTypeInSSEReg(VT))
         return std::make_pair(0U, &X86::RFP64RegClass);
-      return std::make_pair(0U, &X86::RFP80RegClass);
+      if (VT == MVT::f32 || VT == MVT::f64 || VT == MVT::f80)
+        return std::make_pair(0U, &X86::RFP80RegClass);
+      break;
     case 'y':   // MMX_REGS if MMX allowed.
       if (!Subtarget.hasMMX()) break;
       return std::make_pair(0U, &X86::VR64RegClass);
index a6f9f9a..7908493 100644 (file)
@@ -12,3 +12,10 @@ define void @fp80(x86_fp80) {
   tail call void asm sideeffect "", "r"(x86_fp80 %0)
   ret void
 }
+
+; CHECK: error: couldn't allocate input reg for constraint 'f'
+define void @f_constraint_i128(i128* %0) {
+  %2 = load i128, i128* %0, align 16
+  tail call void asm sideeffect "", "f"(i128 %2)
+  ret void
+}