[Bug tree-optimization/70604] switch statement optimization creates dead code
rguenth at gcc dot gnu.org
gcc-bugzilla@gcc.gnu.org
Tue Apr 12 10:58:00 GMT 2016
https://gcc.gnu.org/bugzilla/show_bug.cgi?id=70604
Richard Biener <rguenth at gcc dot gnu.org> changed:
What |Removed |Added
----------------------------------------------------------------------------
Keywords| |missed-optimization
Status|UNCONFIRMED |NEW
Last reconfirmed| |2016-04-12
CC| |jamborm at gcc dot gnu.org
Component|c |tree-optimization
Ever confirmed|0 |1
--- Comment #2 from Richard Biener <rguenth at gcc dot gnu.org> ---
For GCC 6 stronger value-numbering might have fixed most cases.
Are the cases you still see indirect jumps to only one active case or
is it just that if()s with multiple cases would have avoided the dead
code?
I can see
<bb 11>:
_139 = &MEM[(void *)cmd_84(D) + 930B];
_141 = conn_140(D)->sess;
_142 = _141->se_sess;
_143 = &cmd_84(D)->se_cmd;
transport_init_se_cmd (_143, &iscsi_ops, _142, 0, 3, 32, _139);
target_get_sess_cmd (_143, 1);
switch (_58) <default: <L81>, case 1: <L205>, case 2: <L204>, case 3: <L240>,
case 4: <L77>, case 5: <L78>, case 6: <L79>, case 7: <L80>>
<L240>:
goto <bb 19> (<L204>);
<L77>:
goto <bb 19> (<L204>);
<L78>:
goto <bb 19> (<L204>);
<L79>:
goto <bb 19> (<L204>);
<L80>:
goto <bb 19> (<L204>);
<L81>:
_146 = (int) _58;
printk ("\13Unknown iSCSI TMR Function: 0x%02x\n", _146);
_351 = iscsit_add_reject_from_cmd (cmd_84(D), 10, 1, buf_55(D)); [tail call]
goto <bb 54>;
<L205>:
# prephitmp_14 = PHI <1(18), 2(11), 3(12), 4(13), 5(14), 6(15), 7(16)>
<L204>:
with the default case looping back. switch conversion should probably handle
this but is run too early. OTOH it seems to be confused by the default
case not falling thru, failing to see the "simple" transform to a
if (... >= 1 && ... <= 7)
;
else
old default;
beginning to process the following SWITCH statement
(drivers/target/iscsi/iscsi_target.c:1807) : -------
switch (_74) <default: <L81>, case 1: <L204>, case 2: <L75>, case 3: <L76>,
case 4: <L77>, case 5: <L78>, case 6: <L79>, case 7: <L80>>
Bailing out - no common successor to all case label target blocks found
--------------------------------
beginning to process the following SWITCH statement
(drivers/target/iscsi/iscsi_target.c:1866) : -------
switch (_74) <default: <L127>, case 1: <L105>, case 2 ... 5: <L201>, case 6:
<L114>, case 7: <L117>, case 8: <L120>>
Bailing out - no common successor to all case label target blocks found
--------------------------------
Not sure what the other cases are.
More information about the Gcc-bugs
mailing list