diff options
author | Jan Hubicka <hubicka@ucw.cz> | 2017-02-03 15:03:35 +0100 |
---|---|---|
committer | Jan Hubicka <hubicka@gcc.gnu.org> | 2017-02-03 14:03:35 +0000 |
commit | 30c6ec2f5309f78a1ded63243ae0037b63974d29 (patch) | |
tree | af9a108f3707a0072eb12193f8868bd736521ea3 /gcc | |
parent | 778e0ac39798b142bbc96c78da568e2debeeff0b (diff) | |
download | gcc-30c6ec2f5309f78a1ded63243ae0037b63974d29.zip gcc-30c6ec2f5309f78a1ded63243ae0037b63974d29.tar.gz gcc-30c6ec2f5309f78a1ded63243ae0037b63974d29.tar.bz2 |
tree-ssa-ifcombine.c (update_profile_after_ifcombine): New function.
* tree-ssa-ifcombine.c (update_profile_after_ifcombine): New function.
(ifcombine_ifandif): Use it.
* gcc.dg/tree-ssa/ssa-ifcombine-1.c: Check for no profile mismatches.
* gcc.dg/tree-ssa/ssa-ifcombine-2.c: Check for no profile mismatches.
* gcc.dg/tree-ssa/ssa-ifcombine-3.c: Check for no profile mismatches.
* gcc.dg/tree-ssa/ssa-ifcombine-4.c: Check for no profile mismatches.
* gcc.dg/tree-ssa/ssa-ifcombine-5.c: Check for no profile mismatches.
* gcc.dg/tree-ssa/ssa-ifcombine-6.c: Check for no profile mismatches.
* gcc.dg/tree-ssa/ssa-ifcombine-7.c: Check for no profile mismatches.
* gcc.dg/tree-ssa/ssa-ifcombine-8.c: Check for no profile mismatches.
* gcc.dg/tree-ssa/ssa-ifcombine-9.c: Check for no profile mismatches.
* gcc.dg/tree-ssa/ssa-ifcombine-10.c: Check for no profile mismatches.
* gcc.dg/tree-ssa/ssa-ifcombine-11.c: Check for no profile mismatches.
* gcc.dg/tree-ssa/ssa-ifcombine-12.c: Check for no profile mismatches.
* gcc.dg/tree-ssa/ssa-ifcombine-13.c: Check for no profile mismatches.
From-SVN: r245151
Diffstat (limited to 'gcc')
-rw-r--r-- | gcc/ChangeLog | 5 | ||||
-rw-r--r-- | gcc/testsuite/ChangeLog | 16 | ||||
-rw-r--r-- | gcc/testsuite/gcc.dg/tree-ssa/ssa-ifcombine-1.c | 3 | ||||
-rw-r--r-- | gcc/testsuite/gcc.dg/tree-ssa/ssa-ifcombine-10.c | 3 | ||||
-rw-r--r-- | gcc/testsuite/gcc.dg/tree-ssa/ssa-ifcombine-11.c | 3 | ||||
-rw-r--r-- | gcc/testsuite/gcc.dg/tree-ssa/ssa-ifcombine-12.c | 3 | ||||
-rw-r--r-- | gcc/testsuite/gcc.dg/tree-ssa/ssa-ifcombine-13.c | 3 | ||||
-rw-r--r-- | gcc/testsuite/gcc.dg/tree-ssa/ssa-ifcombine-2.c | 3 | ||||
-rw-r--r-- | gcc/testsuite/gcc.dg/tree-ssa/ssa-ifcombine-3.c | 3 | ||||
-rw-r--r-- | gcc/testsuite/gcc.dg/tree-ssa/ssa-ifcombine-4.c | 3 | ||||
-rw-r--r-- | gcc/testsuite/gcc.dg/tree-ssa/ssa-ifcombine-5.c | 3 | ||||
-rw-r--r-- | gcc/testsuite/gcc.dg/tree-ssa/ssa-ifcombine-6.c | 3 | ||||
-rw-r--r-- | gcc/testsuite/gcc.dg/tree-ssa/ssa-ifcombine-7.c | 3 | ||||
-rw-r--r-- | gcc/testsuite/gcc.dg/tree-ssa/ssa-ifcombine-8.c | 3 | ||||
-rw-r--r-- | gcc/testsuite/gcc.dg/tree-ssa/ssa-ifcombine-9.c | 3 | ||||
-rw-r--r-- | gcc/tree-ssa-ifcombine.c | 49 |
16 files changed, 96 insertions, 13 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 445f27b..7fd658e 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,8 @@ +2017-02-02 Jan Hubicka <hubicka@ucw.cz> + + * tree-ssa-ifcombine.c (update_profile_after_ifcombine): New function. + (ifcombine_ifandif): Use it. + 2017-02-03 Martin Liska <mliska@suse.cz> * doc/invoke.texi: Document default value for diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 1289892..ddcc87e 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,19 @@ +2017-02-02 Jan Hubicka <hubicka@ucw.cz> + + * gcc.dg/tree-ssa/ssa-ifcombine-1.c: Check for no profile mismatches. + * gcc.dg/tree-ssa/ssa-ifcombine-2.c: Check for no profile mismatches. + * gcc.dg/tree-ssa/ssa-ifcombine-3.c: Check for no profile mismatches. + * gcc.dg/tree-ssa/ssa-ifcombine-4.c: Check for no profile mismatches. + * gcc.dg/tree-ssa/ssa-ifcombine-5.c: Check for no profile mismatches. + * gcc.dg/tree-ssa/ssa-ifcombine-6.c: Check for no profile mismatches. + * gcc.dg/tree-ssa/ssa-ifcombine-7.c: Check for no profile mismatches. + * gcc.dg/tree-ssa/ssa-ifcombine-8.c: Check for no profile mismatches. + * gcc.dg/tree-ssa/ssa-ifcombine-9.c: Check for no profile mismatches. + * gcc.dg/tree-ssa/ssa-ifcombine-10.c: Check for no profile mismatches. + * gcc.dg/tree-ssa/ssa-ifcombine-11.c: Check for no profile mismatches. + * gcc.dg/tree-ssa/ssa-ifcombine-12.c: Check for no profile mismatches. + * gcc.dg/tree-ssa/ssa-ifcombine-13.c: Check for no profile mismatches. + 2017-02-02 Martin Sebor <msebor@redhat.com> PR middle-end/79275 diff --git a/gcc/testsuite/gcc.dg/tree-ssa/ssa-ifcombine-1.c b/gcc/testsuite/gcc.dg/tree-ssa/ssa-ifcombine-1.c index edbe287..e38c111 100644 --- a/gcc/testsuite/gcc.dg/tree-ssa/ssa-ifcombine-1.c +++ b/gcc/testsuite/gcc.dg/tree-ssa/ssa-ifcombine-1.c @@ -1,5 +1,5 @@ /* { dg-do compile } */ -/* { dg-options "-O -fdump-tree-optimized" } */ +/* { dg-options "-O -fdump-tree-optimized-details-blocks" } */ /* Testcase for PR31657. */ @@ -14,3 +14,4 @@ int foo (int x, int a, int b) } /* { dg-final { scan-tree-dump "\\|" "optimized" } } */ +/* { dg-final { scan-tree-dump-not "Invalid sum" "optimized" } } */ diff --git a/gcc/testsuite/gcc.dg/tree-ssa/ssa-ifcombine-10.c b/gcc/testsuite/gcc.dg/tree-ssa/ssa-ifcombine-10.c index 94221d0..1948af8 100644 --- a/gcc/testsuite/gcc.dg/tree-ssa/ssa-ifcombine-10.c +++ b/gcc/testsuite/gcc.dg/tree-ssa/ssa-ifcombine-10.c @@ -1,5 +1,5 @@ /* { dg-do compile } */ -/* { dg-options "-O2 -fdump-tree-optimized" } */ +/* { dg-options "-O2 -fdump-tree-optimized-details-blocks" } */ /* Testcase for PR31657. */ @@ -17,3 +17,4 @@ int f(int x, int a, int b) return t; } /* { dg-final { scan-tree-dump "& 5" "optimized" } } */ +/* { dg-final { scan-tree-dump-not "Invalid sum" "optimized" } } */ diff --git a/gcc/testsuite/gcc.dg/tree-ssa/ssa-ifcombine-11.c b/gcc/testsuite/gcc.dg/tree-ssa/ssa-ifcombine-11.c index d192911..780ecf5 100644 --- a/gcc/testsuite/gcc.dg/tree-ssa/ssa-ifcombine-11.c +++ b/gcc/testsuite/gcc.dg/tree-ssa/ssa-ifcombine-11.c @@ -1,5 +1,5 @@ /* { dg-do compile } */ -/* { dg-options "-O -fdump-tree-optimized" } */ +/* { dg-options "-O -fdump-tree-optimized-details-blocks" } */ /* Testcase for PR31657. */ int g(void); @@ -18,3 +18,4 @@ int f(int x, int a, int b) } /* { dg-final { scan-tree-dump "& 5" "optimized" } } */ +/* { dg-final { scan-tree-dump-not "Invalid sum" "optimized" } } */ diff --git a/gcc/testsuite/gcc.dg/tree-ssa/ssa-ifcombine-12.c b/gcc/testsuite/gcc.dg/tree-ssa/ssa-ifcombine-12.c index 88502c3..72ffaf5 100644 --- a/gcc/testsuite/gcc.dg/tree-ssa/ssa-ifcombine-12.c +++ b/gcc/testsuite/gcc.dg/tree-ssa/ssa-ifcombine-12.c @@ -1,5 +1,5 @@ /* { dg-do compile } */ -/* { dg-options "-O2 -fno-tree-vrp -fdump-tree-optimized" } */ +/* { dg-options "-O2 -fno-tree-vrp -fdump-tree-optimized-details-blocks" } */ /* Testcase for PR31657. */ @@ -17,3 +17,4 @@ int f(int x, int a, int b) return t; } /* { dg-final { scan-tree-dump "& 5" "optimized" } } */ +/* { dg-final { scan-tree-dump-not "Invalid sum" "optimized" } } */ diff --git a/gcc/testsuite/gcc.dg/tree-ssa/ssa-ifcombine-13.c b/gcc/testsuite/gcc.dg/tree-ssa/ssa-ifcombine-13.c index bbafe7b..7f4f011 100644 --- a/gcc/testsuite/gcc.dg/tree-ssa/ssa-ifcombine-13.c +++ b/gcc/testsuite/gcc.dg/tree-ssa/ssa-ifcombine-13.c @@ -1,5 +1,5 @@ /* { dg-do compile } */ -/* { dg-options "-O1 -fdump-tree-optimized" } */ +/* { dg-options "-O1 -fdump-tree-optimized-details-blocks" } */ /* { dg-additional-options "-mbranch-cost=2" { target { i?86-*-* x86_64-*-* s390*-*-* avr*-*-* } } } */ _Bool f1(_Bool a, _Bool b) @@ -18,3 +18,4 @@ _Bool f1(_Bool a, _Bool b) /* For LOGICAL_OP_NON_SHORT_CIRCUIT, this should be optimized into return a & b;, with no ifs. */ /* { dg-final { scan-tree-dump-not "if" "optimized" { target { i?86-*-* x86_64-*-* s390*-*-* avr*-*-* } } } } */ +/* { dg-final { scan-tree-dump-not "Invalid sum" "optimized" } } */ diff --git a/gcc/testsuite/gcc.dg/tree-ssa/ssa-ifcombine-2.c b/gcc/testsuite/gcc.dg/tree-ssa/ssa-ifcombine-2.c index c2a1a08..ac70d4b 100644 --- a/gcc/testsuite/gcc.dg/tree-ssa/ssa-ifcombine-2.c +++ b/gcc/testsuite/gcc.dg/tree-ssa/ssa-ifcombine-2.c @@ -1,5 +1,5 @@ /* { dg-do compile } */ -/* { dg-options "-O -fdump-tree-optimized" } */ +/* { dg-options "-O -fdump-tree-optimized-details-blocks" } */ /* Testcase for PR31657. */ @@ -20,3 +20,4 @@ doit: } /* { dg-final { scan-tree-dump "\\|" "optimized" } } */ +/* { dg-final { scan-tree-dump-not "Invalid sum" "optimized" } } */ diff --git a/gcc/testsuite/gcc.dg/tree-ssa/ssa-ifcombine-3.c b/gcc/testsuite/gcc.dg/tree-ssa/ssa-ifcombine-3.c index ff543c1..c51fdf3 100644 --- a/gcc/testsuite/gcc.dg/tree-ssa/ssa-ifcombine-3.c +++ b/gcc/testsuite/gcc.dg/tree-ssa/ssa-ifcombine-3.c @@ -1,5 +1,5 @@ /* { dg-do compile } */ -/* { dg-options "-O -fdump-tree-optimized" } */ +/* { dg-options "-O -fdump-tree-optimized-details-blocks" } */ /* Testcase extracted from PR15353. */ @@ -20,3 +20,4 @@ doit: } /* { dg-final { scan-tree-dump ">=" "optimized" } } */ +/* { dg-final { scan-tree-dump-not "Invalid sum" "optimized" } } */ diff --git a/gcc/testsuite/gcc.dg/tree-ssa/ssa-ifcombine-4.c b/gcc/testsuite/gcc.dg/tree-ssa/ssa-ifcombine-4.c index 8317194..178ebda 100644 --- a/gcc/testsuite/gcc.dg/tree-ssa/ssa-ifcombine-4.c +++ b/gcc/testsuite/gcc.dg/tree-ssa/ssa-ifcombine-4.c @@ -1,5 +1,5 @@ /* { dg-do compile } */ -/* { dg-options "-O -fdump-tree-optimized" } */ +/* { dg-options "-O -fdump-tree-optimized-details-blocks" } */ /* Testcase extracted from PR15353. */ @@ -18,3 +18,4 @@ void foo (int x, int a) } /* { dg-final { scan-tree-dump "!=" "optimized" } } */ +/* { dg-final { scan-tree-dump-not "Invalid sum" "optimized" } } */ diff --git a/gcc/testsuite/gcc.dg/tree-ssa/ssa-ifcombine-5.c b/gcc/testsuite/gcc.dg/tree-ssa/ssa-ifcombine-5.c index d8349c1..c16a0d9 100644 --- a/gcc/testsuite/gcc.dg/tree-ssa/ssa-ifcombine-5.c +++ b/gcc/testsuite/gcc.dg/tree-ssa/ssa-ifcombine-5.c @@ -1,5 +1,5 @@ /* { dg-do compile } */ -/* { dg-options "-O -fdump-tree-optimized" } */ +/* { dg-options "-O -fdump-tree-optimized-details-blocks" } */ /* Testcase from PR15353. */ @@ -17,3 +17,4 @@ int f(int *i, int *j) } /* { dg-final { scan-tree-dump ">=" "optimized" } } */ +/* { dg-final { scan-tree-dump-not "Invalid sum" "optimized" } } */ diff --git a/gcc/testsuite/gcc.dg/tree-ssa/ssa-ifcombine-6.c b/gcc/testsuite/gcc.dg/tree-ssa/ssa-ifcombine-6.c index 55450ab..a85531d 100644 --- a/gcc/testsuite/gcc.dg/tree-ssa/ssa-ifcombine-6.c +++ b/gcc/testsuite/gcc.dg/tree-ssa/ssa-ifcombine-6.c @@ -1,5 +1,5 @@ /* { dg-do compile } */ -/* { dg-options "-O -fdump-tree-ifcombine" } */ +/* { dg-options "-O -fdump-tree-ifcombine-details-blocks" } */ void bar (void); @@ -34,3 +34,4 @@ foo2 (unsigned int a) /* { dg-final { scan-tree-dump "optimizing bits or bits test" "ifcombine" } } */ /* { dg-final { scan-tree-dump "optimizing double bit test" "ifcombine" } } */ +/* { dg-final { scan-tree-dump-not "Invalid sum" "ifcombine" } } */ diff --git a/gcc/testsuite/gcc.dg/tree-ssa/ssa-ifcombine-7.c b/gcc/testsuite/gcc.dg/tree-ssa/ssa-ifcombine-7.c index 2053090..7eab7fd 100644 --- a/gcc/testsuite/gcc.dg/tree-ssa/ssa-ifcombine-7.c +++ b/gcc/testsuite/gcc.dg/tree-ssa/ssa-ifcombine-7.c @@ -1,5 +1,5 @@ /* { dg-do compile } */ -/* { dg-options "-O -fdump-tree-ifcombine" } */ +/* { dg-options "-O -fdump-tree-ifcombine-details-blocks" } */ int test1 (int i, int j) { @@ -12,3 +12,4 @@ int test1 (int i, int j) /* The above should be optimized to a i > j test by ifcombine. */ /* { dg-final { scan-tree-dump " > " "ifcombine" } } */ +/* { dg-final { scan-tree-dump-not "Invalid sum" "ifcombine" } } */ diff --git a/gcc/testsuite/gcc.dg/tree-ssa/ssa-ifcombine-8.c b/gcc/testsuite/gcc.dg/tree-ssa/ssa-ifcombine-8.c index c89d264..5bddf68 100644 --- a/gcc/testsuite/gcc.dg/tree-ssa/ssa-ifcombine-8.c +++ b/gcc/testsuite/gcc.dg/tree-ssa/ssa-ifcombine-8.c @@ -1,5 +1,5 @@ /* { dg-do compile } */ -/* { dg-options "-O -fno-trapping-math -fdump-tree-ifcombine" } */ +/* { dg-options "-O -fno-trapping-math -fdump-tree-ifcombine-details-blocks" } */ double test1 (double i, double j) { @@ -22,3 +22,4 @@ plouf: Instead we get u<=, which is acceptable with -fno-trapping-math. */ /* { dg-final { scan-tree-dump " u<= " "ifcombine" } } */ +/* { dg-final { scan-tree-dump-not "Invalid sum" "ifcombine" } } */ diff --git a/gcc/testsuite/gcc.dg/tree-ssa/ssa-ifcombine-9.c b/gcc/testsuite/gcc.dg/tree-ssa/ssa-ifcombine-9.c index c4c5573..bb18e0f 100644 --- a/gcc/testsuite/gcc.dg/tree-ssa/ssa-ifcombine-9.c +++ b/gcc/testsuite/gcc.dg/tree-ssa/ssa-ifcombine-9.c @@ -1,5 +1,5 @@ /* { dg-do compile } */ -/* { dg-options "-O2 -fno-trapping-math -fdump-tree-ifcombine" } */ +/* { dg-options "-O2 -fno-trapping-math -fdump-tree-ifcombine-details-blocks" } */ void f (); enum Sign { NEG=-1, ZERO, POS }; @@ -19,3 +19,4 @@ void g (double x) The transformation would also be legal with -ftrapping-math. */ /* { dg-final { scan-tree-dump "optimizing.* < " "ifcombine" } } */ +/* { dg-final { scan-tree-dump-not "Invalid sum" "ifcombine" } } */ diff --git a/gcc/tree-ssa-ifcombine.c b/gcc/tree-ssa-ifcombine.c index 6e43b5c..16f6c73 100644 --- a/gcc/tree-ssa-ifcombine.c +++ b/gcc/tree-ssa-ifcombine.c @@ -332,6 +332,51 @@ recognize_bits_test (gcond *cond, tree *name, tree *bits, bool inv) return true; } + +/* Update profile after code in outer_cond_bb was adjusted so + outer_cond_bb has no condition. */ + +static void +update_profile_after_ifcombine (basic_block inner_cond_bb, + basic_block outer_cond_bb) +{ + edge outer_to_inner = find_edge (outer_cond_bb, inner_cond_bb); + edge outer2 = (EDGE_SUCC (outer_cond_bb, 0) == outer_to_inner + ? EDGE_SUCC (outer_cond_bb, 1) + : EDGE_SUCC (outer_cond_bb, 0)); + edge inner_taken = EDGE_SUCC (inner_cond_bb, 0); + edge inner_not_taken = EDGE_SUCC (inner_cond_bb, 1); + + if (inner_taken->dest != outer2->dest) + std::swap (inner_taken, inner_not_taken); + gcc_assert (inner_taken->dest == outer2->dest); + + /* In the following we assume that inner_cond_bb has single predecessor. */ + gcc_assert (single_pred_p (inner_cond_bb)); + + /* Path outer_cond_bb->(outer2) needs to be merged into path + outer_cond_bb->(outer_to_inner)->inner_cond_bb->(inner_taken) + and probability of inner_not_taken updated. */ + + outer_to_inner->count = outer_cond_bb->count; + inner_cond_bb->count = outer_cond_bb->count; + inner_taken->count += outer2->count; + outer2->count = 0; + + inner_taken->probability = outer2->probability + + RDIV (outer_to_inner->probability + * inner_taken->probability, + REG_BR_PROB_BASE); + if (inner_taken->probability > REG_BR_PROB_BASE) + inner_taken->probability = REG_BR_PROB_BASE; + inner_not_taken->probability = REG_BR_PROB_BASE + - inner_taken->probability; + + outer_to_inner->probability = REG_BR_PROB_BASE; + inner_cond_bb->frequency = outer_cond_bb->frequency; + outer2->probability = 0; +} + /* If-convert on a and pattern with a common else block. The inner if is specified by its INNER_COND_BB, the outer by OUTER_COND_BB. inner_inv, outer_inv and result_inv indicate whether the conditions @@ -394,6 +439,8 @@ ifcombine_ifandif (basic_block inner_cond_bb, bool inner_inv, outer_inv ? boolean_false_node : boolean_true_node); update_stmt (outer_cond); + update_profile_after_ifcombine (inner_cond_bb, outer_cond_bb); + if (dump_file) { fprintf (dump_file, "optimizing double bit test to "); @@ -471,6 +518,7 @@ ifcombine_ifandif (basic_block inner_cond_bb, bool inner_inv, gimple_cond_set_condition_from_tree (outer_cond, outer_inv ? boolean_false_node : boolean_true_node); update_stmt (outer_cond); + update_profile_after_ifcombine (inner_cond_bb, outer_cond_bb); if (dump_file) { @@ -554,6 +602,7 @@ ifcombine_ifandif (basic_block inner_cond_bb, bool inner_inv, gimple_cond_set_condition_from_tree (outer_cond, outer_inv ? boolean_false_node : boolean_true_node); update_stmt (outer_cond); + update_profile_after_ifcombine (inner_cond_bb, outer_cond_bb); if (dump_file) { |