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.

Reply via email to