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