[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