re PR tree-optimization/3511 (Inlined strlen() could be smarter)
2006-10-21 Richard Guenther <rguenther@suse.de> PR tree-optimization/3511 * tree-ssa-pre.c (phi_translate): Fold CALL_EXPRs that got new invariant arguments during PHI translation. * gcc.dg/tree-ssa/ssa-pre-15.c: New testcase. From-SVN: r117932
This commit is contained in:
parent
8a1eca0803
commit
0778d4e84a
4 changed files with 44 additions and 0 deletions
|
@ -1,3 +1,9 @@
|
|||
2006-10-21 Richard Guenther <rguenther@suse.de>
|
||||
|
||||
PR tree-optimization/3511
|
||||
* tree-ssa-pre.c (phi_translate): Fold CALL_EXPRs that
|
||||
got new invariant arguments during PHI translation.
|
||||
|
||||
2006-10-21 Richard Guenther <rguenther@suse.de>
|
||||
|
||||
PR middle-end/26898
|
||||
|
|
|
@ -1,3 +1,8 @@
|
|||
2006-10-21 Richard Guenther <rguenther@suse.de>
|
||||
|
||||
PR tree-optimization/3511
|
||||
* gcc.dg/tree-ssa/ssa-pre-15.c: New testcase.
|
||||
|
||||
2006-10-21 Richard Guenther <rguenther@suse.de>
|
||||
|
||||
PR middle-end/26898
|
||||
|
|
16
gcc/testsuite/gcc.dg/tree-ssa/ssa-pre-15.c
Normal file
16
gcc/testsuite/gcc.dg/tree-ssa/ssa-pre-15.c
Normal file
|
@ -0,0 +1,16 @@
|
|||
/* { dg-do compile } */
|
||||
/* { dg-options "-O2 -fdump-tree-optimized" } */
|
||||
|
||||
/* Verify we PRE the strlen call, as strlen("") folds to zero. */
|
||||
|
||||
extern __SIZE_TYPE__ strlen (const char *);
|
||||
|
||||
__SIZE_TYPE__ mystrlen (const char *s)
|
||||
{
|
||||
if (!s)
|
||||
s = "";
|
||||
return strlen(s);
|
||||
}
|
||||
|
||||
/* { dg-final { scan-tree-dump "= 0;" "optimized" } } */
|
||||
/* { dg-final { cleanup-tree-dump "optimized" } } */
|
|
@ -1076,6 +1076,7 @@ phi_translate (tree expr, value_set_t set, basic_block pred,
|
|||
tree newexpr;
|
||||
tree vh = get_value_handle (expr);
|
||||
bool listchanged = false;
|
||||
bool invariantarg = false;
|
||||
VEC (tree, gc) *vuses = VALUE_HANDLE_VUSES (vh);
|
||||
VEC (tree, gc) *tvuses;
|
||||
|
||||
|
@ -1134,10 +1135,26 @@ phi_translate (tree expr, value_set_t set, basic_block pred,
|
|||
if (newval != oldval)
|
||||
{
|
||||
listchanged = true;
|
||||
invariantarg |= is_gimple_min_invariant (newval);
|
||||
TREE_VALUE (newwalker) = get_value_handle (newval);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/* In case of new invariant args we might try to fold the call
|
||||
again. */
|
||||
if (invariantarg)
|
||||
{
|
||||
tree tmp = fold_ternary (CALL_EXPR, TREE_TYPE (expr),
|
||||
newop0, newarglist, newop2);
|
||||
if (tmp)
|
||||
{
|
||||
STRIP_TYPE_NOPS (tmp);
|
||||
if (is_gimple_min_invariant (tmp))
|
||||
return tmp;
|
||||
}
|
||||
}
|
||||
|
||||
if (listchanged)
|
||||
vn_lookup_or_add (newarglist, NULL);
|
||||
|
||||
|
|
Loading…
Add table
Reference in a new issue