summaryrefslogtreecommitdiffstats
path: root/llvm
diff options
context:
space:
mode:
Diffstat (limited to 'llvm')
-rw-r--r--llvm/lib/Target/X86/X86AsmPrinter.cpp6
-rw-r--r--llvm/test/CodeGen/X86/inline-asm-bad-modifier.ll8
2 files changed, 14 insertions, 0 deletions
diff --git a/llvm/lib/Target/X86/X86AsmPrinter.cpp b/llvm/lib/Target/X86/X86AsmPrinter.cpp
index c9be0b98cab..be361d5f93b 100644
--- a/llvm/lib/Target/X86/X86AsmPrinter.cpp
+++ b/llvm/lib/Target/X86/X86AsmPrinter.cpp
@@ -372,6 +372,12 @@ static bool printAsmMRegister(X86AsmPrinter &P, const MachineOperand &MO,
unsigned Reg = MO.getReg();
bool EmitPercent = true;
+ if (!X86::GR8RegClass.contains(Reg) &&
+ !X86::GR16RegClass.contains(Reg) &&
+ !X86::GR32RegClass.contains(Reg) &&
+ !X86::GR64RegClass.contains(Reg))
+ return true;
+
switch (Mode) {
default: return true; // Unknown mode.
case 'b': // Print QImode register
diff --git a/llvm/test/CodeGen/X86/inline-asm-bad-modifier.ll b/llvm/test/CodeGen/X86/inline-asm-bad-modifier.ll
new file mode 100644
index 00000000000..819b9fcfa79
--- /dev/null
+++ b/llvm/test/CodeGen/X86/inline-asm-bad-modifier.ll
@@ -0,0 +1,8 @@
+; RUN: not llc -mtriple=x86_64-- < %s 2>&1 | FileCheck %s
+
+;CHECK: error: invalid operand in inline asm: 'vmovd ${1:x}, $0'
+define i32 @foo() {
+entry:
+ %0 = tail call i32 asm sideeffect "vmovd ${1:x}, $0", "=r,x,~{dirflag},~{fpsr},~{flags}"(<2 x i64> <i64 240518168632, i64 240518168632>)
+ ret i32 %0
+}
OpenPOWER on IntegriCloud