mirror of
https://github.com/RPCS3/llvm.git
synced 2025-01-05 19:29:54 +00:00
ARM: mark CPSR as clobbered for Windows VLAs
When lowering a VLA, we emit a __chstk call. However, this call can internally clobber CPSR. We did not mark this register as an ImpDef, which could potentially allow a comparison to be hoisted above the call to `__chkstk`. In such a case, the CPSR could be clobbered, and the check invalidated. When the support was initially added, it seemed that the call would take care of preventing CPSR from being clobbered, but this is not the case. Mark the register as clobbered to fix a possible state corruption. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@311061 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
parent
23aac208ff
commit
e042428b3e
@ -8790,6 +8790,8 @@ ARMTargetLowering::EmitLowered__chkstk(MachineInstr &MI,
|
||||
.addReg(ARM::R4, RegState::Implicit | RegState::Kill)
|
||||
.addReg(ARM::R4, RegState::Implicit | RegState::Define)
|
||||
.addReg(ARM::R12,
|
||||
RegState::Implicit | RegState::Define | RegState::Dead)
|
||||
.addReg(ARM::CPSR,
|
||||
RegState::Implicit | RegState::Define | RegState::Dead);
|
||||
break;
|
||||
case CodeModel::Large: {
|
||||
@ -8804,6 +8806,8 @@ ARMTargetLowering::EmitLowered__chkstk(MachineInstr &MI,
|
||||
.addReg(ARM::R4, RegState::Implicit | RegState::Kill)
|
||||
.addReg(ARM::R4, RegState::Implicit | RegState::Define)
|
||||
.addReg(ARM::R12,
|
||||
RegState::Implicit | RegState::Define | RegState::Dead)
|
||||
.addReg(ARM::CPSR,
|
||||
RegState::Implicit | RegState::Define | RegState::Dead);
|
||||
break;
|
||||
}
|
||||
|
13
test/CodeGen/ARM/Windows/vla-cpsr.ll
Normal file
13
test/CodeGen/ARM/Windows/vla-cpsr.ll
Normal file
@ -0,0 +1,13 @@
|
||||
; RUN: llc -mtriple thumbv7-windows-itanium -filetype asm -o /dev/null %s -print-machineinstrs=expand-isel-pseudos 2>&1 | FileCheck %s
|
||||
|
||||
declare arm_aapcs_vfpcc void @g(i8*) local_unnamed_addr
|
||||
|
||||
define arm_aapcs_vfpcc void @f(i32 %i) local_unnamed_addr {
|
||||
entry:
|
||||
%vla = alloca i8, i32 %i, align 1
|
||||
call arm_aapcs_vfpcc void @g(i8* nonnull %vla)
|
||||
ret void
|
||||
}
|
||||
|
||||
; CHECK: tBL pred:14, pred:%noreg, <es:__chkstk>, %LR<imp-def>, %SP<imp-use>, %R4<imp-use,kill>, %R4<imp-def>, %R12<imp-def,dead>, %CPSR<imp-def,dead>
|
||||
|
Loading…
Reference in New Issue
Block a user