]>
Commit | Line | Data |
---|---|---|
3b19cf69 PS |
1 | The problem here is that have two basic block forwarders which go to the |
2 | same basic block but destination of two different eh regions. We cannot | |
3 | forward both of these basic blocks to that other basic block. | |
4 | ||
5 | The way I fixed the issue is to make sure that if we removing | |
6 | a forwarder block which is coming in from a EH edge, make sure | |
7 | that the destination basic block have only one single predecessor. | |
8 | Yes this is too strong but there is no simple way to check if a basic | |
9 | block is the destination of a different eh region. | |
10 | ||
11 | --- gcc/gcc/tree-cfgcleanup.c 19 Aug 2005 18:52:55 -0000 2.7 | |
12 | +++ gcc/gcc/tree-cfgcleanup.c 24 Sep 2005 23:30:54 -0000 | |
13 | @@ -392,7 +392,18 @@ remove_forwarder_block (basic_block bb, | |
14 | return false; | |
15 | } | |
16 | } | |
17 | - | |
18 | + /* Check to make sure that we can remove a forwarder block for eh edges. */ | |
19 | + FOR_EACH_EDGE (e, ei, bb->preds) | |
20 | + { | |
21 | + /* This check is too strong, we should also be checking eh regions | |
22 | + but this is much harder. */ | |
23 | + if (e->flags & EDGE_EH) | |
24 | + { | |
25 | + if (!single_pred_p (dest)) | |
26 | + return false; | |
27 | + } | |
28 | + } | |
29 | + | |
30 | /* Redirect the edges. */ | |
31 | for (ei = ei_start (bb->preds); (e = ei_safe_edge (ei)); ) | |
32 | { |