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
+}