diff options
Diffstat (limited to 'llvm')
| -rw-r--r-- | llvm/lib/Target/ARM/ARMBaseInstrInfo.cpp | 4 | ||||
| -rw-r--r-- | llvm/lib/Target/ARM/ARMInstrNEON.td | 8 | ||||
| -rw-r--r-- | llvm/test/CodeGen/Thumb2/crash.ll | 16 | ||||
| -rw-r--r-- | llvm/utils/TableGen/EDEmitter.cpp | 1 | 
4 files changed, 22 insertions, 7 deletions
diff --git a/llvm/lib/Target/ARM/ARMBaseInstrInfo.cpp b/llvm/lib/Target/ARM/ARMBaseInstrInfo.cpp index 17ff7192b1e..ccb6b16d3ac 100644 --- a/llvm/lib/Target/ARM/ARMBaseInstrInfo.cpp +++ b/llvm/lib/Target/ARM/ARMBaseInstrInfo.cpp @@ -757,7 +757,7 @@ storeRegToStackSlot(MachineBasicBlock &MBB, MachineBasicBlock::iterator I,          llvm_unreachable("Unknown reg class!");        break;      case 16: -      if (ARM::QPRRegClass.hasSubClassEq(RC)) { +      if (ARM::DPairRegClass.hasSubClassEq(RC)) {          // Use aligned spills if the stack can be realigned.          if (Align >= 16 && getRegisterInfo().canRealignStack(MF)) {            AddDefaultPred(BuildMI(MBB, I, DL, get(ARM::VST1q64)) @@ -907,7 +907,7 @@ loadRegFromStackSlot(MachineBasicBlock &MBB, MachineBasicBlock::iterator I,        llvm_unreachable("Unknown reg class!");      break;    case 16: -    if (ARM::QPRRegClass.hasSubClassEq(RC)) { +    if (ARM::DPairRegClass.hasSubClassEq(RC)) {        if (Align >= 16 && getRegisterInfo().canRealignStack(MF)) {          AddDefaultPred(BuildMI(MBB, I, DL, get(ARM::VLD1q64), DestReg)                       .addFrameIndex(FI).addImm(16) diff --git a/llvm/lib/Target/ARM/ARMInstrNEON.td b/llvm/lib/Target/ARM/ARMInstrNEON.td index a804b6ec392..c5458ed4d04 100644 --- a/llvm/lib/Target/ARM/ARMInstrNEON.td +++ b/llvm/lib/Target/ARM/ARMInstrNEON.td @@ -530,16 +530,16 @@ def NEONimmAllOnesV: PatLeaf<(NEONvmovImm (i32 timm)), [{  // Use VLDM to load a Q register as a D register pair.  // This is a pseudo instruction that is expanded to VLDMD after reg alloc.  def VLDMQIA -  : PseudoVFPLdStM<(outs QPR:$dst), (ins GPR:$Rn), +  : PseudoVFPLdStM<(outs DPair:$dst), (ins GPR:$Rn),                      IIC_fpLoad_m, "", -                   [(set QPR:$dst, (v2f64 (load GPR:$Rn)))]>; +                   [(set DPair:$dst, (v2f64 (load GPR:$Rn)))]>;  // Use VSTM to store a Q register as a D register pair.  // This is a pseudo instruction that is expanded to VSTMD after reg alloc.  def VSTMQIA -  : PseudoVFPLdStM<(outs), (ins QPR:$src, GPR:$Rn), +  : PseudoVFPLdStM<(outs), (ins DPair:$src, GPR:$Rn),                      IIC_fpStore_m, "", -                   [(store (v2f64 QPR:$src), GPR:$Rn)]>; +                   [(store (v2f64 DPair:$src), GPR:$Rn)]>;  // Classes for VLD* pseudo-instructions with multi-register operands.  // These are expanded to real instructions after register allocation. diff --git a/llvm/test/CodeGen/Thumb2/crash.ll b/llvm/test/CodeGen/Thumb2/crash.ll index d8b51ec82de..52893af9370 100644 --- a/llvm/test/CodeGen/Thumb2/crash.ll +++ b/llvm/test/CodeGen/Thumb2/crash.ll @@ -1,4 +1,4 @@ -; RUN: llc < %s -mtriple=thumbv7-apple-darwin -mcpu=cortex-a8 +; RUN: llc < %s -mtriple=thumbv7-apple-darwin -mcpu=cortex-a8 -verify-machineinstrs  target datalayout = "e-p:32:32:32-i1:8:32-i8:8:32-i16:16:32-i32:32:32-i64:32:32-f32:32:32-f64:32:32-v64:64:64-v128:128:128-a0:0:32-n32"  target triple = "thumbv7-apple-darwin10" @@ -47,3 +47,17 @@ bb2:                                              ; preds = %bb    tail call void @llvm.arm.neon.vst4.v4i32(i8* bitcast ([16 x i32]* @dbuf to i8*), <4 x i32> %2, <4 x i32> %3, <4 x i32> %4, <4 x i32> %5, i32 1) nounwind    ret i32 0  } + +; PR12389 +; Make sure the DPair register class can spill. +define void @pr12389(i8* %p) nounwind ssp { +entry: +  %vld1 = tail call <4 x float> @llvm.arm.neon.vld1.v4f32(i8* %p, i32 1) +  tail call void asm sideeffect "", "~{q0},~{q1},~{q2},~{q3},~{q4},~{q5},~{q6},~{q7},~{q8},~{q9},~{q10},~{q11},~{q12},~{q13},~{q14},~{q15}"() nounwind +  tail call void @llvm.arm.neon.vst1.v4f32(i8* %p, <4 x float> %vld1, i32 1) +  ret void +} + +declare <4 x float> @llvm.arm.neon.vld1.v4f32(i8*, i32) nounwind readonly + +declare void @llvm.arm.neon.vst1.v4f32(i8*, <4 x float>, i32) nounwind diff --git a/llvm/utils/TableGen/EDEmitter.cpp b/llvm/utils/TableGen/EDEmitter.cpp index 1b473d37e7f..3eed07c218a 100644 --- a/llvm/utils/TableGen/EDEmitter.cpp +++ b/llvm/utils/TableGen/EDEmitter.cpp @@ -569,6 +569,7 @@ static int ARMFlagFromOpName(LiteralConstantEmitter *type,    REG("DPR");    REG("DPR_VFP2");    REG("DPR_8"); +  REG("DPair");    REG("SPR");    REG("QPR");    REG("QQPR");  | 

