Message ID | 4a12886e-e839-2547-6127-49a61867a76f@linaro.org |
---|---|
State | New |
Headers | show |
On Wed, Oct 19, 2016 at 11:10 PM, kugan <kugan.vivekanandarajah@linaro.org> wrote: > Hi, > > > On 20/10/16 02:54, Andrew Pinski wrote: >> >> On Wed, Oct 19, 2016 at 1:01 AM, Christophe Lyon >> <christophe.lyon@linaro.org> wrote: >>> >>> On 18 October 2016 at 09:34, Richard Biener <rguenther@suse.de> wrote: >>>> >>>> On Mon, 17 Oct 2016, Richard Biener wrote: >>>> >>>>> >>>>> This refactors propagation vs. substitution and handles condition >>>>> simplification properly as well as passing a known taken edge down >>>>> to the DOM walker (avoiding useless work and properly handling PHIs). >>>>> >>>>> If we do all the work it's stupid to not fold away dead code... >>>>> >>>>> Bootstrap and regtest pending on x86_64-unknown-linux-gnu. >>>> >>>> >>>> The following is what I applied, also fixing a spelling mistake noticed >>>> by Bernhard. >>>> >>> Hi Richard, >>> >>> This patch is causing regressions on aarch64. These tests now fail: >> >> >> So I looked into it and found the testcase themselves need to be changed. >> The functions are marked as noinline but not noclone. >> For an example: >> static void __attribute__((noinline)) >> check_args_8 (int a0, int a1, int a2, int a3, int a4, int a5, int a6, int >> a7, >> int a8) >> .... >> > > Indeed. In test12 and so on, arguments for check_args_8/check_args_24 is now > becoming constant which enables ipa-cp to create specialized clones. Though > this is good, in order to preserve the tested functionality, we need to add > noclone attribute. Here is a patch to do this. > > Regression tested on aatch64-linux-gnu. Is this OK for trunk? I think this is obvious, mainly because noinline was already there. Thanks, Andrew > > Thanks, > Kugan > > gcc/testsuite/ChangeLog: > > 2016-10-20 Kugan Vivekanandarajah <kuganvi@linaro.org> > > * gcc.target/aarch64/test_frame_common.h: Add noclone attribute > such that cloned verions of tested functions are not created. > > > >> Thanks, >> Andrew >> >>> gcc.target/aarch64/test_frame_12.c scan-assembler-times ldp\tx29, >>> x30, \\[sp, [0-9]+\\] 1 >>> gcc.target/aarch64/test_frame_12.c scan-assembler-times sub\tsp, sp, >>> #[0-9]+ 1 >>> gcc.target/aarch64/test_frame_15.c scan-assembler-times stp\tx29, >>> x30, \\[sp, [0-9]+\\] 1 >>> gcc.target/aarch64/test_frame_15.c scan-assembler-times sub\tsp, sp, >>> #[0-9]+ 1 >>> gcc.target/aarch64/test_frame_8.c scan-assembler-times ldr\tx30, >>> \\[sp, [0-9]+\\] 1 >>> gcc.target/aarch64/test_frame_8.c scan-assembler-times str\tx30, >>> \\[sp, [0-9]+\\] 1 >>> >>> Christophe >>> >>>> Richard. >>>> >>>> 2016-10-18 Richard Biener <rguenther@suse.de> >>>> >>>> * tree-vrp.c (evrp_dom_walker::before_dom_children): Handle >>>> not visited but non-executable predecessors. Return taken edge. >>>> Simplify conditions and refactor propagation vs. folding step. >>>> >>>> * gcc.dg/tree-ssa/pr20318.c: Disable EVRP. >>>> * gcc.dg/tree-ssa/pr21001.c: Likewise. >>>> * gcc.dg/tree-ssa/pr21090.c: Likewise. >>>> * gcc.dg/tree-ssa/pr21294.c: Likewise. >>>> * gcc.dg/tree-ssa/pr21563.c: Likewise. >>>> * gcc.dg/tree-ssa/pr23744.c: Likewise. >>>> * gcc.dg/tree-ssa/pr25382.c: Likewise. >>>> * gcc.dg/tree-ssa/pr68431.c: Likewise. >>>> * gcc.dg/tree-ssa/vrp03.c: Likewise. >>>> * gcc.dg/tree-ssa/vrp06.c: Likewise. >>>> * gcc.dg/tree-ssa/vrp07.c: Likewise. >>>> * gcc.dg/tree-ssa/vrp09.c: Likewise. >>>> * gcc.dg/tree-ssa/vrp19.c: Likewise. >>>> * gcc.dg/tree-ssa/vrp20.c: Likewise. >>>> * gcc.dg/tree-ssa/vrp92.c: Likewise. >>>> * gcc.dg/pr68217.c: Likewise. >>>> * gcc.dg/predict-9.c: Likewise. >>>> * gcc.dg/tree-prof/val-prof-5.c: Adjust. >>>> * gcc.dg/predict-1.c: Likewise. >>>> >>>> >>>> >>>> Index: gcc/tree-vrp.c >>>> =================================================================== >>>> --- gcc/tree-vrp.c (revision 241242) >>>> +++ gcc/tree-vrp.c (working copy) >>>> @@ -10741,12 +10741,13 @@ evrp_dom_walker::before_dom_children (ba >>>> gimple_stmt_iterator gsi; >>>> edge e; >>>> edge_iterator ei; >>>> - bool has_unvisived_preds = false; >>>> + bool has_unvisited_preds = false; >>>> >>>> FOR_EACH_EDGE (e, ei, bb->preds) >>>> - if (!(e->src->flags & BB_VISITED)) >>>> + if (e->flags & EDGE_EXECUTABLE >>>> + && !(e->src->flags & BB_VISITED)) >>>> { >>>> - has_unvisived_preds = true; >>>> + has_unvisited_preds = true; >>>> break; >>>> } >>>> >>>> @@ -10756,7 +10757,7 @@ evrp_dom_walker::before_dom_children (ba >>>> gphi *phi = gpi.phi (); >>>> tree lhs = PHI_RESULT (phi); >>>> value_range vr_result = VR_INITIALIZER; >>>> - if (!has_unvisived_preds >>>> + if (!has_unvisited_preds >>>> && stmt_interesting_for_vrp (phi)) >>>> extract_range_from_phi_node (phi, &vr_result); >>>> else >>>> @@ -10764,81 +10765,90 @@ evrp_dom_walker::before_dom_children (ba >>>> update_value_range (lhs, &vr_result); >>>> } >>>> >>>> + edge taken_edge = NULL; >>>> + >>>> /* Visit all other stmts and discover any new VRs possible. */ >>>> for (gsi = gsi_start_bb (bb); !gsi_end_p (gsi); gsi_next (&gsi)) >>>> { >>>> gimple *stmt = gsi_stmt (gsi); >>>> - edge taken_edge; >>>> tree output = NULL_TREE; >>>> gimple *old_stmt = stmt; >>>> bool was_noreturn = (is_gimple_call (stmt) >>>> && gimple_call_noreturn_p (stmt)); >>>> >>>> - /* TODO, if found taken_edge, we should visit (return it) and >>>> travel >>>> - again to improve VR as done in DOM/SCCVN optimizations. It >>>> should >>>> - be done carefully as stmts might prematurely leave a BB like >>>> - in EH. */ >>>> - if (stmt_interesting_for_vrp (stmt)) >>>> + if (gcond *cond = dyn_cast <gcond *> (stmt)) >>>> + { >>>> + vrp_visit_cond_stmt (cond, &taken_edge); >>>> + if (taken_edge) >>>> + { >>>> + if (taken_edge->flags & EDGE_TRUE_VALUE) >>>> + gimple_cond_make_true (cond); >>>> + else if (taken_edge->flags & EDGE_FALSE_VALUE) >>>> + gimple_cond_make_false (cond); >>>> + else >>>> + gcc_unreachable (); >>>> + } >>>> + } >>>> + else if (stmt_interesting_for_vrp (stmt)) >>>> { >>>> + edge taken_edge; >>>> value_range vr = VR_INITIALIZER; >>>> extract_range_from_stmt (stmt, &taken_edge, &output, &vr); >>>> if (output >>>> && (vr.type == VR_RANGE || vr.type == VR_ANTI_RANGE)) >>>> - update_value_range (output, &vr); >>>> - else >>>> - set_defs_to_varying (stmt); >>>> - >>>> - /* Try folding stmts with the VR discovered. */ >>>> - bool did_replace >>>> - = replace_uses_in (stmt, >>>> - op_with_constant_singleton_value_range); >>>> - if (fold_stmt (&gsi, follow_single_use_edges) >>>> - || did_replace) >>>> - update_stmt (gsi_stmt (gsi)); >>>> - >>>> - if (did_replace) >>>> { >>>> - /* If we cleaned up EH information from the statement, >>>> - remove EH edges. */ >>>> - if (maybe_clean_or_replace_eh_stmt (old_stmt, stmt)) >>>> - bitmap_set_bit (need_eh_cleanup, bb->index); >>>> - >>>> - /* If we turned a not noreturn call into a noreturn one >>>> - schedule it for fixup. */ >>>> - if (!was_noreturn >>>> - && is_gimple_call (stmt) >>>> - && gimple_call_noreturn_p (stmt)) >>>> - stmts_to_fixup.safe_push (stmt); >>>> + update_value_range (output, &vr); >>>> >>>> - if (gimple_assign_single_p (stmt)) >>>> + /* Set the SSA with the value range. */ >>>> + if (INTEGRAL_TYPE_P (TREE_TYPE (output))) >>>> { >>>> - tree rhs = gimple_assign_rhs1 (stmt); >>>> - if (TREE_CODE (rhs) == ADDR_EXPR) >>>> - recompute_tree_invariant_for_addr_expr (rhs); >>>> + value_range *vr = get_value_range (output); >>>> + >>>> + if ((vr->type == VR_RANGE >>>> + || vr->type == VR_ANTI_RANGE) >>>> + && (TREE_CODE (vr->min) == INTEGER_CST) >>>> + && (TREE_CODE (vr->max) == INTEGER_CST)) >>>> + set_range_info (output, vr->type, vr->min, vr->max); >>>> } >>>> } >>>> + else >>>> + set_defs_to_varying (stmt); >>>> + } >>>> + else >>>> + set_defs_to_varying (stmt); >>>> >>>> - def_operand_p def_p = SINGLE_SSA_DEF_OPERAND (stmt, >>>> SSA_OP_DEF); >>>> - /* Set the SSA with the value range. */ >>>> - if (def_p >>>> - && TREE_CODE (DEF_FROM_PTR (def_p)) == SSA_NAME >>>> - && INTEGRAL_TYPE_P (TREE_TYPE (DEF_FROM_PTR (def_p)))) >>>> - { >>>> - tree def = DEF_FROM_PTR (def_p); >>>> - value_range *vr = get_value_range (def); >>>> + /* Try folding stmts with the VR discovered. */ >>>> + bool did_replace >>>> + = replace_uses_in (stmt, >>>> op_with_constant_singleton_value_range); >>>> + if (fold_stmt (&gsi, follow_single_use_edges) >>>> + || did_replace) >>>> + update_stmt (gsi_stmt (gsi)); >>>> >>>> - if ((vr->type == VR_RANGE >>>> - || vr->type == VR_ANTI_RANGE) >>>> - && (TREE_CODE (vr->min) == INTEGER_CST) >>>> - && (TREE_CODE (vr->max) == INTEGER_CST)) >>>> - set_range_info (def, vr->type, vr->min, vr->max); >>>> + if (did_replace) >>>> + { >>>> + /* If we cleaned up EH information from the statement, >>>> + remove EH edges. */ >>>> + if (maybe_clean_or_replace_eh_stmt (old_stmt, stmt)) >>>> + bitmap_set_bit (need_eh_cleanup, bb->index); >>>> + >>>> + /* If we turned a not noreturn call into a noreturn one >>>> + schedule it for fixup. */ >>>> + if (!was_noreturn >>>> + && is_gimple_call (stmt) >>>> + && gimple_call_noreturn_p (stmt)) >>>> + stmts_to_fixup.safe_push (stmt); >>>> + >>>> + if (gimple_assign_single_p (stmt)) >>>> + { >>>> + tree rhs = gimple_assign_rhs1 (stmt); >>>> + if (TREE_CODE (rhs) == ADDR_EXPR) >>>> + recompute_tree_invariant_for_addr_expr (rhs); >>>> } >>>> } >>>> - else >>>> - set_defs_to_varying (stmt); >>>> } >>>> bb->flags |= BB_VISITED; >>>> - return NULL; >>>> + >>>> + return taken_edge; >>>> } >>>> >>>> /* Restore/pop VRs valid only for BB when we leave BB. */ >>>> Index: gcc/testsuite/gcc.dg/pr68217.c >>>> =================================================================== >>>> --- gcc/testsuite/gcc.dg/pr68217.c (revision 241241) >>>> +++ gcc/testsuite/gcc.dg/pr68217.c (working copy) >>>> @@ -1,6 +1,5 @@ >>>> - >>>> /* { dg-do compile } */ >>>> -/* { dg-options "-O2 -fdump-tree-vrp1" } */ >>>> +/* { dg-options "-O2 -fdisable-tree-evrp -fdump-tree-vrp1" } */ >>>> >>>> int foo (void) >>>> { >>>> Index: gcc/testsuite/gcc.dg/predict-1.c >>>> =================================================================== >>>> --- gcc/testsuite/gcc.dg/predict-1.c (revision 241241) >>>> +++ gcc/testsuite/gcc.dg/predict-1.c (working copy) >>>> @@ -23,4 +23,4 @@ void foo (int bound) >>>> } >>>> } >>>> >>>> -/* { dg-final { scan-tree-dump-times "guess loop iv compare heuristics >>>> of edge\[^:\]*: 2.0%" 5 "profile_estimate"} } */ >>>> +/* { dg-final { scan-tree-dump-times "guess loop iv compare heuristics >>>> of edge\[^:\]*: 2.0%" 4 "profile_estimate"} } */ >>>> Index: gcc/testsuite/gcc.dg/predict-9.c >>>> =================================================================== >>>> --- gcc/testsuite/gcc.dg/predict-9.c (revision 241241) >>>> +++ gcc/testsuite/gcc.dg/predict-9.c (working copy) >>>> @@ -1,5 +1,5 @@ >>>> /* { dg-do compile } */ >>>> -/* { dg-options "-O2 -fdump-tree-profile_estimate" } */ >>>> +/* { dg-options "-O2 -fdisable-tree-evrp -fdump-tree-profile_estimate" >>>> } */ >>>> >>>> extern int global; >>>> extern int global2; >>>> Index: gcc/testsuite/gcc.dg/tree-prof/val-prof-5.c >>>> =================================================================== >>>> --- gcc/testsuite/gcc.dg/tree-prof/val-prof-5.c (revision 241241) >>>> +++ gcc/testsuite/gcc.dg/tree-prof/val-prof-5.c (working copy) >>>> @@ -6,7 +6,7 @@ main() >>>> { >>>> int i; >>>> for (i = 0; i < 1000; i++) >>>> - if (a[i]) >>>> + if (a[i] != 1) >>>> a[i]/=b; >>>> else >>>> a[i]/=b; >>>> Index: gcc/testsuite/gcc.dg/tree-ssa/pr20318.c >>>> =================================================================== >>>> --- gcc/testsuite/gcc.dg/tree-ssa/pr20318.c (revision 241241) >>>> +++ gcc/testsuite/gcc.dg/tree-ssa/pr20318.c (working copy) >>>> @@ -1,5 +1,5 @@ >>>> /* { dg-do compile { target { ! keeps_null_pointer_checks } } } */ >>>> -/* { dg-options "-O2 -fdump-tree-original -fdump-tree-vrp1 >>>> -fdelete-null-pointer-checks" } */ >>>> +/* { dg-options "-O2 -fdump-tree-original -fdump-tree-vrp1 >>>> -fdelete-null-pointer-checks -fdisable-tree-evrp" } */ >>>> >>>> extern int* f(int) __attribute__((returns_nonnull)); >>>> extern void eliminate (); >>>> Index: gcc/testsuite/gcc.dg/tree-ssa/pr21001.c >>>> =================================================================== >>>> --- gcc/testsuite/gcc.dg/tree-ssa/pr21001.c (revision 241241) >>>> +++ gcc/testsuite/gcc.dg/tree-ssa/pr21001.c (working copy) >>>> @@ -5,7 +5,7 @@ >>>> range information out of the conditional. */ >>>> >>>> /* { dg-do compile } */ >>>> -/* { dg-options "-O2 -fno-tree-dominator-opts -fno-tree-fre >>>> -fdump-tree-vrp1-details" } */ >>>> +/* { dg-options "-O2 -fno-tree-dominator-opts -fno-tree-fre >>>> -fdisable-tree-evrp -fdump-tree-vrp1-details" } */ >>>> >>>> int >>>> foo (int a) >>>> Index: gcc/testsuite/gcc.dg/tree-ssa/pr21090.c >>>> =================================================================== >>>> --- gcc/testsuite/gcc.dg/tree-ssa/pr21090.c (revision 241241) >>>> +++ gcc/testsuite/gcc.dg/tree-ssa/pr21090.c (working copy) >>>> @@ -1,5 +1,5 @@ >>>> /* { dg-do compile } */ >>>> -/* { dg-options "-O2 -fdump-tree-vrp1 -fdelete-null-pointer-checks" } >>>> */ >>>> +/* { dg-options "-O2 -fdisable-tree-evrp -fdump-tree-vrp1 >>>> -fdelete-null-pointer-checks" } */ >>>> >>>> int g, h; >>>> >>>> Index: gcc/testsuite/gcc.dg/tree-ssa/pr21294.c >>>> =================================================================== >>>> --- gcc/testsuite/gcc.dg/tree-ssa/pr21294.c (revision 241241) >>>> +++ gcc/testsuite/gcc.dg/tree-ssa/pr21294.c (working copy) >>>> @@ -4,7 +4,7 @@ >>>> allows us to eliminate the second "if" statement. */ >>>> >>>> /* { dg-do compile } */ >>>> -/* { dg-options "-O2 -fno-tree-dominator-opts -fdump-tree-vrp1-details" >>>> } */ >>>> +/* { dg-options "-O2 -fno-tree-dominator-opts -fdisable-tree-evrp >>>> -fdump-tree-vrp1-details" } */ >>>> >>>> struct f { >>>> int i; >>>> Index: gcc/testsuite/gcc.dg/tree-ssa/pr21563.c >>>> =================================================================== >>>> --- gcc/testsuite/gcc.dg/tree-ssa/pr21563.c (revision 241241) >>>> +++ gcc/testsuite/gcc.dg/tree-ssa/pr21563.c (working copy) >>>> @@ -2,7 +2,7 @@ >>>> Make sure VRP folds the second "if" statement. */ >>>> >>>> /* { dg-do compile } */ >>>> -/* { dg-options "-O2 -fno-tree-dominator-opts -fdump-tree-vrp1-details" >>>> } */ >>>> +/* { dg-options "-O2 -fno-tree-dominator-opts -fdisable-tree-evrp >>>> -fdump-tree-vrp1-details" } */ >>>> >>>> int >>>> foo (int a) >>>> Index: gcc/testsuite/gcc.dg/tree-ssa/pr23744.c >>>> =================================================================== >>>> --- gcc/testsuite/gcc.dg/tree-ssa/pr23744.c (revision 241241) >>>> +++ gcc/testsuite/gcc.dg/tree-ssa/pr23744.c (working copy) >>>> @@ -1,5 +1,5 @@ >>>> /* { dg-do compile } */ >>>> -/* { dg-options "-O2 -fno-tree-ccp -fdump-tree-vrp1" } */ >>>> +/* { dg-options "-O2 -fno-tree-ccp -fdisable-tree-evrp >>>> -fdump-tree-vrp1" } */ >>>> >>>> void h (void); >>>> >>>> Index: gcc/testsuite/gcc.dg/tree-ssa/pr25382.c >>>> =================================================================== >>>> --- gcc/testsuite/gcc.dg/tree-ssa/pr25382.c (revision 241241) >>>> +++ gcc/testsuite/gcc.dg/tree-ssa/pr25382.c (working copy) >>>> @@ -3,7 +3,7 @@ >>>> Check that VRP now gets ranges from BIT_AND_EXPRs. */ >>>> >>>> /* { dg-do compile } */ >>>> -/* { dg-options "-O2 -fno-tree-ccp -fdump-tree-vrp1" } */ >>>> +/* { dg-options "-O2 -fno-tree-ccp -fdisable-tree-evrp >>>> -fdump-tree-vrp1" } */ >>>> >>>> int >>>> foo (int a) >>>> Index: gcc/testsuite/gcc.dg/tree-ssa/pr68431.c >>>> =================================================================== >>>> --- gcc/testsuite/gcc.dg/tree-ssa/pr68431.c (revision 241241) >>>> +++ gcc/testsuite/gcc.dg/tree-ssa/pr68431.c (working copy) >>>> @@ -1,5 +1,5 @@ >>>> /* PR tree-optimization/68431 */ >>>> -/* { dg-options "-O2 -fdump-tree-vrp1-details" } */ >>>> +/* { dg-options "-O2 -fdisable-tree-evrp -fdump-tree-vrp1-details" } */ >>>> >>>> unsigned int x = 1; >>>> int >>>> Index: gcc/testsuite/gcc.dg/tree-ssa/vrp03.c >>>> =================================================================== >>>> --- gcc/testsuite/gcc.dg/tree-ssa/vrp03.c (revision 241241) >>>> +++ gcc/testsuite/gcc.dg/tree-ssa/vrp03.c (working copy) >>>> @@ -1,5 +1,5 @@ >>>> /* { dg-do compile } */ >>>> -/* { dg-options "-O2 -fdump-tree-vrp1" } */ >>>> +/* { dg-options "-O2 -fdisable-tree-evrp -fdump-tree-vrp1" } */ >>>> >>>> struct A >>>> { >>>> Index: gcc/testsuite/gcc.dg/tree-ssa/vrp06.c >>>> =================================================================== >>>> --- gcc/testsuite/gcc.dg/tree-ssa/vrp06.c (revision 241241) >>>> +++ gcc/testsuite/gcc.dg/tree-ssa/vrp06.c (working copy) >>>> @@ -1,5 +1,5 @@ >>>> /* { dg-do compile } */ >>>> -/* { dg-options "-O2 -fdump-tree-vrp1" } */ >>>> +/* { dg-options "-O2 -fdisable-tree-evrp -fdump-tree-vrp1" } */ >>>> >>>> int baz (void); >>>> >>>> Index: gcc/testsuite/gcc.dg/tree-ssa/vrp07.c >>>> =================================================================== >>>> --- gcc/testsuite/gcc.dg/tree-ssa/vrp07.c (revision 241241) >>>> +++ gcc/testsuite/gcc.dg/tree-ssa/vrp07.c (working copy) >>>> @@ -1,5 +1,5 @@ >>>> /* { dg-do compile } */ >>>> -/* { dg-options "-O2 -fno-tree-fre -fdump-tree-vrp1-details >>>> -fdelete-null-pointer-checks" } */ >>>> +/* { dg-options "-O2 -fno-tree-fre -fdisable-tree-evrp >>>> -fdump-tree-vrp1-details -fdelete-null-pointer-checks" } */ >>>> >>>> int >>>> foo (int i, int *p) >>>> Index: gcc/testsuite/gcc.dg/tree-ssa/vrp09.c >>>> =================================================================== >>>> --- gcc/testsuite/gcc.dg/tree-ssa/vrp09.c (revision 241241) >>>> +++ gcc/testsuite/gcc.dg/tree-ssa/vrp09.c (working copy) >>>> @@ -1,5 +1,5 @@ >>>> /* { dg-do compile } */ >>>> -/* { dg-options "-O2 -fno-tree-fre -fdump-tree-vrp1 -std=gnu89" } */ >>>> +/* { dg-options "-O2 -fno-tree-fre -fdisable-tree-evrp -fdump-tree-vrp1 >>>> -std=gnu89" } */ >>>> >>>> foo (int *p) >>>> { >>>> Index: gcc/testsuite/gcc.dg/tree-ssa/vrp19.c >>>> =================================================================== >>>> --- gcc/testsuite/gcc.dg/tree-ssa/vrp19.c (revision 241241) >>>> +++ gcc/testsuite/gcc.dg/tree-ssa/vrp19.c (working copy) >>>> @@ -1,5 +1,5 @@ >>>> /* { dg-do compile } */ >>>> -/* { dg-options "-fwrapv -O1 -ftree-vrp -fdump-tree-vrp1" } */ >>>> +/* { dg-options "-fwrapv -O1 -ftree-vrp -fdisable-tree-evrp >>>> -fdump-tree-vrp1" } */ >>>> >>>> #include <limits.h> >>>> extern void abort (); >>>> Index: gcc/testsuite/gcc.dg/tree-ssa/vrp20.c >>>> =================================================================== >>>> --- gcc/testsuite/gcc.dg/tree-ssa/vrp20.c (revision 241241) >>>> +++ gcc/testsuite/gcc.dg/tree-ssa/vrp20.c (working copy) >>>> @@ -1,5 +1,5 @@ >>>> /* { dg-do compile } */ >>>> -/* { dg-options "-fwrapv -O1 -fno-tree-fre -ftree-vrp -fdump-tree-vrp1" >>>> } */ >>>> +/* { dg-options "-fwrapv -O1 -fno-tree-fre -fdisable-tree-evrp >>>> -ftree-vrp -fdump-tree-vrp1" } */ >>>> >>>> extern void abort (); >>>> extern void exit (int); >>>> Index: gcc/testsuite/gcc.dg/tree-ssa/vrp92.c >>>> =================================================================== >>>> --- gcc/testsuite/gcc.dg/tree-ssa/vrp92.c (revision 241241) >>>> +++ gcc/testsuite/gcc.dg/tree-ssa/vrp92.c (working copy) >>>> @@ -1,5 +1,5 @@ >>>> /* { dg-do compile } */ >>>> -/* { dg-options "-O2 -fdump-tree-vrp1-details -fdisable-tree-ethread" } >>>> */ >>>> +/* { dg-options "-O2 -fdisable-tree-evrp -fdump-tree-vrp1-details >>>> -fdisable-tree-ethread" } */ >>>> >>>> void bar (void); >>>> int foo (int i, int j)
On 10/20/2016 12:10 AM, kugan wrote: > Hi, > > > On 20/10/16 02:54, Andrew Pinski wrote: >> On Wed, Oct 19, 2016 at 1:01 AM, Christophe Lyon >> <christophe.lyon@linaro.org> wrote: >>> On 18 October 2016 at 09:34, Richard Biener <rguenther@suse.de> wrote: >>>> On Mon, 17 Oct 2016, Richard Biener wrote: >>>> >>>>> >>>>> This refactors propagation vs. substitution and handles condition >>>>> simplification properly as well as passing a known taken edge down >>>>> to the DOM walker (avoiding useless work and properly handling PHIs). >>>>> >>>>> If we do all the work it's stupid to not fold away dead code... >>>>> >>>>> Bootstrap and regtest pending on x86_64-unknown-linux-gnu. >>>> >>>> The following is what I applied, also fixing a spelling mistake noticed >>>> by Bernhard. >>>> >>> Hi Richard, >>> >>> This patch is causing regressions on aarch64. These tests now fail: >> >> So I looked into it and found the testcase themselves need to be changed. >> The functions are marked as noinline but not noclone. >> For an example: >> static void __attribute__((noinline)) >> check_args_8 (int a0, int a1, int a2, int a3, int a4, int a5, int a6, >> int a7, >> int a8) >> .... >> > > Indeed. In test12 and so on, arguments for check_args_8/check_args_24 is > now becoming constant which enables ipa-cp to create specialized clones. > Though this is good, in order to preserve the tested functionality, we > need to add noclone attribute. Here is a patch to do this. > > Regression tested on aatch64-linux-gnu. Is this OK for trunk? > > Thanks, > Kugan > > gcc/testsuite/ChangeLog: > > 2016-10-20 Kugan Vivekanandarajah <kuganvi@linaro.org> > > * gcc.target/aarch64/test_frame_common.h: Add noclone attribute > such that cloned verions of tested functions are not created. OK. jeff
diff --git a/gcc/testsuite/gcc.target/aarch64/test_frame_common.h b/gcc/testsuite/gcc.target/aarch64/test_frame_common.h index d7fed25..c63fbce 100644 --- a/gcc/testsuite/gcc.target/aarch64/test_frame_common.h +++ b/gcc/testsuite/gcc.target/aarch64/test_frame_common.h @@ -2,7 +2,7 @@ extern void abort (); #define CVT(v) ((unsigned char)(v)) -static void __attribute__((noinline)) +static void __attribute__((noinline, noclone)) check_args_8 (int a0, int a1, int a2, int a3, int a4, int a5, int a6, int a7, int a8) { @@ -18,7 +18,7 @@ check_args_8 (int a0, int a1, int a2, int a3, int a4, int a5, int a6, int a7, abort (); } -static void __attribute__((noinline)) +static void __attribute__((noinline, noclone)) check_args_24 (int a0, int a1, int a2, int a3, int a4, int a5, int a6, int a7, int a8, int a9, int a10) { @@ -36,7 +36,7 @@ check_args_24 (int a0, int a1, int a2, int a3, int a4, int a5, int a6, int a7, abort (); } -void __attribute__ ((noinline)) +void __attribute__ ((noinline, noclone)) initialize_array (unsigned char *a, int len) { int i;