https://gcc.gnu.org/bugzilla/show_bug.cgi?id=91355
Jakub Jelinek <jakub at gcc dot gnu.org> changed: What |Removed |Added ---------------------------------------------------------------------------- CC| |ebotcazou at gcc dot gnu.org, | |rth at gcc dot gnu.org --- Comment #5 from Jakub Jelinek <jakub at gcc dot gnu.org> --- I'm afraid I don't know enough of the EH rules on what's wrong, so will just try to describe what happens: ;; basic block 3, loop depth 0 ;; pred: 2 _10 = __cxa_allocate_exception (4); MEM[(int *)_10] = 3; __cxa_throw (_10, &_ZTIi, 0B); ;; succ: 6 ;; basic block 4, loop depth 0 ;; pred: 2 d.0_14 = d; _15 = d.0_14 + 1; d = _15; _6 = __cxa_allocate_exception (4); MEM[(int *)_6] = 3; __cxa_throw (_6, &_ZTIi, 0B); ;; succ: 5 ;; basic block 5, loop depth 0 ;; pred: 4 <L2>: d.1_16 = d; _17 = d.1_16 + 4294967295; d = _17; resx 4 ;; succ: 6 ;; basic block 6, loop depth 0 ;; pred: 3 ;; 5 <L3>: _20 = __builtin_eh_filter (1); if (_20 == -1) goto <bb 8>; [0.00%] else goto <bb 7>; [0.00%] ;; succ: 8 ;; 7 Now, if not -fno-tree-sink or Honza's change is in, sink changes that to: ;; basic block 5, loop depth 0, count 0 (precise), probably never executed ;; prev block 4, next block 10, flags: (NEW, REACHABLE, VISITED) ;; pred: 4 [never] count:0 (precise) (EH,EXECUTABLE) <L2>: resx 4 ;; succ: 10 [never] count:0 (precise) (EH,EXECUTABLE) ;; basic block 10, loop depth 0, count 0 (precise), probably never executed ;; prev block 5, next block 9, flags: (NEW) ;; pred: 5 [never] count:0 (precise) (EH,EXECUTABLE) <L7>: d.1_16 = d; _17 = d.1_16 + 4294967295; d = _17; goto <bb 6>; [100.00%] ;; succ: 6 [always] count:0 (precise) (FALLTHRU) ;; basic block 9, loop depth 0, count 0 (precise), probably never executed ;; prev block 10, next block 6, flags: (NEW) ;; pred: 3 [never] count:0 (precise) (EH,EXECUTABLE) <L6>: ;; succ: 6 [always] count:0 (precise) (FALLTHRU) ;; basic block 6, loop depth 0, count 0 (precise), probably never executed ;; prev block 9, next block 7, flags: (NEW, REACHABLE, VISITED) ;; pred: 9 [always] count:0 (precise) (FALLTHRU) ;; 10 [always] count:0 (precise) (FALLTHRU) <L3>: _20 = __builtin_eh_filter (1); if (_20 == -1) goto <bb 8>; [0.00%] else goto <bb 7>; [0.00%] ;; succ: 8 [never] count:0 (precise) (TRUE_VALUE,EXECUTABLE) ;; 7 [never] count:0 (precise) (FALSE_VALUE,EXECUTABLE) Before ehcleanup2 the difference is then (-fno-tree-sink -O1 vs. -ftree-sink -O1): ;; basic block 5, loop depth 0 ;; pred: 4 <L2>: - d.1_16 = d; - _17 = d.1_16 + 4294967295; - d = _17; resx 4 ;; succ: 6 ;; basic block 6, loop depth 0 +;; pred: 5 +<L7>: + d.1_16 = d; + _17 = d.1_16 + 4294967295; + d = _17; + goto <bb 8>; [100.00%] +;; succ: 8 + +;; basic block 7, loop depth 0 ;; pred: 3 -;; 5 +<L6>: +;; succ: 8 + +;; basic block 8, loop depth 0 +;; pred: 7 +;; 6 <L3>: _20 = __builtin_eh_filter (1); Now, ehcleanup2 removes resx 4; for some reason: Before removal of unreachable regions: Eh tree: - 1 allowed_exceptions land:{1,<L3>},{3,} filter :-1 types:int + 1 allowed_exceptions land:{4,<L6>},{1,<L7>},{3,} filter :-1 types:int 4 cleanup land:{2,<L2>} Reachable regions: n_bits = 8, set = {1 4 } -Reachable landing pads: n_bits = 4, set = {1 2 } +Reachable landing pads: n_bits = 5, set = {1 2 4 } Removing unreachable landing pad 3 After removal of unreachable regions: Eh tree: - 1 allowed_exceptions land:{1,<L3>} filter :-1 types:int + 1 allowed_exceptions land:{4,<L6>},{1,<L7>} filter :-1 types:int 4 cleanup land:{2,<L2>} +Removing basic block 7 +Removing basic block 5 +Removing unreachable region 4 ... ;; basic block 5, loop depth 0 ;; pred: 4 -<L2>: +<L7>: d.1_16 = d; _17 = d.1_16 + 4294967295; d = _17; - resx 4 ;; succ: 6 and in *.optimized dump that means: ;; basic block 5, loop depth 0 ;; pred: 4 -<L2>: +<L7>: d.1_16 = d; _17 = d.1_16 + 4294967295; d = _17; - __builtin_eh_copy_values (1, 4); ;; succ: 6 change and abort.