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