Patchwork Exchange late VRP and DOM passes

login
register
mail settings
Submitter Richard Guenther
Date March 18, 2013, 11:38 a.m.
Message ID <alpine.LNX.2.00.1303181235410.3543@zhemvz.fhfr.qr>
Download mbox | patch
Permalink /patch/228446/
State New
Headers show

Comments

Richard Guenther - March 18, 2013, 11:38 a.m.
This moves VRP after late DOM.  This is because VRP has a hard
time dealing with non-copyproped (and not CSEd) IL and conveniently
DOM provides both.  I noticed this when working on PR56273 where
we miss quite some VRP opportunities because of this.
I cannot think of a good reason to have the current order, so I am
going ahead with this after SVN is back.

Bootstrap and regtest running on x86_64-unknown-linux-gnu.

While I have the patch in my tree for quite a while I don't
remember testing it, so the patch may get some additional
testsuite fallout changes.

Richard.

2013-03-18  Richard Biener  <rguenther@suse.de>

	PR tree-optimization/56273
	* passes.c (init_optimization_passes): Move second VRP after DOM.
Richard Guenther - March 19, 2013, 9:27 a.m.
On Mon, 18 Mar 2013, Richard Biener wrote:

> 
> This moves VRP after late DOM.  This is because VRP has a hard
> time dealing with non-copyproped (and not CSEd) IL and conveniently
> DOM provides both.  I noticed this when working on PR56273 where
> we miss quite some VRP opportunities because of this.
> I cannot think of a good reason to have the current order, so I am
> going ahead with this after SVN is back.
> 
> Bootstrap and regtest running on x86_64-unknown-linux-gnu.
> 
> While I have the patch in my tree for quite a while I don't
> remember testing it, so the patch may get some additional
> testsuite fallout changes.

Not much - I had to adjust gcc.dg/tree-ssa/vrp47.c and
c-c++-common/uninit-17.c for which I also filed a bug
(reported locations are rather random, this time changing from
the not-expected to another not-expected one).

Will commit after new gcc.gnu.org has settled a bit.

Richard.

2013-03-18  Richard Biener  <rguenther@suse.de>

	PR tree-optimization/56273
	* passes.c (init_optimization_passes): Move second VRP after DOM.

	* gcc.dg/tree-ssa/vrp47.c: Adjust.
	* c-c++-common/uninit-17.c: Likewise.

Index: gcc/passes.c
===================================================================
*** gcc/passes.c.orig	2013-03-18 14:27:05.000000000 +0100
--- gcc/passes.c	2013-03-18 14:33:08.745959939 +0100
*************** init_optimization_passes (void)
*** 1488,1494 ****
        NEXT_PASS (pass_lower_vector_ssa);
        NEXT_PASS (pass_cse_reciprocals);
        NEXT_PASS (pass_reassoc);
-       NEXT_PASS (pass_vrp);
        NEXT_PASS (pass_strength_reduction);
        NEXT_PASS (pass_dominator);
        /* The only const/copy propagation opportunities left after
--- 1488,1493 ----
*************** init_optimization_passes (void)
*** 1497,1502 ****
--- 1496,1502 ----
  	 only examines PHIs to discover const/copy propagation
  	 opportunities.  */
        NEXT_PASS (pass_phi_only_cprop);
+       NEXT_PASS (pass_vrp);
        NEXT_PASS (pass_cd_dce);
        NEXT_PASS (pass_tracer);
  
Index: gcc/testsuite/gcc.dg/tree-ssa/vrp47.c
===================================================================
*** gcc/testsuite/gcc.dg/tree-ssa/vrp47.c.orig	2013-03-18 14:27:05.000000000 +0100
--- gcc/testsuite/gcc.dg/tree-ssa/vrp47.c	2013-03-18 14:33:08.746959950 +0100
***************
*** 4,10 ****
     jumps when evaluating an && condition.  VRP is not able to optimize
     this.  */
  /* { dg-do compile { target { ! "mips*-*-* s390*-*-*  avr-*-* mn10300-*-*" } } } */
! /* { dg-options "-O2 -fdump-tree-vrp1 -fdump-tree-dom1 -fdump-tree-dom2" } */
  /* { dg-additional-options "-march=i586" { target { { i?86-*-* x86_64-*-* } && ia32 } } } */
  /* Skip on ARM Cortex-M0, where LOGICAL_OP_NON_SHORT_CIRCUIT is set to false,
     leading to two conditional jumps when evaluating an && condition.  VRP is
--- 4,10 ----
     jumps when evaluating an && condition.  VRP is not able to optimize
     this.  */
  /* { dg-do compile { target { ! "mips*-*-* s390*-*-*  avr-*-* mn10300-*-*" } } } */
