On 07/16/2015 01:03 PM, Martin Liška wrote: > On 07/09/2015 06:24 PM, Jeff Law wrote: >> On 07/09/2015 07:56 AM, mliska wrote: >>> gcc/ChangeLog: >>> >>> 2015-07-09 Martin Liska <mli...@suse.cz> >>> >>> * dbgcnt.def: Add new debug counter. >>> * ipa-icf-gimple.c (func_checker::compare_ssa_name): Add flag >>> for strict mode. >>> (func_checker::compare_memory_operand): Likewise. >>> (func_checker::compare_cst_or_decl): Handle if we are in >>> tail_merge_mode. >>> (func_checker::compare_operand): Pass strict flag properly. >>> (func_checker::stmt_local_def): New function. >>> (func_checker::compare_phi_node): Move from sem_function class. >>> (func_checker::compare_bb_tail_merge): New function. >>> (func_checker::compare_bb): Improve STMT iteration. >>> (func_checker::compare_gimple_call): Pass strict flag. >>> (func_checker::compare_gimple_assign): Likewise. >>> (func_checker::compare_gimple_label): Remove unused flag. >>> (ssa_names_set): New class. >>> (ssa_names_set::build): New function. >>> * ipa-icf-gimple.h (func_checker::gsi_next_nonlocal): New >>> function. >>> (ssa_names_set::contains): New function. >>> (ssa_names_set::add): Likewise. >>> * ipa-icf.c (sem_function::equals_private): Use transformed >>> function. >>> (sem_function::compare_phi_node): Move to func_checker class. >>> * ipa-icf.h: Add new declarations. >>> * tree-ssa-tail-merge.c (check_edges_correspondence): New >>> function. >>> (find_duplicate): Add usage of IPA ICF gimple infrastructure. >>> (find_clusters_1): Pass new sem_function argument. >>> (find_clusters): Likewise. >>> (tail_merge_optimize): Call IPA ICF comparison machinery. >> So a general question. We're passing in STRICT to several routines, which >> is fine. But then we're also checking M_TAIL_MERGE_MODE. What's the >> difference between the two? Can they be unified? > > Hello. > > I would say that STRICT is a bit generic mechanism that was introduced some > time before. It's e.g. used for checking of THIS arguments for methods and > make checking > more sensitive in situations that are somehow special. > > The newly added state is orthogonal to the previous one. > >> >> >>> >>> -/* Verifies that trees T1 and T2 are equivalent from perspective of ICF. >>> */ >>> +/* Verifies that trees T1 and T2 are equivalent from perspective of ICF. >>> + If STRICT flag is true, versions must match strictly. */ >>> >>> bool >>> -func_checker::compare_ssa_name (tree t1, tree t2) >>> +func_checker::compare_ssa_name (tree t1, tree t2, bool strict) >> This (and other) functions would seem to be used more than just ICF at this >> point. A pass over the comments to update them as appropriate would be >> appreciated. >> >>> @@ -626,6 +648,136 @@ func_checker::parse_labels (sem_bb *bb) >>> } >>> } >>> >>> +/* Return true if gimple STMT is just a local difinition in a >>> + basic block. Used SSA names are contained in SSA_NAMES_SET. */ >> s/difinition/definition/ > > Thanks. > >> >> I didn't find this comment particularly useful in understanding what this >> function does. AFAICT the function looks as the uses of the LHS of STMT and >> verifies they're all in the same block as STMT, right? >> >> It also verifies that the none of the operands within STMT are part of >> SSA_NAMES_SET. >> >> What role do those properties play in the meaning of "local definition"? > > I tried to explain it more deeply what's the purpose of this function. > >> >> >> >> >>> @@ -1037,4 +1205,60 @@ func_checker::compare_gimple_asm (const gasm *g1, >>> const gasm *g2) >>> return true; >>> } >>> >>> +void >>> +ssa_names_set::build (basic_block bb) >> Needs a function comment. What are the "important" names we're collecting >> here? >> >> Is a single forward and backward pass really sufficient to find all the >> important names? >> >> In the backward pass, do you have to consider things like ASMs? I guess >> it's difficult to understand what you need to look at because it's not >> entirely clear the set of SSA_NAMEs you're building. >> >> >> >>> @@ -149,12 +153,20 @@ public: >>> mapping between basic blocks and labels. */ >>> void parse_labels (sem_bb *bb); >>> >>> + /* For given basic blocks BB1 and BB2 (from functions FUNC1 and FUNC), >>> + true value is returned if phi nodes are semantically >>> + equivalent in these blocks. */ >>> + bool compare_phi_node (sem_bb *sem_bb1, sem_bb *sem_bb2); >> Presumably in the case of tail merging, FUNC1 and FUNC will be the same :-) > > Yes, the function is not called from tail-merge pass. > >> >> >>> /* Verifies that trees T1 and T2 are equivalent from perspective of >>> ICF. */ >>> - bool compare_ssa_name (tree t1, tree t2); >>> + bool compare_ssa_name (tree t1, tree t2, bool strict = true); >>> >>> /* Verification function for edges E1 and E2. */ >>> bool compare_edge (edge e1, edge e2); >>> @@ -204,7 +216,7 @@ public: >>> bool compare_tree_ssa_label (tree t1, tree t2); >>> >>> /* Function compare for equality given memory operands T1 and T2. */ >>> - bool compare_memory_operand (tree t1, tree t2); >>> + bool compare_memory_operand (tree t1, tree t2, bool strict = true); >>> >>> /* Function compare for equality given trees T1 and T2 which >>> can be either a constant or a declaration type. */ >>> @@ -213,7 +225,7 @@ public: >>> /* Function responsible for comparison of various operands T1 and T2. >>> If these components, from functions FUNC1 and FUNC2, are equal, true >>> is returned. */ >>> - bool compare_operand (tree t1, tree t2); >>> + bool compare_operand (tree t1, tree t2, bool strict = false); >> Is the default value for the parameter really needed in these methods? Why >> not go ahead and update the callers, I don't think we have that many right >> now. > > I've just grepped errors and it's more than 20 occurrences, so I hope it > clarifies > the usage of implicit value of the function. > >> >>> >>> /* Compares two tree list operands T1 and T2 and returns true if these >>> two trees are semantically equivalent. */ >>> @@ -237,6 +249,13 @@ public: >>> first parameter of a function. */ >>> static bool compatible_types_p (tree t1, tree t2); >>> >>> + /* Return true if gimple STMT is just a local difinition in a >>> + basic block. Used SSA names are contained in SSA_NAMES_SET. */ >>> + static bool stmt_local_def (gimple stmt, ssa_names_set *ssa_names_set); >> s/difinition/definition/ >> As with the implementation, I think the comment needs some clarification. >> >>> +/* SSA NAMES set. */ >>> +class ssa_names_set >> So what names are in this set? Ie, what is the ::build method searching for? >> >> >>> diff --git a/gcc/tree-ssa-tail-merge.c b/gcc/tree-ssa-tail-merge.c >>> index 018a966..b8632d7 100644 >>> --- a/gcc/tree-ssa-tail-merge.c >>> +++ b/gcc/tree-ssa-tail-merge.c >>> @@ -187,6 +187,7 @@ along with GCC; see the file COPYING3. If not see >>> >>> #include "config.h" >>> #include "system.h" >>> +#include <list> >>> #include "coretypes.h" >>> #include "backend.h" >>> #include "tree.h" >> I think Andrew has defined an ordering for the initial include files. I >> think you've #included <list> in the wrong place. Can it be moved down? > > Sure. > >> >>> + >>> +using namespace ipa_icf; >>> +using namespace ipa_icf_gimple; >> Is this wise? Does it significantly help with conciseness within the tail >> merging pass where it wants things ipa-icf and ipa-icf-gimple? >> >> I'm not objecting at this point, I want to hear your thoughts. > > I must agree with you, as I've started using both namespaces in tree-tail > merge pass, > it makes not much sense anymore. I suggest to come up with a namespace that > will > encapsulate 'identical code folding'-related stuff. What about: > > namespace icf > > ? > >> >> >>> >>> /* Describes a group of bbs with the same successors. The successor bbs >>> are >>> cached in succs, and the successor edge flags are cached in succ_flags. >>> @@ -1220,17 +1231,48 @@ gsi_advance_bw_nondebug_nonlocal >>> (gimple_stmt_iterator *gsi, tree *vuse, >>> } >>> } >>> >>> +static bool >>> +check_edges_correspondence (basic_block bb1, basic_block bb2) >> Needs a function comment. >> >> >>> +{ >>> + edge e1, e2; >>> + edge_iterator ei2 = ei_start (bb2->succs); >>> + >>> + for (edge_iterator ei1 = ei_start (bb1->succs); ei_cond (ei1, &e1); >>> + ei_next (&ei1)) >>> + { >>> + ei_cond (ei2, &e2); >>> + >>> + if (e1->dest->index != e2->dest->index || >>> + (e1->flags & (EDGE_TRUE_VALUE | EDGE_FALSE_VALUE)) >>> + != (e2->flags & (EDGE_TRUE_VALUE | EDGE_FALSE_VALUE))) >>> + return false; >> Formatting looks wrong in that conditional. >> >>> @@ -1265,11 +1307,29 @@ find_duplicate (same_succ same_succ, basic_block >>> bb1, basic_block bb2) >>> if (vuse_escaped && vuse1 != vuse2) >>> return; >>> >>> - if (dump_file) >>> - fprintf (dump_file, "find_duplicates: <bb %d> duplicate of <bb %d>\n", >>> + if (!icf_result && dump_file) >>> + fprintf (dump_file, >>> + "missed merge optimization: <bb %d> duplicate of <bb %d>\n", >>> bb1->index, bb2->index); >> So I realize this goes away in the #2 patch. But I'm curious how often it >> triggered and if there were any interesting patterns when the old tail >> merging triggered by the version utilizing ICF didn't or vice-versa. >> >> You mentioned posting some before/after results, but I haven't seen them yet. >> >> I'd like to do another pass over these changes, so if you could repost after >> the cleanups noted above, it'd be appreciated. >> >> Jeff >> >> > > I decided to come up with a single patch, mainly because Richi pointed out > that we should create a new tree pass and > it makes sense to do it in a single commit. In last patch of the previous > series, I modified some UBSAN tests, but proper > fix would be to ignore merging of UBSAN_* calls (as suggested in > corresponding emails). > > Following patch can survive bootstrap on x86_64-linux-pc and ppc64le-linux-pc > and regression tests. > > There are sizes of binaries before and after the patch: > > INKSCAPE: > before: 15626296 B > after: 15622200 B > > Firefox: > before: 130390352 B > after: 130379744 B > diff: 10608 B > > Thanks, > Martin > >
Due to changes dump file, it will be necessary to amend scanning of dump files. Thanks, Martin
>From 60bfc56c225f78a97c52cf451d3dfee088ff2615 Mon Sep 17 00:00:00 2001 From: mliska <mli...@suse.cz> Date: Thu, 16 Jul 2015 14:09:01 +0200 Subject: [PATCH 2/2] Fix tree-ssa-tail-merge tests to scan corresponding dump files. gcc/testsuite/ChangeLog: 2015-07-20 Martin Liska <mli...@suse.cz> * gcc.dg/pr43864-2.c: Change scanning of dump file to a newly added -fdump-tree-tail-merge. * gcc.dg/pr43864-3.c: Likewise. * gcc.dg/pr43864-4.c (int f): Change statement order as changes tree-tail merge passes cannot handle different order of statements (as opposed to value numbering can). * gcc.dg/pr43864.c: Likewise. * gcc.dg/pr51879-16.c: Likewise. * gcc.dg/pr51879-18.c: Likewise. * gcc.dg/pr51879-2.c: Likewise. * gcc.dg/pr51879-3.c: Likewise. * gcc.dg/pr51879-6.c: Likewise. * gcc.dg/pr51879-7.c: Likewise. * gcc.dg/pr51879.c: Likewise. * gcc.dg/tail-merge-store.c: Likewise. --- gcc/testsuite/gcc.dg/pr43864-2.c | 8 ++++---- gcc/testsuite/gcc.dg/pr43864-3.c | 8 ++++---- gcc/testsuite/gcc.dg/pr43864-4.c | 12 ++++++------ gcc/testsuite/gcc.dg/pr43864.c | 6 +++--- gcc/testsuite/gcc.dg/pr51879-16.c | 6 +++--- gcc/testsuite/gcc.dg/pr51879-18.c | 4 ++-- gcc/testsuite/gcc.dg/pr51879-2.c | 6 +++--- gcc/testsuite/gcc.dg/pr51879-3.c | 4 ++-- gcc/testsuite/gcc.dg/pr51879-6.c | 4 ++-- gcc/testsuite/gcc.dg/pr51879-7.c | 4 ++-- gcc/testsuite/gcc.dg/pr51879.c | 4 ++-- gcc/testsuite/gcc.dg/tail-merge-store.c | 6 +++--- 12 files changed, 36 insertions(+), 36 deletions(-) diff --git a/gcc/testsuite/gcc.dg/pr43864-2.c b/gcc/testsuite/gcc.dg/pr43864-2.c index 6393144..3965865 100644 --- a/gcc/testsuite/gcc.dg/pr43864-2.c +++ b/gcc/testsuite/gcc.dg/pr43864-2.c @@ -1,5 +1,5 @@ /* { dg-do compile } */ -/* { dg-options "-O2 -ftree-tail-merge -fdump-tree-pre" } */ +/* { dg-options "-O2 -ftree-tail-merge -fdump-tree-tail-merge" } */ int f (int c, int b, int d) @@ -17,6 +17,6 @@ f (int c, int b, int d) return r; } -/* { dg-final { scan-tree-dump-times "if " 0 "pre"} } */ -/* { dg-final { scan-tree-dump-times "(?n)_.*\\+.*_" 1 "pre"} } */ -/* { dg-final { scan-tree-dump-not "Invalid sum" "pre"} } */ +/* { dg-final { scan-tree-dump-times "if " 0 "tail-merge"} } */ +/* { dg-final { scan-tree-dump-times "(?n)_.*\\+.*_" 1 "tail-merge"} } */ +/* { dg-final { scan-tree-dump-not "Invalid sum" "tail-merge"} } */ diff --git a/gcc/testsuite/gcc.dg/pr43864-3.c b/gcc/testsuite/gcc.dg/pr43864-3.c index 24b59a1..3546f45 100644 --- a/gcc/testsuite/gcc.dg/pr43864-3.c +++ b/gcc/testsuite/gcc.dg/pr43864-3.c @@ -1,5 +1,5 @@ /* { dg-do compile } */ -/* { dg-options "-O2 -ftree-tail-merge -fdump-tree-pre" } */ +/* { dg-options "-O2 -ftree-tail-merge -fdump-tree-tail-merge" } */ /* Commutative case. */ @@ -18,6 +18,6 @@ int f(int c, int b, int d) return r; } -/* { dg-final { scan-tree-dump-times "if " 0 "pre"} } */ -/* { dg-final { scan-tree-dump-times "(?n)_.*\\+.*_" 1 "pre"} } */ -/* { dg-final { scan-tree-dump-not "Invalid sum" "pre"} } */ +/* { dg-final { scan-tree-dump-times "if " 0 "tail-merge"} } */ +/* { dg-final { scan-tree-dump-times "(?n)_.*\\+.*_" 1 "tail-merge"} } */ +/* { dg-final { scan-tree-dump-not "Invalid sum" "tail-merge"} } */ diff --git a/gcc/testsuite/gcc.dg/pr43864-4.c b/gcc/testsuite/gcc.dg/pr43864-4.c index 3c6cc50..7cd8011 100644 --- a/gcc/testsuite/gcc.dg/pr43864-4.c +++ b/gcc/testsuite/gcc.dg/pr43864-4.c @@ -1,5 +1,5 @@ /* { dg-do compile } */ -/* { dg-options "-O2 -ftree-tail-merge -fdump-tree-pre" } */ +/* { dg-options "-O2 -ftree-tail-merge -fdump-tree-tail-merge" } */ /* Different stmt order. */ @@ -14,15 +14,15 @@ int f(int c, int b, int d) } else { - r2 = d - b; e = d + b; + r2 = d - b; r = e; } return r - r2; } -/* { dg-final { scan-tree-dump-times "if " 0 "pre"} } */ -/* { dg-final { scan-tree-dump-times "(?n)_.*\\+.*_" 1 "pre"} } */ -/* { dg-final { scan-tree-dump-times "(?n)_.*-.*_" 2 "pre"} } */ -/* { dg-final { scan-tree-dump-not "Invalid sum" "pre"} } */ +/* { dg-final { scan-tree-dump-times "if " 0 "tail-merge"} } */ +/* { dg-final { scan-tree-dump-times "(?n)_.*\\+.*_" 1 "tail-merge"} } */ +/* { dg-final { scan-tree-dump-times "(?n)_.*-.*_" 2 "tail-merge"} } */ +/* { dg-final { scan-tree-dump-not "Invalid sum" "tail-merge"} } */ diff --git a/gcc/testsuite/gcc.dg/pr43864.c b/gcc/testsuite/gcc.dg/pr43864.c index ed69a73..aba88fc 100644 --- a/gcc/testsuite/gcc.dg/pr43864.c +++ b/gcc/testsuite/gcc.dg/pr43864.c @@ -1,5 +1,5 @@ /* { dg-do compile } */ -/* { dg-options "-O2 -ftree-tail-merge -fdump-tree-pre" } */ +/* { dg-options "-O2 -ftree-tail-merge -fdump-tree-tail-merge" } */ extern void foo (char*, int); extern void mysprintf (char *, char *); @@ -31,5 +31,5 @@ hprofStartupp (char *outputFileName, char *ctx) return ctx; } -/* { dg-final { scan-tree-dump-times "myfree \\(" 1 "pre"} } */ -/* { dg-final { scan-tree-dump-not "Invalid sum" "pre"} } */ +/* { dg-final { scan-tree-dump-times "myfree \\(" 1 "tail-merge"} } */ +/* { dg-final { scan-tree-dump-not "Invalid sum" "tail-merge"} } */ diff --git a/gcc/testsuite/gcc.dg/pr51879-16.c b/gcc/testsuite/gcc.dg/pr51879-16.c index ea771c0..9b91202 100644 --- a/gcc/testsuite/gcc.dg/pr51879-16.c +++ b/gcc/testsuite/gcc.dg/pr51879-16.c @@ -1,5 +1,5 @@ /* { dg-do compile } */ -/* { dg-options "-O2 -ftree-tail-merge -fdump-tree-pre" } */ +/* { dg-options "-O2 -ftree-tail-merge -fdump-tree-tail-merge" } */ struct S { int i; @@ -27,5 +27,5 @@ int bar (int c) { return r; } -/* { dg-final { scan-tree-dump-times "foo \\(" 1 "pre"} } */ -/* { dg-final { scan-tree-dump-times "foo2 \\(" 1 "pre"} } */ +/* { dg-final { scan-tree-dump-times "foo \\(" 1 "tail-merge"} } */ +/* { dg-final { scan-tree-dump-times "foo2 \\(" 1 "tail-merge"} } */ diff --git a/gcc/testsuite/gcc.dg/pr51879-18.c b/gcc/testsuite/gcc.dg/pr51879-18.c index 2944bea..64ee655 100644 --- a/gcc/testsuite/gcc.dg/pr51879-18.c +++ b/gcc/testsuite/gcc.dg/pr51879-18.c @@ -1,5 +1,5 @@ /* { dg-do compile } */ -/* { dg-options "-O2 -ftree-tail-merge -fdump-tree-pre -fno-tree-copy-prop -fno-tree-dominator-opts -fno-tree-copyrename" } */ +/* { dg-options "-O2 -ftree-tail-merge -fdump-tree-tail-merge -fno-tree-copy-prop -fno-tree-dominator-opts -fno-tree-copyrename" } */ extern int foo (void); @@ -13,4 +13,4 @@ void bar (int c, int *p) *q = foo (); } -/* { dg-final { scan-tree-dump-times "foo \\(" 1 "pre"} } */ +/* { dg-final { scan-tree-dump-times "foo \\(" 1 "tail-merge"} } */ diff --git a/gcc/testsuite/gcc.dg/pr51879-2.c b/gcc/testsuite/gcc.dg/pr51879-2.c index dd9b455..974fcb0 100644 --- a/gcc/testsuite/gcc.dg/pr51879-2.c +++ b/gcc/testsuite/gcc.dg/pr51879-2.c @@ -1,5 +1,5 @@ /* { dg-do compile } */ -/* { dg-options "-O2 -ftree-tail-merge -fdump-tree-pre" } */ +/* { dg-options "-O2 -ftree-tail-merge -fdump-tree-tail-merge" } */ int bar (int); void baz (int); @@ -14,5 +14,5 @@ foo (int y) baz (bar (7) + 6); } -/* { dg-final { scan-tree-dump-times "bar \\(" 1 "pre"} } */ -/* { dg-final { scan-tree-dump-times "baz \\(" 1 "pre"} } */ +/* { dg-final { scan-tree-dump-times "bar \\(" 1 "tail-merge"} } */ +/* { dg-final { scan-tree-dump-times "baz \\(" 1 "tail-merge"} } */ diff --git a/gcc/testsuite/gcc.dg/pr51879-3.c b/gcc/testsuite/gcc.dg/pr51879-3.c index 674edd4..b971d08 100644 --- a/gcc/testsuite/gcc.dg/pr51879-3.c +++ b/gcc/testsuite/gcc.dg/pr51879-3.c @@ -1,5 +1,5 @@ /* { dg-do compile } */ -/* { dg-options "-O2 -ftree-tail-merge -fdump-tree-pre" } */ +/* { dg-options "-O2 -ftree-tail-merge -fdump-tree-tail-merge" } */ int bar (int); void baz (int); @@ -15,4 +15,4 @@ foo (int y) baz (a); } -/* { dg-final { scan-tree-dump-times "bar \\(" 1 "pre"} } */ +/* { dg-final { scan-tree-dump-times "bar \\(" 1 "tail-merge"} } */ diff --git a/gcc/testsuite/gcc.dg/pr51879-6.c b/gcc/testsuite/gcc.dg/pr51879-6.c index 4295066..15bbcfe 100644 --- a/gcc/testsuite/gcc.dg/pr51879-6.c +++ b/gcc/testsuite/gcc.dg/pr51879-6.c @@ -1,5 +1,5 @@ /* { dg-do compile } */ -/* { dg-options "-O2 -ftree-tail-merge -fdump-tree-pre" } */ +/* { dg-options "-O2 -ftree-tail-merge -fdump-tree-tail-merge" } */ int bar (int); @@ -23,4 +23,4 @@ foo (int y) baz (a); } -/* { dg-final { scan-tree-dump-times "bar \\(" 1 "pre"} } */ +/* { dg-final { scan-tree-dump-times "bar \\(" 1 "tail-merge"} } */ diff --git a/gcc/testsuite/gcc.dg/pr51879-7.c b/gcc/testsuite/gcc.dg/pr51879-7.c index bb1a29a..a494a1a 100644 --- a/gcc/testsuite/gcc.dg/pr51879-7.c +++ b/gcc/testsuite/gcc.dg/pr51879-7.c @@ -1,5 +1,5 @@ /* { dg-do compile } */ -/* { dg-options "-O2 -ftree-tail-merge -fdump-tree-pre" } */ +/* { dg-options "-O2 -ftree-tail-merge -fdump-tree-tail-merge" } */ int z; @@ -12,4 +12,4 @@ foo (int y) z = 5; } -/* { dg-final { scan-tree-dump-times "z = 5" 1 "pre"} } */ +/* { dg-final { scan-tree-dump-times "z = 5" 1 "tail-merge"} } */ diff --git a/gcc/testsuite/gcc.dg/pr51879.c b/gcc/testsuite/gcc.dg/pr51879.c index d295373..3dd1cb6 100644 --- a/gcc/testsuite/gcc.dg/pr51879.c +++ b/gcc/testsuite/gcc.dg/pr51879.c @@ -1,5 +1,5 @@ /* { dg-do compile } */ -/* { dg-options "-O2 -ftree-tail-merge -fdump-tree-pre" } */ +/* { dg-options "-O2 -ftree-tail-merge -fdump-tree-tail-merge" } */ int bar (int); void baz (int); @@ -15,4 +15,4 @@ foo (int y) baz (a); } -/* { dg-final { scan-tree-dump-times "bar \\(" 1 "pre"} } */ +/* { dg-final { scan-tree-dump-times "bar \\(" 1 "tail-merge"} } */ diff --git a/gcc/testsuite/gcc.dg/tail-merge-store.c b/gcc/testsuite/gcc.dg/tail-merge-store.c index 6f323a0..74253b8 100644 --- a/gcc/testsuite/gcc.dg/tail-merge-store.c +++ b/gcc/testsuite/gcc.dg/tail-merge-store.c @@ -1,5 +1,5 @@ /* { dg-do compile } */ -/* { dg-options "-O2 -ftree-tail-merge -fdump-tree-pre" } */ +/* { dg-options "-O2 -ftree-tail-merge -fdump-tree-tail-merge" } */ int z; int x; @@ -17,5 +17,5 @@ f (int c, int d) } } -/* { dg-final { scan-tree-dump-times "duplicate of" 1 "pre"} } */ -/* { dg-final { scan-tree-dump-times "z = 5" 1 "pre"} } */ +/* { dg-final { scan-tree-dump-times "duplicate of" 1 "tail-merge"} } */ +/* { dg-final { scan-tree-dump-times "z = 5" 1 "tail-merge"} } */ -- 2.4.5