[llvm-commits] CVS: llvm/test/Regression/LLC/2003-05-27-phifcmpd.ll 2003-05-27-useboolinotherbb.ll 2003-05-27-usefsubasbool.ll
Vikram Adve
vadve at cs.uiuc.edu
Wed May 28 08:55:00 PDT 2003
Changes in directory llvm/test/Regression/LLC:
2003-05-27-phifcmpd.ll added (r1.1)
2003-05-27-useboolinotherbb.ll added (r1.1)
2003-05-27-usefsubasbool.ll added (r1.1)
---
Log message:
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
---
Diffs of the changes:
Index: llvm/test/Regression/LLC/2003-05-27-phifcmpd.ll
diff -c /dev/null llvm/test/Regression/LLC/2003-05-27-phifcmpd.ll:1.1
*** /dev/null Wed May 28 08:54:51 2003
--- llvm/test/Regression/LLC/2003-05-27-phifcmpd.ll Wed May 28 08:54:41 2003
***************
*** 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
+ }
Index: llvm/test/Regression/LLC/2003-05-27-useboolinotherbb.ll
diff -c /dev/null llvm/test/Regression/LLC/2003-05-27-useboolinotherbb.ll:1.1
*** /dev/null Wed May 28 08:54:51 2003
--- llvm/test/Regression/LLC/2003-05-27-useboolinotherbb.ll Wed May 28 08:54:41 2003
***************
*** 0 ****
--- 1,63 ----
+ ;; Date: May 27, 2003.
+ ;; From: Variant of 2003-05-27-usefsubasbool.ll
+ ;;
+ ;; Error: llc fails to save a boolean value in a register (and later uses an
+ ;; invalid register <NULL VALUE> in a BRNZ) for a boolean value
+ ;; used only by branches but in a different basic block.
+ ;;
+ ;; Cause: In SparcInstrSelection.cpp, for SetCC, when a result of setCC
+ ;; is used only for branches, it is not saved into an int. register.
+ ;; But if the boolean is used in a branch in a different basic block,
+ ;; that branch uses a BRNZ inst. instead of a branch-on-CC.
+ ;;
+ ;; LLC Output before fix:
+ ;; !****** 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
+ ;; sethi %lm(LLVMGlobal__2), %o2
+ ;; sethi %hh(LLVMGlobal__2), %o1
+ ;; or %o1, %hm(LLVMGlobal__2), %o1
+ ;; sllx %o1, 32, %o1
+ ;; or %o2, %o1, %o2
+ ;; or %o2, %lo(LLVMGlobal__2), %o2
+ ;; ldd [%o2+0], %f32
+ ;; fcmpd %fcc0, %f0, %f32
+ ;; ba .L_QRiterate_1_LL_1
+ ;; nop
+ ;;
+ ;; .L_QRiterate_1_LL_1:
+ ;; brnz <NULL_VALUE>, .L_QRiterate_1_LL_1
+ ;; nop
+ ;; ba .L_QRiterate_1_LL_2
+ ;; nop
+ ;;
+ ;; .L_QRiterate_1_LL_2:
+ ;; 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(double %tmp.212) {
+ entry: ; No predecessors!
+ %tmp.213 = setne double %tmp.212, 0.000000e+00
+ br label %shortcirc_next.1
+
+ shortcirc_next.1: ; preds = %entry
+ br bool %tmp.213, label %shortcirc_next.1, label %exit.1
+
+ exit.1:
+ ret void
+ }
Index: llvm/test/Regression/LLC/2003-05-27-usefsubasbool.ll
diff -c /dev/null llvm/test/Regression/LLC/2003-05-27-usefsubasbool.ll:1.1
*** /dev/null Wed May 28 08:54:51 2003
--- llvm/test/Regression/LLC/2003-05-27-usefsubasbool.ll Wed May 28 08:54:41 2003
***************
*** 0 ****
--- 1,63 ----
+ ;; Date: May 27, 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
+ ;; a boolean value computed using setne with a double.
+ ;;
+ ;; Cause: In SparcInstrSelection.cpp, for SetCC, when a result of setne
+ ;; is used for a branch, it can generate a "branch-on-integer-register"
+ ;; for integer registers. In that case, it never saves the value of
+ ;; the boolean result. It was attempting to do the same thing for an
+ ;; FP compare!
+ ;;
+ ;; 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
+ ;; sethi %hh(LLVMGlobal__2), %o1
+ ;; sethi %lm(LLVMGlobal__2), %o0
+ ;; or %o1, %hm(LLVMGlobal__2), %o1
+ ;; sllx %o1, 32, %o1
+ ;; or %o0, %o1, %o0
+ ;; or %o0, %lo(LLVMGlobal__2), %o0
+ ;; ldd [%o0+0], %f32
+ ;; ba .L_QRiterate_1_LL_1
+ ;; fcmpd %fcc0, %f0, %f32
+ ;;
+ ;; .L_QRiterate_1_LL_1:
+ ;; brnz <NULL VALUE>, .L_QRiterate_1_LL_1
+ ;; nop
+ ;; ba .L_QRiterate_1_LL_2
+ ;; nop
+ ;;
+ ;; .L_QRiterate_1_LL_2:
+ ;; 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(double %tmp.212) {
+ entry: ; No predecessors!
+ br label %shortcirc_next.1
+
+ shortcirc_next.1: ; preds = %entry
+ %tmp.213 = setne double %tmp.212, 0.000000e+00
+ br bool %tmp.213, label %shortcirc_next.1, label %exit.1
+
+ exit.1:
+ ret void
+ }
More information about the llvm-commits
mailing list