diff options
author | pfg <pfg@FreeBSD.org> | 2012-06-21 16:49:20 +0000 |
---|---|---|
committer | pfg <pfg@FreeBSD.org> | 2012-06-21 16:49:20 +0000 |
commit | 8c84995be2f385f8e9a19b071c5297940a91c4dc (patch) | |
tree | 061d41c370879adcdbc7178c01ee3106fafc9a4b /contrib/gcc/tree-ssa-pre.c | |
parent | dd83f274ed4c8fa3cdb0fd69be2f4df1e1ac398e (diff) | |
download | FreeBSD-src-8c84995be2f385f8e9a19b071c5297940a91c4dc.zip FreeBSD-src-8c84995be2f385f8e9a19b071c5297940a91c4dc.tar.gz |
Bring a couple of fixes for gcc optimizations.
The GCC4.3 branch contains some optimization fixes
that were not considered regressions and therefore
were never backported. We are bringing a couple of
them that are under GPLv2 since they were made
before the license switch upstream.
While here, add the GCC revision numbers in the
log.
Discussed with: jkim
MFC after: 1 week
Diffstat (limited to 'contrib/gcc/tree-ssa-pre.c')
-rw-r--r-- | contrib/gcc/tree-ssa-pre.c | 17 |
1 files changed, 17 insertions, 0 deletions
diff --git a/contrib/gcc/tree-ssa-pre.c b/contrib/gcc/tree-ssa-pre.c index 9c7b89f..ba32b3c 100644 --- a/contrib/gcc/tree-ssa-pre.c +++ b/contrib/gcc/tree-ssa-pre.c @@ -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); |