Three kinds of boolean values handled incorrectly:
-- setCC of FP type used by a Phi: have to save in reg.
-- setNE of FP type used by a branch: cannot use result directly in branch!
-- setCC used outside the same basic block: have to save in reg. for now
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@6382 91177308-0d34-0410-b5e6-96231b3b80d8
diff --git a/test/CodeGen/Generic/2003-05-27-phifcmpd.ll b/test/CodeGen/Generic/2003-05-27-phifcmpd.ll
new file mode 100644
index 0000000..1561beb
--- /dev/null
+++ b/test/CodeGen/Generic/2003-05-27-phifcmpd.ll
@@ -0,0 +1,71 @@
+;; Date: May 28, 2003.
+;; From: test/Programs/MultiSource/McCat-05-eks/QRfact.c
+;; Function: Matrix QRiterate(Matrix A, Matrix U)
+;;
+;; Error: llc produces an invalid register <NULL VALUE> for the
+;; phi argument %tmp.213 produced by fcmpd:
+;;
+;; LLC Output:
+;;
+;; !****** Outputing Function: QRiterate_1 ******
+;;
+;; .section ".text"
+;; .align 4
+;; .global QRiterate_1
+;; .type QRiterate_1, 2
+;; QRiterate_1:
+;; .L_QRiterate_1_LL_0:
+;; save %o6, -192, %o6
+;; brgz %i0, .L_QRiterate_1_LL_1
+;; add %g0, %g0, %o0
+;; ba .L_QRiterate_1_LL_2
+;; nop
+;;
+;; .L_QRiterate_1_LL_1:
+;; sethi %lm(LLVMGlobal__2), %o1
+;; sethi %hh(LLVMGlobal__2), %o0
+;; or %o0, %hm(LLVMGlobal__2), %o0
+;; sllx %o0, 32, %o0
+;; or %o1, %o0, %o1
+;; or %o1, %lo(LLVMGlobal__2), %o1
+;; ldd [%o1+0], %f32
+;; fcmpd %fcc0, %f2, %f32
+;; ba .L_QRiterate_1_LL_2
+;; add <NULL VALUE>, %g0, %o0
+;;
+;; .L_QRiterate_1_LL_2:
+;; brnz %o0, .L_QRiterate_1_LL_1
+;; nop
+;; ba .L_QRiterate_1_LL_3
+;; nop
+;;
+;; .L_QRiterate_1_LL_3:
+;; jmpl %i7+8, %g0
+;; restore %g0, 0, %g0
+;;
+;; .EndOf_QRiterate_1:
+;; .size QRiterate_1, .EndOf_QRiterate_1-QRiterate_1
+;;
+
+
+target endian = big
+target pointersize = 64
+
+implementation ; Functions:
+
+internal void %QRiterate(int %p.1, double %tmp.212) {
+entry: ; No predecessors!
+ %tmp.184 = setgt int %p.1, 0 ; <bool> [#uses=1]
+ br bool %tmp.184, label %shortcirc_next.1, label %shortcirc_done.1
+
+shortcirc_next.1: ; preds = %entry
+ %tmp.213 = setne double %tmp.212, 0.000000e+00
+ br label %shortcirc_done.1
+
+shortcirc_done.1: ; preds = %entry, %shortcirc_next.1
+ %val.1 = phi bool [ false, %entry ], [ %tmp.213, %shortcirc_next.1 ]
+ br bool %val.1, label %shortcirc_next.1, label %exit.1
+
+exit.1:
+ ret void
+}