Repost: RFA [4.1]: improvement to if-conversion and cross-jumping (PR20070)

Joern RENNECKE joern.rennecke@st.com
Thu Dec 1 12:37:00 GMT 2005


Bernd Schmidt wrote:

>  
> I'll ask again, please post an example or two of the way this is 
> intended to work.
>
>  

(insn 101 0 102 (set (reg:SI 201) (mem:SI (plus:SI (reg:SI 14) (cont_int 
32)))) -1 (nil) (nil))
(insn 102 101 103 (set (reg:SI 202) (mem:SI (plus:SI (reg:SI 14) 
(cont_int 40)))) -1 (nil) (nil))
...
 (jump_insn 199 198 202 (set (pc)
        (if_then_else (ne (reg:SI r4)
                (const_int 0 [0x0]))
            (label_ref 300)
            (pc))) -1 (nil)
    (nil))
(insn 202 199 204 (set (reg:SI 203) (ashift:SI (reg:SI 201) (const_int 
5))) -1 (nil) (nil))
(insn 204 202 205 (set (reg:SI 204) (ashift:SI (reg:SI 201) (const_int 
3))) -1 (nil) (nil))
(insn 205 204 206 (set (reg:SI 203) (plus:SI (reg:SI 203) (reg:SI 204))) 
-1 (nil) (expr_list:REG_EQUAL (mult:SI (reg:SI 201) (const_int 40)) (nil)))
(insn 206 205 207 (set (reg:SI 205) (plus:SI (reg:SI 205) (reg:SI 203)) 
-1 (nil) (nil))
(jump_insn 207 206 208 (set (pc) (label_ref 400)) -1 (nil) (nil))
(barrier 208 207 300)
(code_label 300 208 302 "" [1 uses])
(insn 302 300 304 (set (reg:SI 303) (ashift:SI (reg:SI 202) (const_int 
6))) -1 (nil) (nil))
(insn 304 302 305 (set (reg:SI 304) (ashift:SI (reg:SI 202) (const_int 
4))) -1 (nil) (nil))
(insn 305 304 306 (set (reg:SI 303) (plus:SI (reg:SI 303) (reg:SI 304))) 
-1 (nil) (expr_list:REG_EQUAL (mult:SI (reg:SI 202) (const_int 80)) (nil)))
(insn 306 305 307 (set (reg:SI 205) (plus:SI (reg:SI 205) (reg:SI 303)) 
-1 (nil) (nil))
(code_label 400 399 401 "" [1 uses])

can be if-converted into:

(insn 101 0 102 (set (reg:SI 201) (mem:SI (plus:SI (reg:SI 14) (cont_int 
32)))) -1 (nil) (nil))
(insn 102 101 103 (set (reg:SI 202) (mem:SI (plus:SI (reg:SI 14) 
(cont_int 40)))) -1 (nil) (nil))
...
 
(insn 501 302 199 (set (reg:SI 206)
                                     (if_then_else:SI (eq (reg:SI 4) 
(const_int 0)) (reg:SI 201) (reg:SI 202)))
                                     -1 (nil) (nil))
(insn 302 501 304 (set (reg:SI 303) (ashift:SI (reg:SI 206) (const_int 
6))) -1 (nil) (nil))
(insn 304 302 305 (set (reg:SI 304) (ashift:SI (reg:SI 206) (const_int 
4))) -1 (nil) (nil))
(insn 305 304 306 (set (reg:SI 303) (plus:SI (reg:SI 303) (reg:SI 304))) 
-1 (nil) (nil) (nil)))
(insn 306 305 401 (set (reg:SI 205) (plus:SI (reg:SI 205) (reg:SI 303)) 
-1 (nil) (nil))
 


In principle, cross-jumping can also use this code, but we'd have to 
enable cross-jumping in some pass before reload, and/or add register 
scavenging code to allocate input_reg after reload.



More information about the Gcc-patches mailing list