diff mbox

Improve detection of constant conditions during jump threading

Message ID CAMe9rOqun_xfN95S3US6wLoabMCQppyN9yg+DDk7U=PRR5fsGg@mail.gmail.com
State New
Headers show

Commit Message

H.J. Lu May 2, 2016, 7:25 p.m. UTC
On Sat, Apr 30, 2016 at 2:28 PM, Patrick Palka <patrick@parcs.ath.cx> wrote:
> `On Fri, Apr 29, 2016 at 3:15 PM, Jeff Law <law@redhat.com> wrote:
>> On 04/19/2016 11:50 AM, Patrick Palka wrote:
>>
>>> 1. This patch introduces a "regression" in gcc.dg/tree-ssa/ssa-thread-11.c
>>> in that we no longer perform FSM threading during vrp2 but instead we
>>> detect two new jump threading opportunities during vrp1.  Not sure if
>>> the new code is better but it is shorter.  I wonder how this should be
>>> resolved...
>>
>> Definitely not a regression.  As you note we thread two jumps earlier
>> utilizing your new code.  With the old code we're dependent upon other
>> simplifications occurring which eventually exposes the FSM threads that the
>> test is checking for in vrp2.
>>
>> I think we just want to remove the test for FSM jump threads in VRP2. We get
>> coverage for your test via ssa-thread-14.  That should just leave the
>> verification that we do not have irreducible loops at the end of VRP2 in
>> ssa-thread-11.  I'll make that change.
>>
>> I do see what appears to be a missed jump thread, but that's not affected
>> positively or negatively by your change.  There's a reasonable chance it's
>> only exposed by normal thread jumps in VRP2 and since we don't iterate, it's
>> left in the IL.  I haven't analyzed it in detail, but my hope is that when I
>> pull the backwards threading out into its own pass that we'll start picking
>> up more of these secondary effects.
>
> Interesting info.  I also spotted another minor optimization
> opportunity within this test case, although more related to vrp than
> to jump threading.  It would require iterating over the use statements
> of a subexpression within a conditional, and it turns out that VRP
> already does this so it's only a matter of adding another case to test
> for during each iteration.  I'll post a patch when it's ready.
>
>>
>>
>>>
>>> gcc/ChangeLog:
>>>
>>>         * tree-ssa-threadedge.c (simplify_control_stmt_condition): Split
>>>         out into ...
>>>         (simplify_control_stmt_condition_1): ... here.  Recurse into
>>>         BIT_AND_EXPRs and BIT_IOR_EXPRs.
>>>
>>> gcc/testsuite/ChangeLog:
>>>
>>>         * gcc.dg/tree-ssa/ssa-thread-14.c: New test.
>>> ---
>>
>> I fixed a few formatting nits (too long lines).
>>

This one fails on Linux/x86-64 and Linux/x86.   This patch fixes it.  OK
for trunk?

Comments

Richard Biener May 3, 2016, 10:05 a.m. UTC | #1
On Mon, May 2, 2016 at 9:25 PM, H.J. Lu <hjl.tools@gmail.com> wrote:
> On Sat, Apr 30, 2016 at 2:28 PM, Patrick Palka <patrick@parcs.ath.cx> wrote:
>> `On Fri, Apr 29, 2016 at 3:15 PM, Jeff Law <law@redhat.com> wrote:
>>> On 04/19/2016 11:50 AM, Patrick Palka wrote:
>>>
>>>> 1. This patch introduces a "regression" in gcc.dg/tree-ssa/ssa-thread-11.c
>>>> in that we no longer perform FSM threading during vrp2 but instead we
>>>> detect two new jump threading opportunities during vrp1.  Not sure if
>>>> the new code is better but it is shorter.  I wonder how this should be
>>>> resolved...
>>>
>>> Definitely not a regression.  As you note we thread two jumps earlier
>>> utilizing your new code.  With the old code we're dependent upon other
>>> simplifications occurring which eventually exposes the FSM threads that the
>>> test is checking for in vrp2.
>>>
>>> I think we just want to remove the test for FSM jump threads in VRP2. We get
>>> coverage for your test via ssa-thread-14.  That should just leave the
>>> verification that we do not have irreducible loops at the end of VRP2 in
>>> ssa-thread-11.  I'll make that change.
>>>
>>> I do see what appears to be a missed jump thread, but that's not affected
>>> positively or negatively by your change.  There's a reasonable chance it's
>>> only exposed by normal thread jumps in VRP2 and since we don't iterate, it's
>>> left in the IL.  I haven't analyzed it in detail, but my hope is that when I
>>> pull the backwards threading out into its own pass that we'll start picking
>>> up more of these secondary effects.
>>
>> Interesting info.  I also spotted another minor optimization
>> opportunity within this test case, although more related to vrp than
>> to jump threading.  It would require iterating over the use statements
>> of a subexpression within a conditional, and it turns out that VRP
>> already does this so it's only a matter of adding another case to test
>> for during each iteration.  I'll post a patch when it's ready.
>>
>>>
>>>
>>>>
>>>> gcc/ChangeLog:
>>>>
>>>>         * tree-ssa-threadedge.c (simplify_control_stmt_condition): Split
>>>>         out into ...
>>>>         (simplify_control_stmt_condition_1): ... here.  Recurse into
>>>>         BIT_AND_EXPRs and BIT_IOR_EXPRs.
>>>>
>>>> gcc/testsuite/ChangeLog:
>>>>
>>>>         * gcc.dg/tree-ssa/ssa-thread-14.c: New test.
>>>> ---
>>>
>>> I fixed a few formatting nits (too long lines).
>>>
>
> This one fails on Linux/x86-64 and Linux/x86.   This patch fixes it.  OK
> for trunk?

Ok.

Richard.

>
> --
> H.J.
> ---
> diff --git a/gcc/testsuite/gcc.dg/tree-ssa/ssa-thread-14.c
> b/gcc/testsuite/gcc.dg/tree-ssa/ssa-thread-14.c
> index db9ed3b..e2ac2f7 100644
> --- a/gcc/testsuite/gcc.dg/tree-ssa/ssa-thread-14.c
> +++ b/gcc/testsuite/gcc.dg/tree-ssa/ssa-thread-14.c
> @@ -1,5 +1,5 @@
>  /* { dg-do compile }  */
> -/* { dg-additional-options "-O2 -fdump-tree-vrp" }  */
> +/* { dg-additional-options "-O2 -fdump-tree-vrp-details" }  */
>  /* { dg-final { scan-tree-dump-times "Threaded jump" 8 "vrp1" } }  */
>
>  void foo (void);
diff mbox

Patch

diff --git a/gcc/testsuite/gcc.dg/tree-ssa/ssa-thread-14.c
b/gcc/testsuite/gcc.dg/tree-ssa/ssa-thread-14.c
index db9ed3b..e2ac2f7 100644
--- a/gcc/testsuite/gcc.dg/tree-ssa/ssa-thread-14.c
+++ b/gcc/testsuite/gcc.dg/tree-ssa/ssa-thread-14.c
@@ -1,5 +1,5 @@ 
 /* { dg-do compile }  */
-/* { dg-additional-options "-O2 -fdump-tree-vrp" }  */
+/* { dg-additional-options "-O2 -fdump-tree-vrp-details" }  */
 /* { dg-final { scan-tree-dump-times "Threaded jump" 8 "vrp1" } }  */

 void foo (void);