diff options
author | Tim Northover <tnorthover@apple.com> | 2013-11-14 17:15:39 +0000 |
---|---|---|
committer | Tim Northover <tnorthover@apple.com> | 2013-11-14 17:15:39 +0000 |
commit | bf7329d9a0169abbd6ec837dc8b682b2f2fd98cd (patch) | |
tree | 43da4cec9c16756e2d25ae62996ac91cb24ad01a | |
parent | 5e9f8c3948ddeee5d40d525e076fa63fc7b8ae40 (diff) | |
download | external_llvm-bf7329d9a0169abbd6ec837dc8b682b2f2fd98cd.zip external_llvm-bf7329d9a0169abbd6ec837dc8b682b2f2fd98cd.tar.gz external_llvm-bf7329d9a0169abbd6ec837dc8b682b2f2fd98cd.tar.bz2 |
ARM: produce friendly error for invalid inline asm
We used to perform an invalid operation on an MVT and crash, which wasn't much
fun.
Patch by Oliver Stannard.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@194714 91177308-0d34-0410-b5e6-96231b3b80d8
-rw-r--r-- | lib/Target/ARM/ARMISelLowering.cpp | 4 | ||||
-rw-r--r-- | test/CodeGen/ARM/2013-11-08-inline-asm-neon-array.ll | 16 |
2 files changed, 20 insertions, 0 deletions
diff --git a/lib/Target/ARM/ARMISelLowering.cpp b/lib/Target/ARM/ARMISelLowering.cpp index 9dee931..76a0a83 100644 --- a/lib/Target/ARM/ARMISelLowering.cpp +++ b/lib/Target/ARM/ARMISelLowering.cpp @@ -10860,6 +10860,8 @@ ARMTargetLowering::getRegForInlineAsmConstraint(const std::string &Constraint, case 'r': return RCPair(0U, &ARM::GPRRegClass); case 'w': + if (VT == MVT::Other) + break; if (VT == MVT::f32) return RCPair(0U, &ARM::SPRRegClass); if (VT.getSizeInBits() == 64) @@ -10868,6 +10870,8 @@ ARMTargetLowering::getRegForInlineAsmConstraint(const std::string &Constraint, return RCPair(0U, &ARM::QPRRegClass); break; case 'x': + if (VT == MVT::Other) + break; if (VT == MVT::f32) return RCPair(0U, &ARM::SPR_8RegClass); if (VT.getSizeInBits() == 64) diff --git a/test/CodeGen/ARM/2013-11-08-inline-asm-neon-array.ll b/test/CodeGen/ARM/2013-11-08-inline-asm-neon-array.ll new file mode 100644 index 0000000..5a86477 --- /dev/null +++ b/test/CodeGen/ARM/2013-11-08-inline-asm-neon-array.ll @@ -0,0 +1,16 @@ +;RUN: not llc -mtriple=arm-linux-gnueabihf < %s 2>&1 | FileCheck %s + +; ModuleID = 'bug.c' +target datalayout = "e-p:32:32:32-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:64:64-f32:32:32-f64:64:64-v64:64:64-v128:64:128-a0:0:64-n32-S64" +target triple = "armv7--" + +%struct.uint8x8x4_t = type { [4 x <8 x i8>] } + +define void @foo() #0 { + %vsrc = alloca %struct.uint8x8x4_t, align 8 + %ptr = alloca i8; + %1 = call i8* asm sideeffect "vld4.u8 ${0:h}, [$1], $2", "=*w,=r,r,1"(%struct.uint8x8x4_t* %vsrc, i32 0, i8* %ptr) + ret void +} + +; CHECK: error: couldn't allocate output register for constraint 'w' |