[Bug tree-optimization/71109] [6 Regression] gcc ICE at -O3 on valid code on x86_64-linux-gnu in "maybe_record_trace_start"
jakub at gcc dot gnu.org
gcc-bugzilla@gcc.gnu.org
Fri Jun 10 13:36:00 GMT 2016
https://gcc.gnu.org/bugzilla/show_bug.cgi?id=71109
--- Comment #3 from Jakub Jelinek <jakub at gcc dot gnu.org> ---
To me this looks like invalid jump optimization. In *.csa we have:
(jump_insn 27 26 28 3 (set (pc)
(if_then_else (ne (reg:CCZ 17 flags)
(const_int 0 [0]))
(label_ref 97)
(pc))) 635 {*jcc_1}
(expr_list:REG_DEAD (reg:CCZ 17 flags)
(int_list:REG_BR_PROB 450 (nil)))
-> 97)
...
(note 28 27 137 5 [bb 5] NOTE_INSN_BASIC_BLOCK)
(insn/f 137 28 138 5 (set (mem:DI (pre_dec:DI (reg/f:DI 7 sp)) [0 S8 A8])
(reg:DI 3 bx)) pr71109.c:19 -1
(expr_list:REG_DEAD (reg:DI 3 bx)
(nil)))
(note 138 137 30 5 NOTE_INSN_PROLOGUE_END)
...
(jump_insn 129 94 130 5 (set (pc)
(label_ref 122)) 667 {jump}
(nil)
-> 122)
;; succ: 7 [100.0%]
...
(barrier 130 129 97)
...
(code_label 97 130 98 6 3 "" [1 uses])
...
(code_label 122 146 123 7 4 "" [1 uses])
(note 123 122 124 7 [bb 7] NOTE_INSN_BASIC_BLOCK)
;; succ:
The bb7 is from __builtin_unreachable () that has been added.
But, in *.jump we have at the end of the (former bb5, now bb4):
(insn 71 69 97 4 (set (mem/c:QI (const:DI (plus:DI (symbol_ref:DI ("a") [flags
0x2] <var_decl 0x7ffff7ff9cf0 a>)
(const_int 32 [0x20]))) [2 MEM[(struct S0 *)&a + 32B]+0 S1
A32])
(reg:QI 1 dx [orig:99 p2$f8 ] [99])) pr71109.c:37 89 {*movqi_internal}
(expr_list:REG_DEAD (reg:QI 1 dx [orig:99 p2$f8 ] [99])
(nil)))
;; succ: 5 [100.0%] (FALLTHRU)
...
(code_label 97 71 98 5 3 "" [1 uses])
(note 98 97 103 5 [bb 5] NOTE_INSN_BASIC_BLOCK)
so while previously the basic block with prologue and missing epilogue (because
ending in __builtin_unreachable ()) ended up nowhere, now it falls through into
a bb that is reachable without the prologue being done.
I think in this simple case we should have just removed the edge, so it
wouldn't fallthrough into the next bb (i.e. no edges), but generally, I'm
afraid various __builtin_unreachable () RTL optimizations (where it is
expressed just by missing edges) could be also problematic.
More information about the Gcc-bugs
mailing list