Dear all,
I am trying to embed the control flow graph information into the assembly code
generated in the final pass of gcc.
While doing that, I found a very strange situation which the control flow
graph does not comply with the gcc internal document. In the internal
document, it is stated that "A CODE_LABEL cannot appear in the instruction
stream of a basic block" (p155). But in the RTL of a basic block before the
final pass, there is a CODE_LABEL (171) as following:
----------------start basic block 3 -----------------------------
The rtx in bb:
(code_label/v 27 93 28 27 "" [0 uses])
(note 28 93 30 [bb 3] NOTE_INSN_BASIC_BLOCK)
(insn 30 28 171 (set (reg:SI 2 r2 [orig:162 n_lsm.307 ] [162])
(plus:SI (reg:SI 2 r2 [orig:162 n_lsm.307 ] [162])
(reg:SI 1 r1 [orig:160 ivtmp.313 ] [160]))) 39 {*addsi3_compact}
(nil)
(nil))
(code_label 171 30 31 50 "" [1 uses])
(insn 31 171 33 (set (reg:SI 1 r1 [orig:160 ivtmp.313 ] [160])
(plus:SI (reg:SI 1 r1 [orig:160 ivtmp.313 ] [160])
(const_int 1 [0x1]))) 39 {*addsi3_compact} (nil)
(nil))
(insn 33 31 172 (set (reg:SI 147 t)
(eq:SI (reg:SI 1 r1 [orig:160 ivtmp.313 ] [160])
(reg:SI 5 r5 [orig:165 s.2 ] [165]))) 1 {cmpeqsi_t}
(insn_list:REG_DEP_TRUE 31 (nil))
(nil))
(insn 172 33 170 (sequence [
(jump_insn 34 33 30 (set (pc)
(if_then_else (eq (reg:SI 147 t)
(const_int 0 [0x0]))
(label_ref:SI 171)
(pc))) 208 {branch_false} (insn_list:REG_DEP_TRUE 33
(nil))
(expr_list:REG_BR_PRED (const_int 12 [0xc])
(expr_list:REG_DEAD (reg:SI 147 t)
(expr_list:REG_BR_PROB (const_int 9000 [0x2328])
(nil)))))
(insn/s 30 34 170 (set (reg:SI 2 r2 [orig:162 n_lsm.307 ] [162])
(plus:SI (reg:SI 2 r2 [orig:162 n_lsm.307 ] [162])
(reg:SI 1 r1 [orig:160 ivtmp.313 ] [160]))) 39
{*addsi3_compact} (nil)
(nil))
]) -1 (nil)
(nil))
----------------end basic block 3 -----------------------------
You can note that the CODE_LABEL 171 does appear in the basic block.
Therefore the assemble code generated for this basic block does not comply
with the definition of a basic block where the basic block should be a linear
sequence of instructions:
000001d8 <_main_sh_bb3>:
n = n+i;
1d8: 32 1c add r1,r2
1da: 71 01 add #1,r1
1dc: 31 50 cmp/eq r5,r1
1de: 8f fc bf.s 1da <_main_sh_bb3+0x2>
1e0: 32 1c add r1,r2
1e2: 32 18 sub r1,r2
The basic block should be from the address 1da (add #1, r1) to the address 1de
(bf.s 1da), instead of being from the address 1d8 -> 1e2 as being stored in
the control flow graph structure. Now if I build the control flow graph from
the internal data of GCC, I will get a different/wrong result from the result
I get from the assembly code.
I though the problem is that the delayed branch scheduling pass changes the
some instructions for the delayed branch, but it does not change the control
flow graph data.
Could you please confirm me if I am correct?
--------------------------------------------------------------
Minh D. Nguyen
Electronic Design Automation
Dept. of Electrical and Computer Eng.
University of Kaiserslautern
67653 Kaiserslautern, Germany
phone: +49 631 205 2609
fax: +49 631 205 4782
--------------------------------------------------------------