Commit 2090d6a0 by Jeff Law Committed by Jeff Law

tree-vrp.c (find_conditional_asserts): Update comments.


2006-02-07  Jeff Law  <law@redhat.com>

	* tree-vrp.c (find_conditional_asserts): Update comments.
	(simplify_stmt_for_jump_threading): New.
	(identify_jump_threads, finalize_jump_threads): New.
	(vrp_finalize): Call identify_jump_threads.
	(execute_vrp): Call finalize_jump_threads.
	* tree-ssa-dom.c (struct opt_stats_d): Remove num_iterations field.
	(vrp_element, vrp_data, vrp_element_p): Remove.
	(vrp_hash_elt, vrp_variables_stack): Remove.
	(vrp_hash, vrp_eq, record_range): Remove.
	(simplify_cond_and_lookup_avail_expr): Remove.
	(extract_range_from_cond): Remove.
	(thread_across_edge): Relocated into tree-ssa-threadedge.c.
	(simplify_stmt_for_jump_threading): New.
	(dom_thread_across_edge): New wrapper.
	(tree_ssa_dominator_optimize): No longer initialize or
	finalize any of the VRP datastructures.  Remove iteration
	step and simplify as a result of removal of iteration step.
	(pass_dominator): Perform a cfg cleanup after DOM.
	(dom_opt_finalize_block): Use the new common routines
	for threading jumps.  Simplify stack management slightly.
	No longer need to unwind VRP state.
	(record_equivalences_from_incoming_edge): No longer record
	VRP information.
	(eliminate_redundant_computations): No longer call
	simplify_cond_and_lookup_avail_expr.
	* tree-flow.h (potentially_threadable_block): Prototype.
	(thread_across_edge): Likewise.
	* Makefile.in (OBJS-common):  Add tree-ssa-threadedge.o
	(tree-ssa-threadedge.o): Add dependencies.
	* tree-ssa-threadedge.c: New file.
	* passes.c (init_optimization_passes): Merge PHIs before
	calling VRP.  Run VRP again late in the SSA optimization pipeline.


	* gcc.dg/tree-ssa/vrp01.c: Update dumpfile names now that we have
	multiple VRP passes.
	* gcc.dg/tree-ssa/vrp09.c: Likewise.
	* gcc.dg/tree-ssa/vrp18.c: Likewise.
	* gcc.dg/tree-ssa/pr21582.c: Likewise.
	* gcc.dg/tree-ssa/pr20657.c: Likewise.
	* gcc.dg/tree-ssa/pr21001.c: Likewise.
	* gcc.dg/tree-ssa/vrp02.c: Likewise
	* gcc.dg/tree-ssa/vrp11.c: Likewise
	* gcc.dg/tree-ssa/pr14341.c: Likewise
	* gcc.dg/tree-ssa/vrp19.c: Likewise
	* gcc.dg/tree-ssa/vrp20.c: Likewise
	* gcc.dg/tree-ssa/vrp03.c: Likewise
	* gcc.dg/tree-ssa/pr21086.c: Likewise
	* gcc.dg/tree-ssa/pr21959.c: Likewise
	* gcc.dg/tree-ssa/vrp21.c: Likewise
	* gcc.dg/tree-ssa/vrp04.c: Likewise 
	* gcc.dg/tree-ssa/pr25485.c: Likewise
	* gcc.dg/tree-ssa/pr22026.c: Likewise
	* gcc.dg/tree-ssa/vrp22.c: Likewise
	* gcc.dg/tree-ssa/vrp05.c: Likewise
	* gcc.dg/tree-ssa/20030807-10.c: Likewise
	* gcc.dg/tree-ssa/pr20701.c: Likewise
	* gcc.dg/tree-ssa/vrp23.c: Likewise
	* gcc.dg/tree-ssa/vrp06.c: Likewise
	* gcc.dg/tree-ssa/pr22117.c: Likewise
	* gcc.dg/tree-ssa/pr20702.c: Likewise
	* gcc.dg/tree-ssa/vrp15.c: Likewise
	* gcc.dg/tree-ssa/pr21090.c: Likewise
	* gcc.dg/tree-ssa/pr21294.c: Likewise
	* gcc.dg/tree-ssa/vrp24.c: Likewise
	* gcc.dg/tree-ssa/vrp07.c: Likewise
	* gcc.dg/tree-ssa/pr21563.c: Likewise
	* gcc.dg/tree-ssa/pr25382.c: Likewise
	* gcc.dg/tree-ssa/vrp16.c: Likewise
	* gcc.dg/tree-ssa/vrp25.c: Likewise
	* gcc.dg/tree-ssa/vrp08.c: Likewise
	* gcc.dg/tree-ssa/20030807-6.c: Likewise
	* gcc.dg/tree-ssa/vrp17.c: Likewise
	* gcc.dg/tree-ssa/pr21458.c: Likewise
	* g++.dg/tree-ssa/pr18178.C: Likewise

