Skip to content

Commit

Permalink
[AArch64] Fix NZCV reg live-in bug in F128CSEL codegen.
Browse files Browse the repository at this point in the history
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
  • Loading branch information
aemerson committed Oct 24, 2013
1 parent 5e4d8a5 commit 2f21452
Show file tree
Hide file tree
Showing 2 changed files with 23 additions and 2 deletions.
8 changes: 6 additions & 2 deletions lib/Target/AArch64/AArch64ISelLowering.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -699,6 +699,12 @@ AArch64TargetLowering::EmitF128CSEL(MachineInstr *MI,
MBB->addSuccessor(TrueBB);
MBB->addSuccessor(EndBB);

if (!NZCVKilled) {
// NZCV is live-through TrueBB.
TrueBB->addLiveIn(AArch64::NZCV);
EndBB->addLiveIn(AArch64::NZCV);
}

// IfTrue:
// str qIFTRUE, [sp]
BuildMI(TrueBB, DL, TII->get(AArch64::LSFP128_STR))
Expand All @@ -713,8 +719,6 @@ AArch64TargetLowering::EmitF128CSEL(MachineInstr *MI,
// Done:
// ldr qDEST, [sp]
// [... rest of incoming MBB ...]
if (!NZCVKilled)
EndBB->addLiveIn(AArch64::NZCV);
MachineInstr *StartOfEnd = EndBB->begin();
BuildMI(*EndBB, StartOfEnd, DL, TII->get(AArch64::LSFP128_LDR), DestReg)
.addFrameIndex(ScratchFI)
Expand Down
17 changes: 17 additions & 0 deletions test/CodeGen/AArch64/regress-fp128-livein.ll
Original file line number Diff line number Diff line change
@@ -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)

0 comments on commit 2f21452

Please sign in to comment.