Simplify conditions in EVRP, handle taken edge

Message ID 4a12886e-e839-2547-6127-49a61867a76f@linaro.org
State New
Headers show

Commit Message

Kugan Vivekanandarajah Oct. 20, 2016, 6:10 a.m.
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.


> 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)

Comments

Andrew Pinski Oct. 21, 2016, 7:26 p.m. | #1
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)
Jeff Law Oct. 24, 2016, 2:55 p.m. | #2
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

Patch hide | download patch | download mbox

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;