Skip to content

Commit

Permalink
[X86] Only allow f32, f64, or f80 to be used with 'f' inline assembly…
Browse files Browse the repository at this point in the history
… constraint.

Avoids crash when using i128. Gives better error than
'scalar-to-vector conversion failed' for other types.
  • Loading branch information
topperc committed May 13, 2020
1 parent e7bdfba commit 028bfdd
Show file tree
Hide file tree
Showing 2 changed files with 10 additions and 1 deletion.
4 changes: 3 additions & 1 deletion llvm/lib/Target/X86/X86ISelLowering.cpp
Expand Up @@ -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);
Expand Down
7 changes: 7 additions & 0 deletions llvm/test/CodeGen/X86/asm-reject-reg-type-mismatch.ll
Expand Up @@ -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
}

0 comments on commit 028bfdd

Please sign in to comment.