Commit 9c04723a by Dehao Chen Committed by Dehao Chen

predict.c (find_qualified_ssa_name): New

2012-05-08  Dehao Chen  <dehao@google.com>
gcc/
	* predict.c (find_qualified_ssa_name): New
	(find_ssa_name_in_expr): New
	(find_ssa_name_in_assign_stmt): New
	(is_comparison_with_loop_invariant_p): New
	(is_bound_expr_similar): New
	(predict_iv_comparison): New
	(predict_loops): Add heuristic for loop-nested branches that compare an
	induction variable to a loop bound variable.
	* predict.def (PRED_LOOP_IV_COMPARE): New macro
testsuite/
	* gcc.dg/predict-1.c: Check if LOOP_IV_COMPARE static predict
	heuristic is working properly.
	* gcc.dg/predict-2.c: Likewise.
	* gcc/dg/predict-3.c: Likewise.
	* gcc/dg/predict-4.c: Likewise.
	* gcc/dg/predict-5.c: Likewise.
	* gcc/dg/predict-6.c: Likewise.

From-SVN: r187277
parent 536b0cb7
2012-05-08 Dehao Chen <dehao@google.com>
* predict.c (find_qualified_ssa_name): New
(find_ssa_name_in_expr): New
(find_ssa_name_in_assign_stmt): New
(is_comparison_with_loop_invariant_p): New
(is_bound_expr_similar): New
(predict_iv_comparison): New
(predict_loops): Add heuristic for loop-nested branches that compare an
induction variable to a loop bound variable.
* predict.def (PRED_LOOP_IV_COMPARE): New macro
2012-05-08 Uros Bizjak <ubizjak@gmail.com>
* config/i386/i386.c (has_dispatch): Use TARGET_BDVER1 and
......
......@@ -116,3 +116,13 @@ DEF_PREDICTOR (PRED_NULL_RETURN, "null return", HITRATE (90), 0)
/* Branches to a mudflap bounds check are extremely unlikely. */
DEF_PREDICTOR (PRED_MUDFLAP, "mudflap check", PROB_VERY_LIKELY, 0)
/* Branches to compare induction variable to a loop bound is
extremely likely. */
DEF_PREDICTOR (PRED_LOOP_IV_COMPARE_GUESS, "guess loop iv compare",
PROB_VERY_LIKELY, 0)
/* Use number of loop iterations determined by # of iterations analysis
to set probability of branches that compares IV to loop bound variable. */
DEF_PREDICTOR (PRED_LOOP_IV_COMPARE, "loop iv compare", PROB_VERY_LIKELY,
PRED_FLAG_FIRST_MATCH)
2012-05-08 Dehao Chen <dehao@google.com>
* gcc.dg/predict-1.c: Check if LOOP_IV_COMPARE static predict
heuristic is working properly.
* gcc.dg/predict-2.c: Likewise.
* gcc/dg/predict-3.c: Likewise.
* gcc/dg/predict-4.c: Likewise.
* gcc/dg/predict-5.c: Likewise.
* gcc/dg/predict-6.c: Likewise.
2012-05-07 Jakub Jelinek <jakub@redhat.com>
PR tree-optimization/53239
......
/* { dg-do compile } */
/* { dg-options "-O2 -fdump-tree-profile_estimate" } */
extern int global;
int bar(int);
void foo (int bound)
{
int i, ret = 0;
for (i = 0; i < bound; i++)
{
if (i > bound)
global += bar (i);
if (i >= bound + 2)
global += bar (i);
if (i > bound - 2)
global += bar (i);
if (i + 2 > bound)
global += bar (i);
if (i == 10)
global += bar (i);
}
}
/* { dg-final { scan-tree-dump-times "loop iv compare heuristics: 0.0%" 5 "profile_estimate"} } */
/* { dg-final { cleanup-tree-dump "profile_estimate" } } */
/* { dg-do compile } */
/* { dg-options "-O2 -fdump-tree-profile_estimate" } */
extern int global;
int bar(int);
void foo (int bound)
{
int i, ret = 0;
for (i = 0; i < bound; i++)
{
if (i > bound)
global += bar (i);
if (i >= bound + 2)
global += bar (i);
if (i > bound - 2)
global += bar (i);
if (i + 2 > bound)
global += bar (i);
if (i == 10)
global += bar (i);
}
}
/* { dg-final { scan-tree-dump-times "loop iv compare heuristics: 0.0%" 5 "profile_estimate"} } */
/* { dg-final { cleanup-tree-dump "profile_estimate" } } */
/* { dg-do compile } */
/* { dg-options "-O2 -fdump-tree-profile_estimate" } */
extern int global;
int bar(int);
void foo (int base, int bound)
{
int i, ret = 0;
for (i = base; i < bound; i++)
{
if (i > bound * bound)
global += bar (i);
if (i > bound + 10)
global += bar (i);
if (i <= bound + 10)
global += bar (i);
if (i > base + 10)
global += bar (i);
if (i < base - 10)
global += bar (i);
}
}
/* { dg-final { scan-tree-dump-not "loop iv compare heuristics" "profile_estimate"} } */
/* { dg-final { cleanup-tree-dump "profile_estimate" } } */
/* { dg-do compile } */
/* { dg-options "-O2 -fdump-tree-profile_estimate" } */
extern int global;
int bar(int);
void foo (int base, int bound)
{
int i, ret = 0;
for (i = base; i < bound; i++)
{
if (i > bound * bound)
global += bar (i);
if (i > bound + 10)
global += bar (i);
if (i <= bound + 10)
global += bar (i);
if (i > base + 10)
global += bar (i);
if (i < base - 10)
global += bar (i);
}
}
/* { dg-final { scan-tree-dump-not "loop iv compare heuristics" "profile_estimate"} } */
/* { dg-final { cleanup-tree-dump "profile_estimate" } } */
/* { dg-do compile } */
/* { dg-options "-O2 -fdump-tree-profile_estimate" } */
extern int global;
int bar(int);
void foo (int bound)
{
int i, ret = 0;
for (i = 0; i <= bound; i++)
{
if (i < bound - 2)
global += bar (i);
if (i <= bound)
global += bar (i);
if (i + 1 < bound)
global += bar (i);
if (i != bound)
global += bar (i);
}
}
/* { dg-final { scan-tree-dump-times "loop iv compare heuristics: 100.0%" 4 "profile_estimate"} } */
/* { dg-final { cleanup-tree-dump "profile_estimate" } } */
/* { dg-do compile } */
/* { dg-options "-O2 -fdump-tree-profile_estimate" } */
extern int global;
int bar(int);
void foo (int bound)
{
int i, ret = 0;
for (i = 0; i <= bound; i++)
{
if (i < bound - 2)
global += bar (i);
if (i <= bound)
global += bar (i);
if (i + 1 < bound)
global += bar (i);
if (i != bound)
global += bar (i);
}
}
/* { dg-final { scan-tree-dump-times "loop iv compare heuristics: 100.0%" 4 "profile_estimate"} } */
/* { dg-final { cleanup-tree-dump "profile_estimate" } } */
/* { dg-do compile } */
/* { dg-options "-O2 -fdump-tree-profile_estimate" } */
extern int global;
int bar(int);
void foo (int bound)
{
int i, ret = 0;
for (i = 0; i < 10; i++)
{
if (i < 5)
global += bar (i);
}
}
/* { dg-final { scan-tree-dump "loop iv compare heuristics: 50.0%" "profile_estimate"} } */
/* { dg-final { cleanup-tree-dump "profile_estimate" } } */
/* { dg-do compile } */
/* { dg-options "-O2 -fdump-tree-profile_estimate" } */
extern int global;
int bar(int);
void foo (int bound)
{
int i, ret = 0;
for (i = 0; i < 10; i++)
{
if (i < 5)
global += bar (i);
}
}
/* { dg-final { scan-tree-dump "loop iv compare heuristics: 50.0%" "profile_estimate"} } */
/* { dg-final { cleanup-tree-dump "profile_estimate" } } */
/* { dg-do compile } */
/* { dg-options "-O2 -fdump-tree-profile_estimate" } */
extern int global;
int bar (int);
void foo (int base, int bound)
{
int i, ret = 0;
for (i = base; i <= bound; i++)
{
if (i > base)
global += bar (i);
if (i > base + 1)
global += bar (i);
if (i >= base + 3)
global += bar (i);
if (i - 2 >= base)
global += bar (i);
}
}
/* { dg-final { scan-tree-dump-times "loop iv compare heuristics: 100.0%" 4 "profile_estimate"} } */
/* { dg-final { cleanup-tree-dump "profile_estimate" } } */
/* { dg-do compile } */
/* { dg-options "-O2 -fdump-tree-profile_estimate" } */
extern int global;
int bar (int);
void foo (int base, int bound)
{
int i, ret = 0;
for (i = base; i <= bound; i++)
{
if (i > base)
global += bar (i);
if (i > base + 1)
global += bar (i);
if (i >= base + 3)
global += bar (i);
if (i - 2 >= base)
global += bar (i);
}
}
/* { dg-final { scan-tree-dump-times "loop iv compare heuristics: 100.0%" 4 "profile_estimate"} } */
/* { dg-final { cleanup-tree-dump "profile_estimate" } } */
/* { dg-do compile } */
/* { dg-options "-O2 -fdump-tree-profile_estimate" } */
extern int global;
int bar (int);
void foo (int base, int bound)
{
int i, ret = 0;
for (i = base; i <= bound; i++)
{
if (i < base)
global += bar (i);
if (i < base + 1)
global += bar (i);
if (i <= base + 3)
global += bar (i);
if (i - 1 < base)
global += bar (i);
}
}
/* { dg-final { scan-tree-dump-times "loop iv compare heuristics: 0.0%" 4 "profile_estimate"} } */
/* { dg-final { cleanup-tree-dump "profile_estimate" } } */
/* { dg-do compile } */
/* { dg-options "-O2 -fdump-tree-profile_estimate" } */
extern int global;
int bar (int);
void foo (int base, int bound)
{
int i, ret = 0;
for (i = base; i <= bound; i++)
{
if (i < base)
global += bar (i);
if (i < base + 1)
global += bar (i);
if (i <= base + 3)
global += bar (i);
if (i - 1 < base)
global += bar (i);
}
}
/* { dg-final { scan-tree-dump-times "loop iv compare heuristics: 0.0%" 4 "profile_estimate"} } */
/* { dg-final { cleanup-tree-dump "profile_estimate" } } */
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