! /* { dg-options "-O2 -fdump-tree-vrp1 -fdump-tree-dom1 -fdump-tree-vrp2" } */
  /* { dg-additional-options "-march=i586" { target { { i?86-*-* x86_64-*-* } && ia32 } } } */
  /* Skip on ARM Cortex-M0, where LOGICAL_OP_NON_SHORT_CIRCUIT is set to false,
     leading to two conditional jumps when evaluating an && condition.  VRP is
*************** int f(int x)
*** 40,54 ****
     0 or 1.  */
  /* { dg-final { scan-tree-dump-times "\[xy\]\[^ \]* !=" 0 "vrp1" } } */
  
! /* This one needs more copy propagation that only happens in dom1.  */
! /* { dg-final { scan-tree-dump-times "x\[^ \]* & y" 1 "dom1" { xfail *-*-* } } } */
! /* { dg-final { scan-tree-dump-times "x\[^ \]* & y" 1 "dom2" } } */
! /* { dg-final { scan-tree-dump-times "x\[^ \]* & y" 1 "vrp1" { xfail *-*-* } } } */
! 
! /* These two are fully simplified by VRP.  */
  /* { dg-final { scan-tree-dump-times "x\[^ \]* \[|\] y" 1 "vrp1" } } */
  /* { dg-final { scan-tree-dump-times "x\[^ \]* \\^ 1" 1 "vrp1" } } */
  
  /* { dg-final { cleanup-tree-dump "vrp1" } } */
  /* { dg-final { cleanup-tree-dump "dom1" } } */
! /* { dg-final { cleanup-tree-dump "dom2" } } */
--- 40,53 ----
     0 or 1.  */
  /* { dg-final { scan-tree-dump-times "\[xy\]\[^ \]* !=" 0 "vrp1" } } */
  
! /* These two are fully simplified by VRP1.  */
  /* { dg-final { scan-tree-dump-times "x\[^ \]* \[|\] y" 1 "vrp1" } } */
  /* { dg-final { scan-tree-dump-times "x\[^ \]* \\^ 1" 1 "vrp1" } } */
  
+ /* VRP2 gets rid of the remaining & 1 operations, x and y are always
+    either 0 or 1.  */
+ /* { dg-final { scan-tree-dump-times " & 1;" 0 "vrp2" } } */
+ 
  /* { dg-final { cleanup-tree-dump "vrp1" } } */
  /* { dg-final { cleanup-tree-dump "dom1" } } */
! /* { dg-final { cleanup-tree-dump "vrp2" } } */
Index: gcc/testsuite/c-c++-common/uninit-17.c
===================================================================
*** gcc/testsuite/c-c++-common/uninit-17.c.orig	2010-09-10 11:48:44.000000000 +0200
--- gcc/testsuite/c-c++-common/uninit-17.c	2013-03-18 14:38:09.030239733 +0100
*************** static void bar(int a, int *ptr)
*** 11,19 ****
    {
      int b;   /* { dg-message "declared" } */
      if (b < 40) {
!       ptr[0] = b;
      }
!     b += 1; /* { dg-warning "may be used uninitialized" } */
      ptr++;
    }
    while (--a != 0);
--- 11,19 ----
    {
      int b;   /* { dg-message "declared" } */
      if (b < 40) {
!       ptr[0] = b; /* { dg-warning "may be used uninitialized" } */
      }
!     b += 1;
      ptr++;
    }
    while (--a != 0);

Patch

Index: gcc/passes.c
===================================================================
--- gcc/passes.c	(revision 195938)
+++ gcc/passes.c	(working copy)
@@ -1488,7 +1488,6 @@  init_optimization_passes (void)
       NEXT_PASS (pass_lower_vector_ssa);
       NEXT_PASS (pass_cse_reciprocals);
       NEXT_PASS (pass_reassoc);
-      NEXT_PASS (pass_vrp);
       NEXT_PASS (pass_strength_reduction);
       NEXT_PASS (pass_dominator);
       /* The only const/copy propagation opportunities left after
@@ -1497,6 +1496,7 @@  init_optimization_passes (void)
 	 only examines PHIs to discover const/copy propagation
 	 opportunities.  */
       NEXT_PASS (pass_phi_only_cprop);
+      NEXT_PASS (pass_vrp);
       NEXT_PASS (pass_cd_dce);
       NEXT_PASS (pass_tracer);