From 028bfdd8913616f7a3e57e8ef5c2a9990e528ff0 Mon Sep 17 00:00:00 2001 From: Craig Topper Date: Wed, 13 May 2020 12:51:18 -0700 Subject: [PATCH] [X86] Only allow f32, f64, or f80 to be used with 'f' inline assembly constraint. Avoids crash when using i128. Gives better error than 'scalar-to-vector conversion failed' for other types. --- llvm/lib/Target/X86/X86ISelLowering.cpp | 4 +++- llvm/test/CodeGen/X86/asm-reject-reg-type-mismatch.ll | 7 +++++++ 2 files changed, 10 insertions(+), 1 deletion(-) diff --git a/llvm/lib/Target/X86/X86ISelLowering.cpp b/llvm/lib/Target/X86/X86ISelLowering.cpp index 34431fd..7cfdcf2 100644 --- a/llvm/lib/Target/X86/X86ISelLowering.cpp +++ b/llvm/lib/Target/X86/X86ISelLowering.cpp @@ -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); diff --git a/llvm/test/CodeGen/X86/asm-reject-reg-type-mismatch.ll b/llvm/test/CodeGen/X86/asm-reject-reg-type-mismatch.ll index a6f9f9a..7908493 100644 --- a/llvm/test/CodeGen/X86/asm-reject-reg-type-mismatch.ll +++ b/llvm/test/CodeGen/X86/asm-reject-reg-type-mismatch.ll @@ -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 +} -- 2.7.4