2 ;; From: Variant of 2003-05-27-usefsubasbool.ll
4 ;; Error: llc fails to save a boolean value in a register (and later uses an
5 ;; invalid register <NULL VALUE> in a BRNZ) for a boolean value
6 ;; used only by branches but in a different basic block.
8 ;; Cause: In SparcInstrSelection.cpp, for SetCC, when a result of setCC
9 ;; is used only for branches, it is not saved into an int. register.
10 ;; But if the boolean is used in a branch in a different basic block,
11 ;; that branch uses a BRNZ inst. instead of a branch-on-CC.
13 ;; LLC Output before fix:
14 ;; !****** Outputing Function: QRiterate_1 ******
18 ;; .global QRiterate_1
19 ;; .type QRiterate_1, 2
21 ;; .L_QRiterate_1_LL_0:
22 ;; save %o6, -192, %o6
23 ;; sethi %lm(LLVMGlobal__2), %o2
24 ;; sethi %hh(LLVMGlobal__2), %o1
25 ;; or %o1, %hm(LLVMGlobal__2), %o1
28 ;; or %o2, %lo(LLVMGlobal__2), %o2
30 ;; fcmpd %fcc0, %f0, %f32
31 ;; ba .L_QRiterate_1_LL_1
34 ;; .L_QRiterate_1_LL_1:
35 ;; brnz <NULL_VALUE>, .L_QRiterate_1_LL_1
37 ;; ba .L_QRiterate_1_LL_2
40 ;; .L_QRiterate_1_LL_2:
42 ;; restore %g0, 0, %g0
44 ;; .EndOf_QRiterate_1:
45 ;; .size QRiterate_1, .EndOf_QRiterate_1-QRiterate_1
49 target pointersize = 64
51 implementation ; Functions:
53 internal void %QRiterate(double %tmp.212) {
54 entry: ; No predecessors!
55 %tmp.213 = setne double %tmp.212, 0.000000e+00
56 br label %shortcirc_next.1
58 shortcirc_next.1: ; preds = %entry
59 br bool %tmp.213, label %shortcirc_next.1, label %exit.1