Am 18.03.2008 um 16:21 schrieb Jim Wilson:
Boris Boesler wrote:
The following code generators use FOR_EACH_BB[_REVERSE] in the
target machine dependent reorg pass:
- bfin
- frv
- ia64
- mt
- s390
The very first thing that ia64_reorg does is
compute_bb_for_insn ();
For a few seconds I thought you saved my day.
I'm not talking about BLOCK_FOR_INSN (insn)
I haven't specified my problem properly? If I traverse basic blocks
via FOR_EACH_BB (used in compute_bb_for_insn, too) I get insns which
are not in the insn-stream for(insn = get_insns(), insn; insn =
NEXT_INSN(insn)) ..
B1 -------> B2 ------> B3
/\ /\ /\
/ \ / \ / \
v v v v v v
i1 -> i2 i3 -> i4 i5 -> i6
| ^
+-----------------+
How can I say this? In a first pass I dump each insn as a node in a
VCG-file, each node is identified by its memory address (I used the
UID, but insns appear multiple times if they were copied, but UID or
address makes no difference). In a second pass I dump each basic
block as a node with edges to the head insn and to the end insn of
the basic block, which should be emitted in the first pass. But
sometimes some of the basic blocks have edges to insns which do not
exits.
Possible solutions (from OK to horrific):
1) These insns are dead code.
2) Bug in my output (but I checked it quite often)
3) Bug in GCC
Boris