mirror of
https://github.com/RPCS3/llvm.git
synced 2024-12-20 11:08:27 +00:00
[AArch64] Fix NZCV reg live-in bug in F128CSEL codegen.
When generating the IfTrue basic block during the F128CSEL pseudo-instruction handling, the NZCV live-in for the newly created BB wasn't being added. This caused a fault during MI-sched/live range calculation when the predecessor for the fall-through BB didn't have a live-in for phys-reg as expected. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@193316 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
parent
5e4d8a5eca
commit
2f21452ba1
@ -699,6 +699,12 @@ AArch64TargetLowering::EmitF128CSEL(MachineInstr *MI,
|
|||||||
MBB->addSuccessor(TrueBB);
|
MBB->addSuccessor(TrueBB);
|
||||||
MBB->addSuccessor(EndBB);
|
MBB->addSuccessor(EndBB);
|
||||||
|
|
||||||
|
if (!NZCVKilled) {
|
||||||
|
// NZCV is live-through TrueBB.
|
||||||
|
TrueBB->addLiveIn(AArch64::NZCV);
|
||||||
|
EndBB->addLiveIn(AArch64::NZCV);
|
||||||
|
}
|
||||||
|
|
||||||
// IfTrue:
|
// IfTrue:
|
||||||
// str qIFTRUE, [sp]
|
// str qIFTRUE, [sp]
|
||||||
BuildMI(TrueBB, DL, TII->get(AArch64::LSFP128_STR))
|
BuildMI(TrueBB, DL, TII->get(AArch64::LSFP128_STR))
|
||||||
@ -713,8 +719,6 @@ AArch64TargetLowering::EmitF128CSEL(MachineInstr *MI,
|
|||||||
// Done:
|
// Done:
|
||||||
// ldr qDEST, [sp]
|
// ldr qDEST, [sp]
|
||||||
// [... rest of incoming MBB ...]
|
// [... rest of incoming MBB ...]
|
||||||
if (!NZCVKilled)
|
|
||||||
EndBB->addLiveIn(AArch64::NZCV);
|
|
||||||
MachineInstr *StartOfEnd = EndBB->begin();
|
MachineInstr *StartOfEnd = EndBB->begin();
|
||||||
BuildMI(*EndBB, StartOfEnd, DL, TII->get(AArch64::LSFP128_LDR), DestReg)
|
BuildMI(*EndBB, StartOfEnd, DL, TII->get(AArch64::LSFP128_LDR), DestReg)
|
||||||
.addFrameIndex(ScratchFI)
|
.addFrameIndex(ScratchFI)
|
||||||
|
17
test/CodeGen/AArch64/regress-fp128-livein.ll
Normal file
17
test/CodeGen/AArch64/regress-fp128-livein.ll
Normal file
@ -0,0 +1,17 @@
|
|||||||
|
; RUN: llc -mtriple=aarch64-none-linux-gnu -verify-machineinstrs < %s
|
||||||
|
|
||||||
|
; Regression test for NZCV reg live-in not being added to fp128csel IfTrue BB,
|
||||||
|
; causing a crash during live range calc.
|
||||||
|
define void @fp128_livein(i64 %a) {
|
||||||
|
%tobool = icmp ne i64 %a, 0
|
||||||
|
%conv = zext i1 %tobool to i32
|
||||||
|
%conv2 = sitofp i32 %conv to fp128
|
||||||
|
%conv6 = sitofp i32 %conv to double
|
||||||
|
%call3 = tail call i32 @g(fp128 %conv2)
|
||||||
|
%call8 = tail call i32 @h(double %conv6)
|
||||||
|
ret void
|
||||||
|
}
|
||||||
|
|
||||||
|
declare i32 @f()
|
||||||
|
declare i32 @g(fp128)
|
||||||
|
declare i32 @h(double)
|
Loading…
Reference in New Issue
Block a user