This is the mail archive of the
gcc-bugs@gcc.gnu.org
mailing list for the GCC project.
[Bug middle-end/81564] New: ICE in group_case_labels_stmt()
- From: "bergner at gcc dot gnu.org" <gcc-bugzilla at gcc dot gnu dot org>
- To: gcc-bugs at gcc dot gnu dot org
- Date: Wed, 26 Jul 2017 17:00:35 +0000
- Subject: [Bug middle-end/81564] New: ICE in group_case_labels_stmt()
- Auto-submitted: auto-generated
https://gcc.gnu.org/bugzilla/show_bug.cgi?id=81564
Bug ID: 81564
Summary: ICE in group_case_labels_stmt()
Product: gcc
Version: 8.0
Status: UNCONFIRMED
Severity: normal
Priority: P3
Component: middle-end
Assignee: unassigned at gcc dot gnu.org
Reporter: bergner at gcc dot gnu.org
Target Milestone: ---
Yet another fallout from the switch changes.
bergner@pike:~/gcc/BUGS/$ cat bug.i
struct a {
int b;
int c;
};
void
foo (void)
{
struct a *e;
switch (e->c)
{
case 7:
case 3:
if (__builtin_expect(!0, 0))
__builtin_unreachable();
}
}
bergner@pike:~/gcc/BUGS/$
/home/bergner/gcc/build/gcc-fsf-mainline-debug/gcc/xgcc
-B/home/bergner/gcc/build/gcc-fsf-mainline-debug/gcc -O2 -S bug.i
during GIMPLE pass: cfg
bug.i: In function ‘foo’:
bug.i:7:1: internal compiler error: Segmentation fault
foo (void)
^~~
0x10e70e77 crash_signal
/home/bergner/gcc/gcc-fsf-mainline-base/gcc/toplev.c:338
0x10ee1508 group_case_labels_stmt(gswitch*)
/home/bergner/gcc/gcc-fsf-mainline-base/gcc/tree-cfg.c:1740
0x10edf98b end_recording_case_labels()
/home/bergner/gcc/gcc-fsf-mainline-base/gcc/tree-cfg.c:1255
0x10f0b9af cleanup_tree_cfg_1
/home/bergner/gcc/gcc-fsf-mainline-base/gcc/tree-cfgcleanup.c:748
0x10f0bdab cleanup_tree_cfg_noloop
/home/bergner/gcc/gcc-fsf-mainline-base/gcc/tree-cfgcleanup.c:843
0x10f0bfcf cleanup_tree_cfg()
/home/bergner/gcc/gcc-fsf-mainline-base/gcc/tree-cfgcleanup.c:899
0x10edcbcf execute_build_cfg
/home/bergner/gcc/gcc-fsf-mainline-base/gcc/tree-cfg.c:405
0x10edcca7 execute
/home/bergner/gcc/gcc-fsf-mainline-base/gcc/tree-cfg.c:434
Please submit a full bug report,
with preprocessed source if appropriate.
Program received signal SIGSEGV, Segmentation fault.
0x0000000010ee1508 in group_case_labels_stmt (stmt=0x3fffb59e7940)
at /home/bergner/gcc/gcc-fsf-mainline-pr72804-base/gcc/tree-cfg.c:1740
1740 if (EDGE_COUNT (base_bb->succs) == 0
(gdb) p base_bb
$2 = (basic_block) 0x0
(gdb) p base_case
$1 = (tree) 0x3fffb5a80000
(gdb) ptree base_case
<case_label_expr 0x3fffb5a80000
type <void_type 0x3fffb58d0f18 void VOID
align 8 symtab 0 alias set -1 canonical type 0x3fffb58d0f18
pointer_to_this <pointer_type 0x3fffb58d1068>>
side-effects
arg 0 <integer_cst 0x3fffb57f9750 type <integer_type 0x3fffb58d05e8 int>
constant 7>
arg 2 <label_decl 0x3fffb5a50380 L.5 type <void_type 0x3fffb58d0f18 void>
ignored VOID file (null) line 0 col 0
align 1 context <function_decl 0x3fffb5a13400 foo>>
bug.i:12:5 start: bug.i:12:5 finish: bug.i:12:8>
(gdb) p CASE_LABEL(base_case)
$3 = (tree) 0x3fffb5a50380
(gdb) ptree $3
<label_decl 0x3fffb5a50380 L.5
type <void_type 0x3fffb58d0f18 void VOID
align 8 symtab 0 alias set -1 canonical type 0x3fffb58d0f18
pointer_to_this <pointer_type 0x3fffb58d1068>>
ignored VOID file (null) line 0 col 0
align 1 context <function_decl 0x3fffb5a13400 foo>>
(gdb) pcfg
;; basic block 2, loop depth 0
;; pred: ENTRY
;; succ: 5
;; basic block 5, loop depth 0
;; pred: 2
;; succ: EXIT
(gdb) pbb 2
;; basic block 2, loop depth 0
;; pred: ENTRY
_1 = e->c;
switch (_1) <default: <L3> [INV] [count: INV], case 3: <L5>, case 7: <L5>>
;; succ: 5
(gdb) pbb 5
;; basic block 5, loop depth 0
;; pred: 2
<L3> [0.00%] [count: INV]:
return;
;; succ: EXIT
So it seems the block that the case labels point to has been deleted, which is
confirmed in the bug.i.011t.cfg dump file:
Removing basic block 3
;; basic block 3, loop depth 0
;; pred:
<L0> [0.00%] [count: INV]:
;; succ: 4
Removing basic block 4
;; basic block 4, loop depth 0
;; pred: 2
<L5> [0.00%] [count: INV]:
__builtin_unreachable ();
;; succ:
EMERGENCY DUMP:
foo ()
{
struct a * eD.2678;
;; basic block 2, loop depth 0, freq 0, maybe hot
;; prev block 0, next block 5, flags: (NEW, REACHABLE)
;; pred: ENTRY (FALLTHRU)
_1 = eD.2678->cD.2674;
switch (_1) <default: <L3> [INV] [count: INV], case 3: <L5>, case 7: <L5>>
;; succ: 5
;; basic block 5, loop depth 0, freq 0, maybe hot
;; prev block 2, next block 1, flags: (NEW, REACHABLE)
;; pred: 2
<L3> [0.00%] [count: INV]:
return;
;; succ: EXIT
}
In this base, we should probably discard these case statements similarly to how
we discard cases that have the same label as the default case.