Initially, if the `c` constraint applied to the wrong data type that
causes LLVM to assert. This commit replaces the assert by an error
message.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@321565
91177308-0d34-0410-b5e6-
96231b3b80d8
case 'c': // register suitable for indirect jump
if (VT == MVT::i32)
return std::make_pair((unsigned)Mips::T9, &Mips::GPR32RegClass);
- assert(VT == MVT::i64 && "Unexpected type.");
- return std::make_pair((unsigned)Mips::T9_64, &Mips::GPR64RegClass);
+ if (VT == MVT::i64)
+ return std::make_pair((unsigned)Mips::T9_64, &Mips::GPR64RegClass);
+ // This will generate an error message
+ return std::make_pair(0U, nullptr);
case 'l': // register suitable for indirect jump
if (VT == MVT::i32)
return std::make_pair((unsigned)Mips::LO0, &Mips::LO32RegClass);
--- /dev/null
+; Check that invalid type for constraint `c` causes an error message.
+; RUN: not llc -march=mips -target-abi o32 < %s 2>&1 | FileCheck %s
+
+define i32 @main() #0 {
+entry:
+ %jmp = alloca float, align 4
+ store float 0x4200000000000000, float* %jmp, align 4
+ %0 = load float, float* %jmp, align 4
+ call void asm sideeffect "jr $0", "c,~{$1}"(float %0) #1
+
+; CHECK: error: couldn't allocate input reg for constraint 'c'
+
+ ret i32 0
+}
+
+attributes #0 = { noinline nounwind }
+attributes #1 = { nounwind }
--- /dev/null
+; Check handling of the constraint `c`.
+; RUN: llc -march=mips -target-abi o32 < %s | FileCheck %s
+
+define i32 @main() #0 {
+entry:
+ %jmp = alloca i32, align 4
+ store i32 0, i32* %jmp, align 4
+ %0 = load i32, i32* %jmp, align 4
+ call void asm sideeffect "jr $0", "c,~{$1}"(i32 %0) #1
+
+; CHECK: addiu $25, $zero, 0
+; CHECK: jr $25
+
+ ret i32 0
+}
+
+attributes #0 = { noinline nounwind }
+attributes #1 = { nounwind }