From-SVN: r110705
parent e45dcf9c
2006-02-07 Jeff Law <law@redhat.com>
* tree-vrp.c (find_conditional_asserts): Update comments.
(simplify_stmt_for_jump_threading): New.
(identify_jump_threads, finalize_jump_threads): New.
(vrp_finalize): Call identify_jump_threads.
(execute_vrp): Call finalize_jump_threads.
* tree-ssa-dom.c (struct opt_stats_d): Remove num_iterations field.
(vrp_element, vrp_data, vrp_element_p): Remove.
(vrp_hash_elt, vrp_variables_stack): Remove.
(vrp_hash, vrp_eq, record_range): Remove.
(simplify_cond_and_lookup_avail_expr): Remove.
(extract_range_from_cond): Remove.
(thread_across_edge): Relocated into tree-ssa-threadedge.c.
(simplify_stmt_for_jump_threading): New.
(dom_thread_across_edge): New wrapper.
(tree_ssa_dominator_optimize): No longer initialize or
finalize any of the VRP datastructures. Remove iteration
step and simplify as a result of removal of iteration step.
(pass_dominator): Perform a cfg cleanup after DOM.
(dom_opt_finalize_block): Use the new common routines
for threading jumps. Simplify stack management slightly.
No longer need to unwind VRP state.
(record_equivalences_from_incoming_edge): No longer record
VRP information.
(eliminate_redundant_computations): No longer call
simplify_cond_and_lookup_avail_expr.
* tree-flow.h (potentially_threadable_block): Prototype.
(thread_across_edge): Likewise.
* Makefile.in (OBJS-common): Add tree-ssa-threadedge.o
(tree-ssa-threadedge.o): Add dependencies.
* tree-ssa-threadedge.c: New file.
* passes.c (init_optimization_passes): Merge PHIs before
calling VRP. Run VRP again late in the SSA optimization pipeline.
2006-02-07 Richard Guenther <rguenther@suse.de> 2006-02-07 Richard Guenther <rguenther@suse.de>
PR c++/26140 PR c++/26140
......
...@@ -961,7 +961,7 @@ OBJS-common = \ ...@@ -961,7 +961,7 @@ OBJS-common = \
tree-ssa-dom.o domwalk.o tree-tailcall.o gimple-low.o tree-iterator.o \ tree-ssa-dom.o domwalk.o tree-tailcall.o gimple-low.o tree-iterator.o \
omp-low.o tree-phinodes.o tree-ssanames.o tree-sra.o tree-complex.o \ omp-low.o tree-phinodes.o tree-ssanames.o tree-sra.o tree-complex.o \
tree-vect-generic.o tree-ssa-loop.o tree-ssa-loop-niter.o \ tree-vect-generic.o tree-ssa-loop.o tree-ssa-loop-niter.o \
tree-ssa-loop-manip.o tree-ssa-threadupdate.o \ tree-ssa-loop-manip.o tree-ssa-threadupdate.o tree-ssa-threadedge.o \
tree-vectorizer.o tree-vect-analyze.o tree-vect-transform.o \ tree-vectorizer.o tree-vect-analyze.o tree-vect-transform.o \
tree-vect-patterns.o \ tree-vect-patterns.o \
tree-ssa-loop-ivcanon.o tree-ssa-propagate.o tree-ssa-address.o \ tree-ssa-loop-ivcanon.o tree-ssa-propagate.o tree-ssa-address.o \
...@@ -1860,6 +1860,10 @@ tree-ssa-uncprop.o : tree-ssa-uncprop.c $(TREE_FLOW_H) $(CONFIG_H) \ ...@@ -1860,6 +1860,10 @@ tree-ssa-uncprop.o : tree-ssa-uncprop.c $(TREE_FLOW_H) $(CONFIG_H) \
$(DIAGNOSTIC_H) $(FUNCTION_H) $(TIMEVAR_H) $(TM_H) coretypes.h \ $(DIAGNOSTIC_H) $(FUNCTION_H) $(TIMEVAR_H) $(TM_H) coretypes.h \
$(TREE_DUMP_H) $(BASIC_BLOCK_H) domwalk.h real.h tree-pass.h $(FLAGS_H) \ $(TREE_DUMP_H) $(BASIC_BLOCK_H) domwalk.h real.h tree-pass.h $(FLAGS_H) \
langhooks.h tree-ssa-propagate.h langhooks.h tree-ssa-propagate.h
tree-ssa-threadedge.o : tree-ssa-threadedge.c $(TREE_FLOW_H) $(CONFIG_H) \
$(SYSTEM_H) $(RTL_H) $(TREE_H) $(TM_P_H) $(EXPR_H) $(GGC_H) output.h \
$(DIAGNOSTIC_H) $(FUNCTION_H) $(TM_H) coretypes.h $(TREE_DUMP_H) \
$(BASIC_BLOCK_H) $(FLAGS_H) tree-pass.h $(CFGLOOP_H)
tree-ssa-threadupdate.o : tree-ssa-threadupdate.c $(TREE_FLOW_H) $(CONFIG_H) \ tree-ssa-threadupdate.o : tree-ssa-threadupdate.c $(TREE_FLOW_H) $(CONFIG_H) \
$(SYSTEM_H) $(RTL_H) $(TREE_H) $(TM_P_H) $(EXPR_H) $(GGC_H) output.h \ $(SYSTEM_H) $(RTL_H) $(TREE_H) $(TM_P_H) $(EXPR_H) $(GGC_H) output.h \
$(DIAGNOSTIC_H) $(FUNCTION_H) $(TM_H) coretypes.h $(TREE_DUMP_H) \ $(DIAGNOSTIC_H) $(FUNCTION_H) $(TM_H) coretypes.h $(TREE_DUMP_H) \
......
/* Top level of GCC compilers (cc1, cc1plus, etc.) /* Top level of GCC compilers (cc1, cc1plus, etc.)
Copyright (C) 1987, 1988, 1989, 1992, 1993, 1994, 1995, 1996, 1997, 1998, Copyright (C) 1987, 1988, 1989, 1992, 1993, 1994, 1995, 1996, 1997, 1998,
1999, 2000, 2001, 2002, 2003, 2004, 2005 Free Software Foundation, Inc. 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006 Free Software Foundation, Inc.
This file is part of GCC. This file is part of GCC.
...@@ -507,9 +507,9 @@ init_optimization_passes (void) ...@@ -507,9 +507,9 @@ init_optimization_passes (void)
NEXT_PASS (pass_dce); NEXT_PASS (pass_dce);
NEXT_PASS (pass_forwprop); NEXT_PASS (pass_forwprop);
NEXT_PASS (pass_copy_prop); NEXT_PASS (pass_copy_prop);
NEXT_PASS (pass_merge_phi);
NEXT_PASS (pass_vrp); NEXT_PASS (pass_vrp);
NEXT_PASS (pass_dce); NEXT_PASS (pass_dce);
NEXT_PASS (pass_merge_phi);
NEXT_PASS (pass_dominator); NEXT_PASS (pass_dominator);
/* The only copy propagation opportunities left after DOM /* The only copy propagation opportunities left after DOM
...@@ -560,6 +560,7 @@ init_optimization_passes (void) ...@@ -560,6 +560,7 @@ init_optimization_passes (void)
NEXT_PASS (pass_tree_loop); NEXT_PASS (pass_tree_loop);
NEXT_PASS (pass_cse_reciprocals); NEXT_PASS (pass_cse_reciprocals);
NEXT_PASS (pass_reassoc); NEXT_PASS (pass_reassoc);
NEXT_PASS (pass_vrp);
NEXT_PASS (pass_dominator); NEXT_PASS (pass_dominator);
/* The only copy propagation opportunities left after DOM /* The only copy propagation opportunities left after DOM
......
2006-02-07 Jeff Law <law@redhat.com>
* gcc.dg/tree-ssa/vrp01.c: Update dumpfile names now that we have
multiple VRP passes.
* gcc.dg/tree-ssa/vrp09.c: Likewise.
* gcc.dg/tree-ssa/vrp18.c: Likewise.
* gcc.dg/tree-ssa/pr21582.c: Likewise.
* gcc.dg/tree-ssa/pr20657.c: Likewise.
* gcc.dg/tree-ssa/pr21001.c: Likewise.
* gcc.dg/tree-ssa/vrp02.c: Likewise
* gcc.dg/tree-ssa/vrp11.c: Likewise
* gcc.dg/tree-ssa/pr14341.c: Likewise
* gcc.dg/tree-ssa/vrp19.c: Likewise
* gcc.dg/tree-ssa/vrp20.c: Likewise
* gcc.dg/tree-ssa/vrp03.c: Likewise
* gcc.dg/tree-ssa/pr21086.c: Likewise
* gcc.dg/tree-ssa/pr21959.c: Likewise
* gcc.dg/tree-ssa/vrp21.c: Likewise
* gcc.dg/tree-ssa/vrp04.c: Likewise
* gcc.dg/tree-ssa/pr25485.c: Likewise
* gcc.dg/tree-ssa/pr22026.c: Likewise
* gcc.dg/tree-ssa/vrp22.c: Likewise
* gcc.dg/tree-ssa/vrp05.c: Likewise
* gcc.dg/tree-ssa/20030807-10.c: Likewise
* gcc.dg/tree-ssa/pr20701.c: Likewise
* gcc.dg/tree-ssa/vrp23.c: Likewise
* gcc.dg/tree-ssa/vrp06.c: Likewise
* gcc.dg/tree-ssa/pr22117.c: Likewise
* gcc.dg/tree-ssa/pr20702.c: Likewise
* gcc.dg/tree-ssa/vrp15.c: Likewise
* gcc.dg/tree-ssa/pr21090.c: Likewise
* gcc.dg/tree-ssa/pr21294.c: Likewise
* gcc.dg/tree-ssa/vrp24.c: Likewise
* gcc.dg/tree-ssa/vrp07.c: Likewise
* gcc.dg/tree-ssa/pr21563.c: Likewise
* gcc.dg/tree-ssa/pr25382.c: Likewise
* gcc.dg/tree-ssa/vrp16.c: Likewise
* gcc.dg/tree-ssa/vrp25.c: Likewise
* gcc.dg/tree-ssa/vrp08.c: Likewise
* gcc.dg/tree-ssa/20030807-6.c: Likewise
* gcc.dg/tree-ssa/vrp17.c: Likewise
* gcc.dg/tree-ssa/pr21458.c: Likewise
* g++.dg/tree-ssa/pr18178.C: Likewise
2006-02-07 Richard Guenther <rguenther@suse.de> 2006-02-07 Richard Guenther <rguenther@suse.de>
PR c++/26140 PR c++/26140
/* { dg-do compile } */ /* { dg-do compile } */
/* { dg-options "-O2 -fdump-tree-vrp" } */ /* { dg-options "-O2 -fdump-tree-vrp1" } */
// Define this to see it work. // Define this to see it work.
// #define WORK_WORK_WORK // #define WORK_WORK_WORK
...@@ -43,5 +43,5 @@ void doit (array *a) ...@@ -43,5 +43,5 @@ void doit (array *a)
/* VRP should remove all but 1 if() in the loop. */ /* VRP should remove all but 1 if() in the loop. */
/* { dg-final { scan-tree-dump-times "if " 1 "vrp"} } */ /* { dg-final { scan-tree-dump-times "if " 1 "vrp1"} } */
/* { dg-final { cleanup-tree-dump "vrp" } } */ /* { dg-final { cleanup-tree-dump "vrp1" } } */
/* { dg-do compile } */ /* { dg-do compile } */
/* { dg-options "-O2 -fdump-tree-vrp" } */ /* { dg-options "-O2 -fdump-tree-vrp1" } */
extern const unsigned char mode_size[]; extern const unsigned char mode_size[];
...@@ -18,9 +18,9 @@ subreg_highpart_offset (outermode, innermode) ...@@ -18,9 +18,9 @@ subreg_highpart_offset (outermode, innermode)
} }
/* There should be one mask with the value 3. */ /* There should be one mask with the value 3. */
/* { dg-final { scan-tree-dump-times " \& 3" 1 "vrp"} } */ /* { dg-final { scan-tree-dump-times " \& 3" 1 "vrp1"} } */
/* There should be one right shift by 2 places. */ /* There should be one right shift by 2 places. */
/* { dg-final { scan-tree-dump-times " >> 2" 1 "vrp"} } */ /* { dg-final { scan-tree-dump-times " >> 2" 1 "vrp1"} } */
/* { dg-final { cleanup-tree-dump "vrp" } } */ /* { dg-final { cleanup-tree-dump "vrp1" } } */
/* { dg-do compile } */ /* { dg-do compile } */
/* { dg-options "-O2 -fdump-tree-vrp" } */ /* { dg-options "-O2 -fdump-tree-vrp1" } */
void void
...@@ -39,5 +39,5 @@ foo4 (distance, i, j) ...@@ -39,5 +39,5 @@ foo4 (distance, i, j)
} }
/* There should be no ABS_EXPR. */ /* There should be no ABS_EXPR. */
/* { dg-final { scan-tree-dump-times "ABS_EXPR " 0 "vrp"} } */ /* { dg-final { scan-tree-dump-times "ABS_EXPR " 0 "vrp1"} } */
/* { dg-final { cleanup-tree-dump "vrp" } } */ /* { dg-final { cleanup-tree-dump "vrp1" } } */
/* { dg-do compile } */ /* { dg-do compile } */
/* { dg-options "-O2 -fdump-tree-vrp" } */ /* { dg-options "-O2 -fdump-tree-vrp1" } */
void fn_call (int); void fn_call (int);
int h(int, int); int h(int, int);
...@@ -12,5 +12,5 @@ void t() ...@@ -12,5 +12,5 @@ void t()
} }
} }
/* { dg-final { scan-tree-dump-times "fn_call \\(1\\)" 1 "vrp" } } */ /* { dg-final { scan-tree-dump-times "fn_call \\(1\\)" 1 "vrp1" } } */
/* { dg-final { cleanup-tree-dump "vrp" } } */ /* { dg-final { cleanup-tree-dump "vrp1" } } */
...@@ -3,7 +3,7 @@ ...@@ -3,7 +3,7 @@
statement, which was needed to eliminate the second "if" statement. */ statement, which was needed to eliminate the second "if" statement. */
/* { dg-do compile } */ /* { dg-do compile } */
/* { dg-options "-O2 -fno-tree-dominator-opts -fdump-tree-vrp-details" } */ /* { dg-options "-O2 -fno-tree-dominator-opts -fdump-tree-vrp1-details" } */
int int
foo (int a) foo (int a)
...@@ -14,5 +14,5 @@ foo (int a) ...@@ -14,5 +14,5 @@ foo (int a)
return 0; return 0;
} }
/* { dg-final { scan-tree-dump-times "Folding predicate" 1 "vrp"} } */ /* { dg-final { scan-tree-dump-times "Folding predicate" 1 "vrp1"} } */
/* { dg-final { cleanup-tree-dump "vrp" } } */ /* { dg-final { cleanup-tree-dump "vrp1" } } */
/* { dg-do compile } */ /* { dg-do compile } */
/* { dg-options "-O2 -fdump-tree-vrp" } */ /* { dg-options "-O2 -fdump-tree-vrp1" } */
typedef struct { typedef struct {
int code; int code;
...@@ -26,5 +26,5 @@ can_combine_p (rtx insn, rtx elt) ...@@ -26,5 +26,5 @@ can_combine_p (rtx insn, rtx elt)
return 0; return 0;
} }
/* { dg-final { scan-tree-dump-times "Folding predicate.*to 0" 1 "vrp" } } */ /* { dg-final { scan-tree-dump-times "Folding predicate.*to 0" 1 "vrp1" } } */
/* { dg-final { cleanup-tree-dump "vrp" } } */ /* { dg-final { cleanup-tree-dump "vrp1" } } */
...@@ -4,7 +4,7 @@ ...@@ -4,7 +4,7 @@
immediate successors of the basic block. */ immediate successors of the basic block. */
/* { dg-do compile } */ /* { dg-do compile } */
/* { dg-options "-O2 -fno-tree-dominator-opts -fdump-tree-vrp-details" } */ /* { dg-options "-O2 -fno-tree-dominator-opts -fdump-tree-vrp1-details" } */
extern void bar (int); extern void bar (int);
...@@ -25,5 +25,5 @@ foo (int *p, int b) ...@@ -25,5 +25,5 @@ foo (int *p, int b)
return a; return a;
} }
/* { dg-final { scan-tree-dump-times "Folding predicate" 1 "vrp"} } */ /* { dg-final { scan-tree-dump-times "Folding predicate" 1 "vrp1"} } */
/* { dg-final { cleanup-tree-dump "vrp" } } */ /* { dg-final { cleanup-tree-dump "vrp1" } } */
...@@ -5,7 +5,7 @@ ...@@ -5,7 +5,7 @@
range infomation out of the conditional. */ range infomation out of the conditional. */
/* { dg-do compile } */ /* { dg-do compile } */
/* { dg-options "-O2 -fno-tree-dominator-opts -fdump-tree-vrp-details" } */ /* { dg-options "-O2 -fno-tree-dominator-opts -fdump-tree-vrp1-details" } */
int int
foo (int a) foo (int a)
...@@ -17,5 +17,5 @@ foo (int a) ...@@ -17,5 +17,5 @@ foo (int a)
return 0; return 0;
} }
/* { dg-final { scan-tree-dump-times "Folding predicate" 1 "vrp"} } */ /* { dg-final { scan-tree-dump-times "Folding predicate" 1 "vrp1"} } */
/* { dg-final { cleanup-tree-dump "vrp" } } */ /* { dg-final { cleanup-tree-dump "vrp1" } } */
/* { dg-do compile } */ /* { dg-do compile } */
/* { dg-options "-O2 -fdump-tree-vrp" } */ /* { dg-options "-O2 -fdump-tree-vrp1" } */
int int
foo (int *p) foo (int *p)
...@@ -15,5 +15,5 @@ foo (int *p) ...@@ -15,5 +15,5 @@ foo (int *p)
return 0; return 0;
} }
/* { dg-final { scan-tree-dump-times "Folding predicate " 2 "vrp" } } */ /* { dg-final { scan-tree-dump-times "Folding predicate " 2 "vrp1" } } */
/* { dg-final { cleanup-tree-dump "vrp" } } */ /* { dg-final { cleanup-tree-dump "vrp1" } } */
/* { dg-do compile } */ /* { dg-do compile } */
/* { dg-options "-O2 -fdump-tree-vrp" } */ /* { dg-options "-O2 -fdump-tree-vrp1" } */
int g, h; int g, h;
...@@ -19,5 +19,5 @@ foo (int a) ...@@ -19,5 +19,5 @@ foo (int a)
return 0; return 0;
} }
/* { dg-final { scan-tree-dump-times "Folding predicate.*to 1" 1 "vrp" } } */ /* { dg-final { scan-tree-dump-times "Folding predicate.*to 1" 1 "vrp1" } } */
/* { dg-final { cleanup-tree-dump "vrp" } } */ /* { dg-final { cleanup-tree-dump "vrp1" } } */
...@@ -4,7 +4,7 @@ ...@@ -4,7 +4,7 @@
allows us to eliminate the second "if" statement. */ allows us to eliminate the second "if" statement. */
/* { dg-do compile } */ /* { dg-do compile } */
/* { dg-options "-O2 -fno-tree-dominator-opts -fdump-tree-vrp-details" } */ /* { dg-options "-O2 -fno-tree-dominator-opts -fdump-tree-vrp1-details" } */
struct f { struct f {
int i; int i;
...@@ -19,5 +19,5 @@ foo (struct f *p) ...@@ -19,5 +19,5 @@ foo (struct f *p)
return 0; return 0;
} }
/* { dg-final { scan-tree-dump-times "Folding predicate" 1 "vrp"} } */ /* { dg-final { scan-tree-dump-times "Folding predicate" 1 "vrp1"} } */
/* { dg-final { cleanup-tree-dump "vrp" } } */ /* { dg-final { cleanup-tree-dump "vrp1" } } */
/* { dg-do compile } */ /* { dg-do compile } */
/* { dg-options "-O2 -fdump-tree-vrp" } */ /* { dg-options "-O2 -fdump-tree-vrp1" } */
extern void g (void); extern void g (void);
extern void bar (int); extern void bar (int);
...@@ -16,5 +16,5 @@ foo (int a) ...@@ -16,5 +16,5 @@ foo (int a)
} }
} }
/* { dg-final { scan-tree-dump-times "Folding predicate.*to 1" 1 "vrp" } } */ /* { dg-final { scan-tree-dump-times "Folding predicate.*to 1" 1 "vrp1" } } */
/* { dg-final { cleanup-tree-dump "vrp" } } */ /* { dg-final { cleanup-tree-dump "vrp1" } } */
...@@ -2,7 +2,7 @@ ...@@ -2,7 +2,7 @@
Make sure VRP folds the second "if" statement. */ Make sure VRP folds the second "if" statement. */
/* { dg-do compile } */ /* { dg-do compile } */
/* { dg-options "-O2 -fno-tree-dominator-opts -fdump-tree-vrp-details" } */ /* { dg-options "-O2 -fno-tree-dominator-opts -fdump-tree-vrp1-details" } */
int int
foo (int a) foo (int a)
...@@ -13,5 +13,5 @@ foo (int a) ...@@ -13,5 +13,5 @@ foo (int a)
return 0; return 0;
} }
/* { dg-final { scan-tree-dump-times "Folding predicate" 1 "vrp"} } */ /* { dg-final { scan-tree-dump-times "Folding predicate" 1 "vrp1"} } */
/* { dg-final { cleanup-tree-dump "vrp" } } */ /* { dg-final { cleanup-tree-dump "vrp1" } } */
/* { dg-do link } */ /* { dg-do link } */
/* { dg-options "-O2 -fdump-tree-vrp" } */ /* { dg-options "-O2 -fdump-tree-vrp1" } */
static inline void do_thing(char *s, int *p, char *q) static inline void do_thing(char *s, int *p, char *q)
{ {
...@@ -24,5 +24,5 @@ main() ...@@ -24,5 +24,5 @@ main()
do_other_thing ("xxx", &i, "yyy"); do_other_thing ("xxx", &i, "yyy");
} }
/* { dg-final { scan-tree-dump-times "Folding predicate p_.*" 0 "vrp" } } */ /* { dg-final { scan-tree-dump-times "Folding predicate p_.*" 0 "vrp1" } } */
/* { dg-final { cleanup-tree-dump "vrp" } } */ /* { dg-final { cleanup-tree-dump "vrp1" } } */
/* { dg-do compile } */ /* { dg-do compile } */
/* { dg-options "-O2 -fdump-tree-vrp" } */ /* { dg-options "-O2 -fdump-tree-vrp1" } */
unsigned char c[0xFF]; unsigned char c[0xFF];
void f(void) void f(void)
...@@ -16,5 +16,5 @@ void f(void) ...@@ -16,5 +16,5 @@ void f(void)
} }
} }
/* { dg-final { scan-tree-dump-times "Folding predicate " 0 "vrp" } } */ /* { dg-final { scan-tree-dump-times "Folding predicate " 0 "vrp1" } } */
/* { dg-final { cleanup-tree-dump "vrp" } } */ /* { dg-final { cleanup-tree-dump "vrp1" } } */
...@@ -3,7 +3,7 @@ ...@@ -3,7 +3,7 @@
same applies to subtraction and unsigned multiplication. */ same applies to subtraction and unsigned multiplication. */
/* { dg-do compile } */ /* { dg-do compile } */
/* { dg-options "-O2 -fdump-tree-vrp" } */ /* { dg-options "-O2 -fdump-tree-vrp1" } */
int int
plus (int x, int y) plus (int x, int y)
...@@ -45,5 +45,5 @@ mult (unsigned x, unsigned y) ...@@ -45,5 +45,5 @@ mult (unsigned x, unsigned y)
} }
/* None of the predicates can be folded in these functions. */ /* None of the predicates can be folded in these functions. */
/* { dg-final { scan-tree-dump-times "Folding predicate" 0 "vrp" } } */ /* { dg-final { scan-tree-dump-times "Folding predicate" 0 "vrp1" } } */
/* { dg-final { cleanup-tree-dump "vrp" } } */ /* { dg-final { cleanup-tree-dump "vrp1" } } */
...@@ -3,7 +3,7 @@ ...@@ -3,7 +3,7 @@
known to be zero after entering the first two "if" statements. */ known to be zero after entering the first two "if" statements. */
/* { dg-do compile } */ /* { dg-do compile } */
/* { dg-options "-O2 -fdump-tree-vrp" } */ /* { dg-options "-O2 -fdump-tree-vrp1" } */
void void
foo (int *p, int q) foo (int *p, int q)
...@@ -19,5 +19,5 @@ foo (int *p, int q) ...@@ -19,5 +19,5 @@ foo (int *p, int q)
} }
} }
/* { dg-final { scan-tree-dump-times "Folding predicate r_.* != 0B to 0" 1 "vrp" } } */ /* { dg-final { scan-tree-dump-times "Folding predicate r_.* != 0B to 0" 1 "vrp1" } } */
/* { dg-final { cleanup-tree-dump "vrp" } } */ /* { dg-final { cleanup-tree-dump "vrp1" } } */
...@@ -3,7 +3,7 @@ ...@@ -3,7 +3,7 @@
Check that VRP now gets ranges from BIT_AND_EXPRs. */ Check that VRP now gets ranges from BIT_AND_EXPRs. */
/* { dg-do compile } */ /* { dg-do compile } */
/* { dg-options "-O2 -fdump-tree-vrp" } */ /* { dg-options "-O2 -fdump-tree-vrp1" } */
int int
foo (int a) foo (int a)
...@@ -15,5 +15,5 @@ foo (int a) ...@@ -15,5 +15,5 @@ foo (int a)
return 1; return 1;
} }
/* { dg-final { scan-tree-dump-times "Folding predicate b_.* > 300 to 0" 1 "vrp" } } */ /* { dg-final { scan-tree-dump-times "Folding predicate b_.* > 300 to 0" 1 "vrp1" } } */
/* { dg-final { cleanup-tree-dump "vrp" } } */ /* { dg-final { cleanup-tree-dump "vrp1" } } */
/* PR tree-optimization/25485 /* PR tree-optimization/25485
VRP did not fold TRUTH_AND_EXPR. Make sure it does now. */ VRP did not fold TRUTH_AND_EXPR. Make sure it does now. */
/* { dg-options "-O2 -fdump-tree-vrp" } */ /* { dg-options "-O2 -fdump-tree-vrp1" } */
int int
foo (int a, int b) foo (int a, int b)
...@@ -13,5 +13,5 @@ foo (int a, int b) ...@@ -13,5 +13,5 @@ foo (int a, int b)
return 31; return 31;
} }
/* { dg-final { scan-tree-dump-times "if" 1 "vrp"} } */ /* { dg-final { scan-tree-dump-times "if" 1 "vrp1"} } */
/* { dg-final { cleanup-tree-dump "vrp" } } */ /* { dg-final { cleanup-tree-dump "vrp1" } } */
/* { dg-do compile } */ /* { dg-do compile } */
/* { dg-options "-O2 -fdump-tree-vrp" } */ /* { dg-options "-O2 -fdump-tree-vrp1" } */
foo (int *p, int i) foo (int *p, int i)
{ {
...@@ -24,5 +24,5 @@ foo (int *p, int i) ...@@ -24,5 +24,5 @@ foo (int *p, int i)
return i; return i;
} }
/* { dg-final { scan-tree-dump-times "Folding predicate p_.*to 1" 1 "vrp" } } */ /* { dg-final { scan-tree-dump-times "Folding predicate p_.*to 1" 1 "vrp1" } } */
/* { dg-final { cleanup-tree-dump "vrp" } } */ /* { dg-final { cleanup-tree-dump "vrp1" } } */
/* { dg-do compile } */ /* { dg-do compile } */
/* { dg-options "-O2 -fdump-tree-vrp" } */ /* { dg-options "-O2 -fdump-tree-vrp1" } */
struct A struct A
{ {
...@@ -20,5 +20,5 @@ foo (struct A *p, struct A *q) ...@@ -20,5 +20,5 @@ foo (struct A *p, struct A *q)
return x + p->b; return x + p->b;
} }
/* { dg-final { scan-tree-dump-times "Folding predicate p_.*to 1" 1 "vrp" } } */ /* { dg-final { scan-tree-dump-times "Folding predicate p_.*to 1" 1 "vrp1" } } */
/* { dg-final { cleanup-tree-dump "vrp" } } */ /* { dg-final { cleanup-tree-dump "vrp1" } } */
/* { dg-do compile } */ /* { dg-do compile } */
/* { dg-options "-O2 -fdump-tree-vrp" } */ /* { dg-options "-O2 -fdump-tree-vrp1" } */
struct A struct A
{ {
...@@ -30,6 +30,6 @@ foo (struct A *p, struct A *q) ...@@ -30,6 +30,6 @@ foo (struct A *p, struct A *q)
return q->a; return q->a;
} }
/* { dg-final { scan-tree-dump-times "Folding predicate q_.*to 1" 1 "vrp" } } */ /* { dg-final { scan-tree-dump-times "Folding predicate q_.*to 1" 1 "vrp1" } } */
/* { dg-final { scan-tree-dump-times "Folding predicate r_.*to 1" 1 "vrp" } } */ /* { dg-final { scan-tree-dump-times "Folding predicate r_.*to 1" 1 "vrp1" } } */
/* { dg-final { cleanup-tree-dump "vrp" } } */ /* { dg-final { cleanup-tree-dump "vrp1" } } */
/* { dg-do compile } */ /* { dg-do compile } */
/* { dg-options "-O2 -fdump-tree-vrp" } */ /* { dg-options "-O2 -fdump-tree-vrp1" } */
foo (int a, int b) foo (int a, int b)
{ {
...@@ -9,5 +9,5 @@ foo (int a, int b) ...@@ -9,5 +9,5 @@ foo (int a, int b)
return a + b; return a + b;
} }
/* { dg-final { scan-tree-dump-times "Folding predicate a_.*to 1" 1 "vrp" } } */ /* { dg-final { scan-tree-dump-times "Folding predicate a_.*to 1" 1 "vrp1" } } */
/* { dg-final { cleanup-tree-dump "vrp" } } */ /* { dg-final { cleanup-tree-dump "vrp1" } } */
/* { dg-do compile } */ /* { dg-do compile } */
/* { dg-options "-O2 -fdump-tree-vrp" } */ /* { dg-options "-O2 -fdump-tree-vrp1" } */
foo (int k, int j) foo (int k, int j)
{ {
...@@ -16,5 +16,5 @@ foo (int k, int j) ...@@ -16,5 +16,5 @@ foo (int k, int j)
return j; return j;
} }
/* { dg-final { scan-tree-dump-times "Folding predicate j_.*to 1" 1 "vrp" } } */ /* { dg-final { scan-tree-dump-times "Folding predicate j_.*to 1" 1 "vrp1" } } */
/* { dg-final { cleanup-tree-dump "vrp" } } */ /* { dg-final { cleanup-tree-dump "vrp1" } } */
/* { dg-do compile } */ /* { dg-do compile } */
/* { dg-options "-O2 -fdump-tree-vrp" } */ /* { dg-options "-O2 -fdump-tree-vrp1" } */
foo (int i, int j, int a) foo (int i, int j, int a)
{ {
...@@ -25,7 +25,7 @@ foo (int i, int j, int a) ...@@ -25,7 +25,7 @@ foo (int i, int j, int a)
return i + a + j; return i + a + j;
} }
/* { dg-final { scan-tree-dump-times "Folding predicate i_.*to 0" 1 "vrp" } } */ /* { dg-final { scan-tree-dump-times "Folding predicate i_.*to 0" 1 "vrp1" } } */
/* { dg-final { scan-tree-dump-times "Folding predicate j_.*to 1" 1 "vrp" } } */ /* { dg-final { scan-tree-dump-times "Folding predicate j_.*to 1" 1 "vrp1" } } */
/* { dg-final { scan-tree-dump-times "Folding predicate i_.*to 0" 1 "vrp" } } */ /* { dg-final { scan-tree-dump-times "Folding predicate i_.*to 0" 1 "vrp1" } } */
/* { dg-final { cleanup-tree-dump "vrp" } } */ /* { dg-final { cleanup-tree-dump "vrp1" } } */
/* { dg-do compile } */ /* { dg-do compile } */
/* { dg-options "-O2 -fdump-tree-vrp-details" } */ /* { dg-options "-O2 -fdump-tree-vrp1-details" } */
foo (int i, int *p) foo (int i, int *p)
{ {
...@@ -30,7 +30,7 @@ foo (int i, int *p) ...@@ -30,7 +30,7 @@ foo (int i, int *p)
return i; return i;
} }
/* { dg-final { scan-tree-dump-times "Folding predicate p_.*to 1" 1 "vrp" } } */ /* { dg-final { scan-tree-dump-times "Folding predicate p_.*to 1" 1 "vrp1" } } */
/* { dg-final { scan-tree-dump-times "Folding predicate p_.*to 0" 1 "vrp" } } */ /* { dg-final { scan-tree-dump-times "Folding predicate p_.*to 0" 1 "vrp1" } } */
/* { dg-final { scan-tree-dump-times "PREDICATE: p_\[0-9\] ne_expr 0B" 2 "vrp" } } */ /* { dg-final { scan-tree-dump-times "PREDICATE: p_\[0-9\] ne_expr 0B" 2 "vrp1" } } */
/* { dg-final { cleanup-tree-dump "vrp" } } */ /* { dg-final { cleanup-tree-dump "vrp1" } } */
/* { dg-do compile } */ /* { dg-do compile } */
/* { dg-options "-O2 -fno-tree-fre -fdump-tree-vrp-details" } */ /* { dg-options "-O2 -fno-tree-fre -fdump-tree-vrp1-details" } */
/* Compile with -fno-tree-fre -O2 to prevent CSEing *p. */ /* Compile with -fno-tree-fre -O2 to prevent CSEing *p. */
foo (int a, int *p) foo (int a, int *p)
...@@ -18,6 +18,6 @@ foo (int a, int *p) ...@@ -18,6 +18,6 @@ foo (int a, int *p)
return a; return a;
} }
/* { dg-final { scan-tree-dump-times "Folding predicate p_.*to 1" 1 "vrp" } } */ /* { dg-final { scan-tree-dump-times "Folding predicate p_.*to 1" 1 "vrp1" } } */
/* { dg-final { scan-tree-dump-times "PREDICATE: p_. ne_expr 0" 1 "vrp" } } */ /* { dg-final { scan-tree-dump-times "PREDICATE: p_. ne_expr 0" 1 "vrp1" } } */
/* { dg-final { cleanup-tree-dump "vrp" } } */ /* { dg-final { cleanup-tree-dump "vrp1" } } */
/* { dg-do compile } */ /* { dg-do compile } */
/* { dg-options "-O2 -fdump-tree-vrp" } */ /* { dg-options "-O2 -fdump-tree-vrp1" } */
foo (int *p) foo (int *p)
{ {
...@@ -27,5 +27,5 @@ L78: ...@@ -27,5 +27,5 @@ L78:
} }
} }
/* { dg-final { scan-tree-dump-times "Folding predicate p_.. != 0B to 1" 2 "vrp" } } */ /* { dg-final { scan-tree-dump-times "Folding predicate p_.. != 0B to 1" 2 "vrp1" } } */
/* { dg-final { cleanup-tree-dump "vrp" } } */ /* { dg-final { cleanup-tree-dump "vrp1" } } */
/* { dg-do compile } */ /* { dg-do compile } */
/* { dg-options "-O2 -fdump-tree-vrp" } */ /* { dg-options "-O2 -fdump-tree-vrp1" } */
foo (int k, int j, int z) foo (int k, int j, int z)
{ {
...@@ -16,5 +16,5 @@ foo (int k, int j, int z) ...@@ -16,5 +16,5 @@ foo (int k, int j, int z)
return j; return j;
} }
/* { dg-final { scan-tree-dump-times "Folding predicate.*to 1" 1 "vrp" } } */ /* { dg-final { scan-tree-dump-times "Folding predicate.*to 1" 1 "vrp1" } } */
/* { dg-final { cleanup-tree-dump "vrp" } } */ /* { dg-final { cleanup-tree-dump "vrp1" } } */
/* { dg-do compile } */ /* { dg-do compile } */
/* { dg-options "-O2 -fdump-tree-vrp" } */ /* { dg-options "-O2 -fdump-tree-vrp1" } */
extern void abort (void) __attribute__ ((__noreturn__)); extern void abort (void) __attribute__ ((__noreturn__));
...@@ -29,6 +29,6 @@ blah (tree t) ...@@ -29,6 +29,6 @@ blah (tree t)
} }
/* { dg-final { scan-tree-dump-times "tree_code_length.42." 1 "vrp" } } */ /* { dg-final { scan-tree-dump-times "tree_code_length.42." 1 "vrp1" } } */
/* { dg-final { cleanup-tree-dump "vrp" } } */ /* { dg-final { cleanup-tree-dump "vrp1" } } */
/* { dg-do compile } */ /* { dg-do compile } */
/* { dg-options "-O2 -fdump-tree-vrp-details" } */ /* { dg-options "-O2 -fdump-tree-vrp1-details" } */
extern void abort (void) __attribute__ ((__noreturn__)); extern void abort (void) __attribute__ ((__noreturn__));
...@@ -18,6 +18,6 @@ nonlocal_mentioned_p (rtx x) ...@@ -18,6 +18,6 @@ nonlocal_mentioned_p (rtx x)
abort (); abort ();
} }
/* { dg-final { scan-tree-dump-times "Folding predicate .*to 0" 1 "vrp" } } */ /* { dg-final { scan-tree-dump-times "Folding predicate .*to 0" 1 "vrp1" } } */
/* { dg-final { cleanup-tree-dump "vrp" } } */ /* { dg-final { cleanup-tree-dump "vrp1" } } */
/* { dg-do compile } */ /* { dg-do compile } */
/* { dg-options "-O2 -fdump-tree-vrp" } */ /* { dg-options "-O2 -fdump-tree-vrp1" } */
extern void abort (void) __attribute__ ((__noreturn__)); extern void abort (void) __attribute__ ((__noreturn__));
union tree_node; union tree_node;
...@@ -27,6 +27,6 @@ gimplify_for_stmt (tree stmt) ...@@ -27,6 +27,6 @@ gimplify_for_stmt (tree stmt)
abort (); abort ();
} }
/* { dg-final { scan-tree-dump-times "Simplified relational" 1 "vrp" } } */ /* { dg-final { scan-tree-dump-times "Simplified relational" 1 "vrp1" } } */
/* { dg-final { cleanup-tree-dump "vrp" } } */ /* { dg-final { cleanup-tree-dump "vrp1" } } */
/* { dg-do compile } */ /* { dg-do compile } */
/* { dg-options "-O2 -fdump-tree-vrp" } */ /* { dg-options "-O2 -fdump-tree-vrp1" } */
static int blocksize = 4096; static int blocksize = 4096;
...@@ -30,5 +30,5 @@ void foo (void) ...@@ -30,5 +30,5 @@ void foo (void)
eof_reached = 1; eof_reached = 1;
} }
/* { dg-final { scan-tree-dump-times "Simplified relational" 1 "vrp" } } */ /* { dg-final { scan-tree-dump-times "Simplified relational" 1 "vrp1" } } */
/* { dg-final { cleanup-tree-dump "vrp" } } */ /* { dg-final { cleanup-tree-dump "vrp1" } } */
/* { dg-do compile } */ /* { dg-do compile } */
/* { dg-options "-fwrapv -O1 -ftree-vrp -fdump-tree-vrp" } */ /* { dg-options "-fwrapv -O1 -ftree-vrp -fdump-tree-vrp1" } */
#include <limits.h> #include <limits.h>
extern void abort (); extern void abort ();
...@@ -22,6 +22,6 @@ int g (int b) { ...@@ -22,6 +22,6 @@ int g (int b) {
} }
return 1; return 1;
} }
/* { dg-final { scan-tree-dump "Folding predicate a_. < 0 to 0" "vrp" } } */ /* { dg-final { scan-tree-dump "Folding predicate a_. < 0 to 0" "vrp1" } } */
/* { dg-final { scan-tree-dump "Folding predicate b_. >= 0 to 1" "vrp" } } */ /* { dg-final { scan-tree-dump "Folding predicate b_. >= 0 to 1" "vrp1" } } */
/* { dg-final { cleanup-tree-dump "vrp" } } */ /* { dg-final { cleanup-tree-dump "vrp1" } } */
/* { dg-do compile } */ /* { dg-do compile } */
/* { dg-options "-fwrapv -O1 -ftree-vrp -fdump-tree-vrp" } */ /* { dg-options "-fwrapv -O1 -ftree-vrp -fdump-tree-vrp1" } */
extern void abort (); extern void abort ();
extern void exit (int); extern void exit (int);
...@@ -23,6 +23,6 @@ int g (int b) { ...@@ -23,6 +23,6 @@ int g (int b) {
return 1; return 1;
} }
/* { dg-final { scan-tree-dump "Folding predicate a_. == 0 to 0" "vrp" } } */ /* { dg-final { scan-tree-dump "Folding predicate a_. == 0 to 0" "vrp1" } } */
/* { dg-final { scan-tree-dump "Folding predicate b_. != 0 to 1" "vrp" } } */ /* { dg-final { scan-tree-dump "Folding predicate b_. != 0 to 1" "vrp1" } } */
/* { dg-final { cleanup-tree-dump "vrp" } } */ /* { dg-final { cleanup-tree-dump "vrp1" } } */
/* { dg-do compile } */ /* { dg-do compile } */
/* { dg-options "-O1 -ftree-vrp -fdump-tree-vrp" } */ /* { dg-options "-O1 -ftree-vrp -fdump-tree-vrp1" } */
extern void link_error (); extern void link_error ();
...@@ -22,5 +22,5 @@ void test02(unsigned int a, unsigned int b) ...@@ -22,5 +22,5 @@ void test02(unsigned int a, unsigned int b)
link_error (); link_error ();
} }
/* { dg-final { scan-tree-dump-times "link_error" 0 "vrp" } } */ /* { dg-final { scan-tree-dump-times "link_error" 0 "vrp1" } } */
/* { dg-final { cleanup-tree-dump "vrp" } } */ /* { dg-final { cleanup-tree-dump "vrp1" } } */
/* { dg-do compile } */ /* { dg-do compile } */
/* { dg-options "-O1 -ftree-vrp -fdump-tree-vrp" } */ /* { dg-options "-O1 -ftree-vrp -fdump-tree-vrp1" } */
extern void link_error (); extern void link_error ();
...@@ -12,5 +12,5 @@ void test02(unsigned int a, unsigned int b) ...@@ -12,5 +12,5 @@ void test02(unsigned int a, unsigned int b)
link_error (); link_error ();
} }
/* { dg-final { scan-tree-dump-times "link_error" 0 "vrp" } } */ /* { dg-final { scan-tree-dump-times "link_error" 0 "vrp1" } } */
/* { dg-final { cleanup-tree-dump "vrp" } } */ /* { dg-final { cleanup-tree-dump "vrp1" } } */
/* { dg-do compile } */ /* { dg-do compile } */
/* { dg-options "-O2 -fdump-tree-vrp-details" } */ /* { dg-options "-O2 -fdump-tree-vrp1-details" } */
blah (int code1, int code2) blah (int code1, int code2)
{ {
...@@ -40,6 +40,6 @@ L8: ...@@ -40,6 +40,6 @@ L8:
/* The n_sets > 0 test can be simplified into n_sets == 1 since the /* The n_sets > 0 test can be simplified into n_sets == 1 since the
only way to reach the test is when n_sets <= 1, and the only value only way to reach the test is when n_sets <= 1, and the only value
which satisfies both conditions is n_sets == 1. */ which satisfies both conditions is n_sets == 1. */
/* { dg-final { scan-tree-dump-times "Simplified relational" 1 "vrp" } } */ /* { dg-final { scan-tree-dump-times "Simplified relational" 1 "vrp1" } } */
/* { dg-final { cleanup-tree-dump "vrp" } } */ /* { dg-final { cleanup-tree-dump "vrp1" } } */
/* { dg-do compile } */ /* { dg-do compile } */
/* { dg-options "-O2 -fdump-tree-vrp-details" } */ /* { dg-options "-O2 -fdump-tree-vrp1-details" } */
struct rtx_def; struct rtx_def;
...@@ -84,6 +84,6 @@ L7: ...@@ -84,6 +84,6 @@ L7:
/* The n_sets > 0 test can be simplified into n_sets == 1 since the /* The n_sets > 0 test can be simplified into n_sets == 1 since the
only way to reach the test is when n_sets <= 1, and the only value only way to reach the test is when n_sets <= 1, and the only value
which satisfies both conditions is n_sets == 1. */ which satisfies both conditions is n_sets == 1. */
/* { dg-final { scan-tree-dump-times "Simplified relational" 1 "vrp" } } */ /* { dg-final { scan-tree-dump-times "Simplified relational" 1 "vrp1" } } */
/* { dg-final { cleanup-tree-dump "vrp" } } */ /* { dg-final { cleanup-tree-dump "vrp1" } } */
/* { dg-do compile } */ /* { dg-do compile } */
/* { dg-options "-O2 -fdump-tree-vrp-details" } */ /* { dg-options "-O2 -fdump-tree-vrp1-details" } */
extern void abort (); extern void abort ();
int tree_code_length[100]; int tree_code_length[100];
...@@ -47,6 +47,6 @@ L9: ...@@ -47,6 +47,6 @@ L9:
/* The second test of (code1 != 53) and the test (D18670 <= 2) are /* The second test of (code1 != 53) and the test (D18670 <= 2) are
both totally subsumed by earlier tests and thus should be folded both totally subsumed by earlier tests and thus should be folded
away using VRP. */ away using VRP. */
/* { dg-final { scan-tree-dump-times "Folding predicate" 2 "vrp" } } */ /* { dg-final { scan-tree-dump-times "Folding predicate" 2 "vrp1" } } */
/* { dg-final { cleanup-tree-dump "vrp" } } */ /* { dg-final { cleanup-tree-dump "vrp1" } } */
...@@ -749,6 +749,11 @@ tree expand_simple_operations (tree); ...@@ -749,6 +749,11 @@ tree expand_simple_operations (tree);
void substitute_in_loop_info (struct loop *, tree, tree); void substitute_in_loop_info (struct loop *, tree, tree);
edge single_dom_exit (struct loop *); edge single_dom_exit (struct loop *);
/* In tree-ssa-threadedge.c */
extern bool potentially_threadable_block (basic_block);
extern void thread_across_edge (tree, edge, bool,
VEC(tree, heap) **, tree (*) (tree));
/* In tree-ssa-loop-im.c */ /* In tree-ssa-loop-im.c */
/* The possibilities of statement movement. */ /* The possibilities of statement movement. */
......
...@@ -2755,7 +2755,24 @@ find_conditional_asserts (basic_block bb) ...@@ -2755,7 +2755,24 @@ find_conditional_asserts (basic_block bb)
/* Remove the COND_EXPR operands from the FOUND_IN_SUBGRAPH bitmap. /* Remove the COND_EXPR operands from the FOUND_IN_SUBGRAPH bitmap.
Otherwise, when we finish traversing each of the sub-graphs, we Otherwise, when we finish traversing each of the sub-graphs, we
won't know whether the variables were found in the sub-graphs or won't know whether the variables were found in the sub-graphs or
if they had been found in a block upstream from BB. */ if they had been found in a block upstream from BB.
This is actually a bad idea is some cases, particularly jump
threading. Consider a CFG like the following:
0
/|
1 |
\|
2
/ \
3 4
Assume that one or more operands in the conditional at the
end of block 0 are used in a conditional in block 2, but not
anywhere in block 1. In this case we will not insert any
assert statements in block 1, which may cause us to miss
opportunities to optimize, particularly for jump threading. */
FOR_EACH_SSA_TREE_OPERAND (op, last, iter, SSA_OP_USE) FOR_EACH_SSA_TREE_OPERAND (op, last, iter, SSA_OP_USE)
RESET_BIT (found_in_subgraph, SSA_NAME_VERSION (op)); RESET_BIT (found_in_subgraph, SSA_NAME_VERSION (op));
...@@ -4202,6 +4219,157 @@ simplify_stmt_using_ranges (tree stmt) ...@@ -4202,6 +4219,157 @@ simplify_stmt_using_ranges (tree stmt)
} }
} }
/* Stack of dest,src equivalency pairs that need to be restored after
each attempt to thread a block's incoming edge to an outgoing edge.
A NULL entry is used to mark the end of pairs which need to be
restored. */
static VEC(tree,heap) *stack;
/* A trivial wrapper so that we can present the generic jump
threading code with a simple API for simplifying statements. */
static tree
simplify_stmt_for_jump_threading (tree stmt)
{
/* We only use VRP information to simplify conditionals. This is
overly conservative, but it's unclear if doing more would be
worth the compile time cost. */
if (TREE_CODE (stmt) != COND_EXPR)
return NULL;
return vrp_evaluate_conditional (COND_EXPR_COND (stmt), true);
}
/* Blocks which have more than one predecessor and more than
one successor present jump threading opportunities. ie,
when the block is reached from a specific predecessor, we
may be able to determine which of the outgoing edges will
be traversed. When this optimization applies, we are able
to avoid conditionals at runtime and we may expose secondary
optimization opportunities.
This routine is effectively a driver for the generic jump
threading code. It basically just presents the generic code
with edges that may be suitable for jump threading.
Unlike DOM, we do not iterate VRP if jump threading was successful.
While iterating may expose new opportunities for VRP, it is expected
those opportunities would be very limited and the compile time cost
to expose those opportunities would be significant.
As jump threading opportunities are discovered, they are registered
for later realization. */
static void
identify_jump_threads (void)
{
basic_block bb;
tree dummy;
/* Ugh. When substituting values earlier in this pass we can
wipe the dominance information. So rebuild the dominator
information as we need it within the jump threading code. */
calculate_dominance_info (CDI_DOMINATORS);
/* We do not allow VRP information to be used for jump threading
across a back edge in the CFG. Otherwise it becomes too
difficult to avoid eliminating loop exit tests. Of course
EDGE_DFS_BACK is not accurate at this time so we have to
recompute it. */
mark_dfs_back_edges ();
/* Allocate our unwinder stack to unwind any temporary equivalences
that might be recorded. */
stack = VEC_alloc (tree, heap, 20);
/* To avoid lots of silly node creation, we create a single
conditional and just modify it in-place when attempting to
thread jumps. */
dummy = build2 (EQ_EXPR, boolean_type_node, NULL, NULL);
dummy = build3 (COND_EXPR, void_type_node, dummy, NULL, NULL);
/* Walk through all the blocks finding those which present a
potential jump threading opportunity. We could set this up
as a dominator walker and record data during the walk, but
I doubt it's worth the effort for the classes of jump
threading opportunities we are trying to identify at this
point in compilation. */
FOR_EACH_BB (bb)
{
tree last, cond;
/* If the generic jump threading code does not find this block
interesting, then there is nothing to do. */
if (! potentially_threadable_block (bb))
continue;
/* We only care about blocks ending in a COND_EXPR. While there
may be some value in handling SWITCH_EXPR here, I doubt it's
terribly important. */
last = bsi_stmt (bsi_last (bb));
if (TREE_CODE (last) != COND_EXPR)
continue;
/* We're basically looking for any kind of conditional with
integral type arguments. */
cond = COND_EXPR_COND (last);
if ((TREE_CODE (cond) == SSA_NAME
&& INTEGRAL_TYPE_P (TREE_TYPE (cond)))
|| (COMPARISON_CLASS_P (cond)
&& TREE_CODE (TREE_OPERAND (cond, 0)) == SSA_NAME
&& INTEGRAL_TYPE_P (TREE_TYPE (TREE_OPERAND (cond, 0)))
&& (TREE_CODE (TREE_OPERAND (cond, 1)) == SSA_NAME
|| is_gimple_min_invariant (TREE_OPERAND (cond, 1)))
&& INTEGRAL_TYPE_P (TREE_TYPE (TREE_OPERAND (cond, 1)))))
{
edge_iterator ei;
edge e;
/* We've got a block with multiple predecessors and multiple
successors which also ends in a suitable conditional. For
each predecessor, see if we can thread it to a specific
successor. */
FOR_EACH_EDGE (e, ei, bb->preds)
{
/* Do not thread across back edges or abnormal edges
in the CFG. */
if (e->flags & (EDGE_DFS_BACK | EDGE_COMPLEX))
continue;
thread_across_edge (dummy, e, true,
&stack,
simplify_stmt_for_jump_threading);
}
}
}
/* We do not actually update the CFG or SSA graphs at this point as
ASSERT_EXPRs are still in the IL and cfg cleanup code does not yet
handle ASSERT_EXPRs gracefully. */
}
/* We identified all the jump threading opportunities earlier, but could
not transform the CFG at that time. This routine transforms the
CFG and arranges for the dominator tree to be rebuilt if necessary.
Note the SSA graph update will occur during the normal TODO
processing by the pass manager. */
static void
finalize_jump_threads (void)
{
bool cfg_altered = false;
cfg_altered = thread_through_all_blocks ();
/* If we threaded jumps, then we need to recompute the dominance
information, to safely do that we must clean up the CFG first. */
if (cfg_altered)
{
free_dominance_info (CDI_DOMINATORS);
cleanup_tree_cfg ();
calculate_dominance_info (CDI_DOMINATORS);
}
VEC_free (tree, heap, stack);
}
/* Traverse all the blocks folding conditionals with known ranges. */ /* Traverse all the blocks folding conditionals with known ranges. */
...@@ -4246,6 +4414,10 @@ vrp_finalize (void) ...@@ -4246,6 +4414,10 @@ vrp_finalize (void)
substitute_and_fold (single_val_range, true); substitute_and_fold (single_val_range, true);
/* We must identify jump threading opportunities before we release
the datastructures built by VRP. */
identify_jump_threads ();
/* Free allocated memory. */ /* Free allocated memory. */
for (i = 0; i < num_ssa_names; i++) for (i = 0; i < num_ssa_names; i++)
if (vr_value[i]) if (vr_value[i])
...@@ -4323,7 +4495,12 @@ execute_vrp (void) ...@@ -4323,7 +4495,12 @@ execute_vrp (void)
current_loops = NULL; current_loops = NULL;
} }
/* ASSERT_EXPRs must be removed before finalizing jump threads
as finalizing jump threads calls the CFG cleanup code which
does not properly handle ASSERT_EXPRs. */
remove_range_assertions (); remove_range_assertions ();
finalize_jump_threads ();
} }
static bool static bool
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment