<div dir="ltr"><div>Ping. Any comments on this patch Tim?</div><div><br></div><div>Cheers,</div><div>Amara</div><div class="gmail_extra"><br><br><div class="gmail_quote">On 16 October 2013 13:53, Amara Emerson <span dir="ltr"><<a href="mailto:amara.emerson@arm.com" target="_blank">amara.emerson@arm.com</a>></span> wrote:<br>

<blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">Hi t.p.northover,<br>
<br>
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.<br>


<br>
Review appreciated.<br>
<br>
<a href="http://llvm-reviews.chandlerc.com/D1949" target="_blank">http://llvm-reviews.chandlerc.com/D1949</a><br>
<br>
Files:<br>
  lib/Target/AArch64/AArch64ISelLowering.cpp<br>
  test/CodeGen/AArch64/fp128-livein.ll<br>
<br>
Index: lib/Target/AArch64/AArch64ISelLowering.cpp<br>
===================================================================<br>
--- lib/Target/AArch64/AArch64ISelLowering.cpp<br>
+++ lib/Target/AArch64/AArch64ISelLowering.cpp<br>
@@ -699,6 +699,12 @@<br>
   MBB->addSuccessor(TrueBB);<br>
   MBB->addSuccessor(EndBB);<br>
<br>
+  if (!NZCVKilled) {<br>
+    // NZCV is live-through TrueBB.<br>
+    TrueBB->addLiveIn(AArch64::NZCV);<br>
+    EndBB->addLiveIn(AArch64::NZCV);<br>
+  }<br>
+<br>
   // IfTrue:<br>
   //     str qIFTRUE, [sp]<br>
   BuildMI(TrueBB, DL, TII->get(AArch64::LSFP128_STR))<br>
@@ -713,8 +719,6 @@<br>
   // Done:<br>
   //     ldr qDEST, [sp]<br>
   //     [... rest of incoming MBB ...]<br>
-  if (!NZCVKilled)<br>
-    EndBB->addLiveIn(AArch64::NZCV);<br>
   MachineInstr *StartOfEnd = EndBB->begin();<br>
   BuildMI(*EndBB, StartOfEnd, DL, TII->get(AArch64::LSFP128_LDR), DestReg)<br>
     .addFrameIndex(ScratchFI)<br>
Index: test/CodeGen/AArch64/fp128-livein.ll<br>
===================================================================<br>
--- /dev/null<br>
+++ test/CodeGen/AArch64/fp128-livein.ll<br>
@@ -0,0 +1,17 @@<br>
+; RUN: llc -mtriple=aarch64-none-linux-gnu -verify-machineinstrs < %s<br>
+<br>
+; Regression test for NZCV reg live-in not being added to fp128csel IfTrue BB,<br>
+; causing a crash during live range calc.<br>
+define void @fp128_livein(i64 %a) {<br>
+  %tobool = icmp ne i64 %a, 0<br>
+  %conv = zext i1 %tobool to i32<br>
+  %conv2 = sitofp i32 %conv to fp128<br>
+  %conv6 = sitofp i32 %conv to double<br>
+  %call3 = tail call i32 @g(fp128 %conv2)<br>
+  %call8 = tail call i32 @h(double %conv6)<br>
+  ret void<br>
+}<br>
+<br>
+declare i32 @f()<br>
+declare i32 @g(fp128)<br>
+declare i32 @h(double)<br>
<br>_______________________________________________<br>
llvm-commits mailing list<br>
<a href="mailto:llvm-commits@cs.uiuc.edu">llvm-commits@cs.uiuc.edu</a><br>
<a href="http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits" target="_blank">http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits</a><br>
<br></blockquote></div><br></div></div>