diff --git a/llvm/lib/Target/AVR/MCTargetDesc/AVRMCCodeEmitter.cpp b/llvm/lib/Target/AVR/MCTargetDesc/AVRMCCodeEmitter.cpp --- a/llvm/lib/Target/AVR/MCTargetDesc/AVRMCCodeEmitter.cpp +++ b/llvm/lib/Target/AVR/MCTargetDesc/AVRMCCodeEmitter.cpp @@ -146,7 +146,8 @@ switch (RegOp.getReg()) { default: - llvm_unreachable("Expected either Y or Z register"); + Ctx.reportError(MI.getLoc(), "Expected either Y or Z register"); + return 0; case AVR::R31R30: RegBit = 0; break; // Z register @@ -164,7 +165,7 @@ Fixups.push_back(MCFixup::create(0, OffsetOp.getExpr(), MCFixupKind(AVR::fixup_6), MI.getLoc())); } else { - llvm_unreachable("invalid value for offset"); + llvm_unreachable("Invalid value for offset"); } return (RegBit << 6) | OffsetBits; diff --git a/llvm/test/CodeGen/AVR/inline-asm/inline-asm-invalid.ll b/llvm/test/CodeGen/AVR/inline-asm/inline-asm-invalid.ll --- a/llvm/test/CodeGen/AVR/inline-asm/inline-asm-invalid.ll +++ b/llvm/test/CodeGen/AVR/inline-asm/inline-asm-invalid.ll @@ -1,4 +1,5 @@ -; RUN: not llc < %s -march=avr -no-integrated-as 2>&1 | FileCheck %s +; RUN: not llc < %s -march=avr -mcpu=avr6 -filetype=obj -no-integrated-as 2>&1 \ +; RUN: | FileCheck %s define void @foo(i16 %a) { ; CHECK: error: invalid operand in inline asm: 'jl ${0:l}' @@ -13,3 +14,9 @@ call i16 asm sideeffect ";; ${0:C}", "=d"() ret void } + +define void @foo2() { + ; CHECK: error: expected either Y or Z register + call void asm sideeffect "ldd r24, X+2", ""() + ret void +}