diff mbox

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. UTC
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. UTC | #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. UTC | #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
diff mbox

Patch

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;