http://gcc.gnu.org/bugzilla/show_bug.cgi?id=51447
Andrey Belevantsev <abel at gcc dot gnu.org> changed:
What |Removed |Added
----------------------------------------------------------------------------
CC| |abel at gcc dot gnu.org
--- Comment #9 from Andrey Belevantsev <abel at gcc dot gnu.org> 2012-01-20
07:45:57 UTC ---
(In reply to comment #8)
> For ud_dce it's simplest to add/remove fake edges around it. For 4.8 it could
> be worthwhile to try adding fake edges around all RTL passes (at least those
> running in cfglayout mode) and see what breaks...
Do you mean just add/remove fake edges in init/fini_dce? For Jakub's test:
5 NOTE_INSN_BASIC_BLOCK
2 r60:DI=di:DI
REG_DEAD: di:DI
3 r61:DI=r10:DI
REG_DEAD: r10:DI
4 NOTE_INSN_FUNCTION_BEG
7 bx:DI=r60:DI
REG_DEAD: r60:DI
9 r63:DI=L0
10 clobber [scratch]
11 clobber [bp:DI]
12 bp:DI=[r61:DI]
13 clobber [scratch]
14 clobber [sp:DI]
15 sp:DI=[r61:DI+0x8]
REG_DEAD: r61:DI
16 use bp:DI
17 use sp:DI
18 pc=r63:DI
REG_DEAD: r63:DI
REG_NON_LOCAL_GOTO: 0
on top of his patch this results in
starting the processing of deferred insns
ending the processing of deferred insns
df_analyze called
-df_worklist_dataflow_doublequeue:n_basic_blocks 3 n_edges 1 count 3 ( 1)
+df_worklist_dataflow_doublequeue:n_basic_blocks 3 n_edges 2 count 3 ( 1)
+df_worklist_dataflow_doublequeue:n_basic_blocks 3 n_edges 2 count 3 ( 1)
+df_worklist_dataflow_doublequeue:n_basic_blocks 3 n_edges 2 count 3 ( 1)
bar
@@ -45,7 +47,7 @@ Dataflow summary:
;; rd out (21)
0, 1, 2, 4, 5, 6, 8, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23
-( 0 )->[2]->( )
+( 0 )->[2]->( 1 )
;; bb 2 artificial_defs: { }
;; bb 2 artificial_uses: { u0(6){ d7(bb 2 insn 12) }u1(7){ d9(bb 2 insn 15)
}u2(16){ d11(bb 0 insn -1) }u3(20){ d12(bb 0 insn -1) }}
;; lr in 5 [di] 6 [bp] 7 [sp] 16 [argp] 20 [frame] 39 [r10]
@@ -60,8 +62,8 @@ Dataflow summary:
3, 7, 9, 24, 25, 26
;; rd kill (9)
3, 4, 7, 8, 9, 10, 24, 25, 26
-;; lr out 3 [bx] 7 [sp] 16 [argp] 20 [frame]
-;; live out 3 [bx] 7 [sp] 16 [argp] 20 [frame]
+;; lr out 3 [bx] 6 [bp] 7 [sp] 16 [argp] 20 [frame]
+;; live out 3 [bx] 6 [bp] 7 [sp] 16 [argp] 20 [frame]
;; rd out (24)
0, 1, 2, 3, 5, 6, 7, 9, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23,
24, 25, 26
;; UD chains for artificial uses
@@ -93,7 +95,7 @@ Dataflow summary:
;; reg 20 { d12(bb 0 insn -1) }
;; reg 63 { d26(bb 2 insn 9) }
-( )->[1]->( )
+( 2 )->[1]->( )
;; bb 1 artificial_defs: { }
;; bb 1 artificial_uses: { u17(3){ }u18(6){ }u19(7){ }u20(20){ }}
;; lr in 3 [bx] 6 [bp] 7 [sp] 20 [frame]
so we get only extra bp in live outs of block 2 and still kill insn 7 (which is
the actual problem). Do we need bx to appear in live ins of EXIT (those are
empty with or without the patch)?