From 6f8db0e1a786d055ca538daab564ed557111ac77 Mon Sep 17 00:00:00 2001 From: Matthias Braun Date: Mon, 8 Jun 2015 16:56:23 +0000 Subject: [PATCH] X86: Reject register operands with obvious type mismatches. While we have some code to transform specification like {ax} into {eax}/{rax} if the operand type isn't 16bit, we should reject cases where there is no sane way to do this, like the i128 type in the example. Related to rdar://21042280 Differential Revision: http://reviews.llvm.org/D10260 llvm-svn: 239309 --- llvm/lib/Target/X86/X86ISelLowering.cpp | 13 +++++++++++++ .../CodeGen/X86/asm-reject-reg-type-mismatch.ll | 10 ++++++++++ 2 files changed, 23 insertions(+) create mode 100644 llvm/test/CodeGen/X86/asm-reject-reg-type-mismatch.ll diff --git a/llvm/lib/Target/X86/X86ISelLowering.cpp b/llvm/lib/Target/X86/X86ISelLowering.cpp index 229795cbe4be..e3ec288a683e 100644 --- a/llvm/lib/Target/X86/X86ISelLowering.cpp +++ b/llvm/lib/Target/X86/X86ISelLowering.cpp @@ -25517,6 +25517,10 @@ X86TargetLowering::getRegForInlineAsmConstraint(const TargetRegisterInfo *TRI, Res.first = DestReg; Res.second = &X86::GR64RegClass; } + } else if (VT != MVT::Other) { + // Type mismatch and not a clobber: Return an error; + Res.first = 0; + Res.second = nullptr; } } else if (Res.second == &X86::FR32RegClass || Res.second == &X86::FR64RegClass || @@ -25542,6 +25546,15 @@ X86TargetLowering::getRegForInlineAsmConstraint(const TargetRegisterInfo *TRI, Res.second = &X86::VR256RegClass; else if (X86::VR512RegClass.hasType(VT)) Res.second = &X86::VR512RegClass; + else if (VT != MVT::Other) { + // Type mismatch and not a clobber: Return an error; + Res.first = 0; + Res.second = nullptr; + } + } else if (VT != MVT::Other) { + // Type mismatch and not a clobber: Return an error; + Res.first = 0; + Res.second = nullptr; } return Res; diff --git a/llvm/test/CodeGen/X86/asm-reject-reg-type-mismatch.ll b/llvm/test/CodeGen/X86/asm-reject-reg-type-mismatch.ll new file mode 100644 index 000000000000..016e2d261eef --- /dev/null +++ b/llvm/test/CodeGen/X86/asm-reject-reg-type-mismatch.ll @@ -0,0 +1,10 @@ +; RUN: not llc -no-integrated-as %s -o - 2> %t1 +; RUN: FileCheck %s < %t1 +target datalayout = "e-m:o-i64:64-f80:128-n8:16:32:64-S128" +target triple = "x86_64--" + +; CHECK: error: couldn't allocate output register for constraint '{ax}' +define i128 @blup() { + %v = tail call i128 asm "", "={ax},0,~{dirflag},~{fpsr},~{flags}"(i128 0) + ret i128 %v +}