Identical basic blocks live long in RTL flow.
Jeff Law
law@redhat.com
Wed Jan 16 17:10:00 GMT 2013
On 01/16/2013 02:28 AM, Bin.Cheng wrote:
> Hi,
> For below simple function from newlib:
>
> static int
> is_option (char *argv_element, int only)
> {
> return ((argv_element == 0)
> || (argv_element[0] == '-') || (only && argv_element[0] == '+'));
> }
>
> The expanded rtl is like:
>
> 9: NOTE_INSN_BASIC_BLOCK 2
> 2: r113:SI=r0:SI
> 3: r114:SI=r1:SI
> 4: NOTE_INSN_FUNCTION_BEG
> 11: pc={(r113:SI==0)?L39:pc}
> REG_BR_PROB 0x3f6
> 12: NOTE_INSN_BASIC_BLOCK 3
> 13: r111:SI=zero_extend([r113:SI])
> 14: pc={(r111:SI==0x2d)?L43:pc}
> REG_BR_PROB 0x7c7
> 15: NOTE_INSN_BASIC_BLOCK 4
> 16: pc={(r114:SI!=0)?L20:pc}
> REG_BR_PROB 0x1388
> 22: L22:
> 17: NOTE_INSN_BASIC_BLOCK 5
> 6: r110:SI=0
> 20: L20:
> 21: NOTE_INSN_BASIC_BLOCK 6
> 23: pc={(r111:SI!=0x2b)?L22:pc}
> REG_BR_PROB 0x1f49
> 35: NOTE_INSN_BASIC_BLOCK 7
> 8: r110:SI=0x1
> 39: L39:
> 38: NOTE_INSN_BASIC_BLOCK 8
> 7: r110:SI=0x1
> 43: L43:
> 42: NOTE_INSN_BASIC_BLOCK 9
> 5: r110:SI=0x1
> 24: L24:
> 25: NOTE_INSN_BASIC_BLOCK 10
> 26: r112:SI=r110:SI
> 30: r0:SI=r112:SI
> 33: use r0:SI
>
> Basic blocks 8/9/10 are identical and live until pass jump2, which is
> after register allocation.
> I think these duplicated BBs do not contain additional information and
> should be better to be removed ASAP, because they might interfere with
> other passes like ifcvt.
>
> So should this issue be handled like in jump pass?
In this case, I'd expect DCE to optimize away the redundant assignments.
jeff
More information about the Gcc
mailing list