diff options
author | Trevor Saunders <tsaunders@mozilla.com> | 2014-04-17 12:37:34 +0000 |
---|---|---|
committer | Trevor Saunders <tbsaunde@gcc.gnu.org> | 2014-04-17 12:37:34 +0000 |
commit | be55bfe6cf456943b12fe128f8a445b583ace36f (patch) | |
tree | 2c7de59d1f6572c580defbe0ccac2d0b83cd1eb3 /gcc/tree-ssa-phiopt.c | |
parent | 1a3d085cf2a0caa5daef7c0443b1d280bcef295e (diff) | |
download | gcc-be55bfe6cf456943b12fe128f8a445b583ace36f.zip gcc-be55bfe6cf456943b12fe128f8a445b583ace36f.tar.gz gcc-be55bfe6cf456943b12fe128f8a445b583ace36f.tar.bz2 |
pass cfun to pass::execute
gcc/
* passes.c (opt_pass::execute): Adjust.
(pass_manager::execute_pass_mode_switching): Likewise.
(early_local_passes::execute): Likewise.
(execute_one_pass): Pass cfun to the pass's execute method.
* tree-pass.h (opt_pass::execute): Add function * argument.
* asan.c, auto-inc-dec.c, bb-reorder.c, bt-load.c, cfgcleanup.c,
cfgexpand.c, cfgrtl.c, cgraphbuild.c, combine-stack-adj.c, combine.c,
compare-elim.c, config/arc/arc.c, config/epiphany/mode-switch-use.c,
config/epiphany/resolve-sw-modes.c, config/i386/i386.c,
config/mips/mips.c, config/rl78/rl78.c, config/s390/s390.c,
config/sparc/sparc.c, cprop.c, dce.c, df-core.c, dse.c, dwarf2cfi.c,
except.c, final.c, function.c, fwprop.c, gcse.c, gimple-low.c,
gimple-ssa-isolate-paths.c, gimple-ssa-strength-reduction.c,
graphite.c, ifcvt.c, init-regs.c, ipa-cp.c, ipa-devirt.c,
ipa-inline-analysis.c, ipa-inline.c, ipa-profile.c, ipa-pure-const.c,
ipa-reference.c, ipa-split.c, ipa.c, ira.c, jump.c, loop-init.c,
lower-subreg.c, mode-switching.c, omp-low.c, postreload-gcse.c,
postreload.c, predict.c, recog.c, ree.c, reg-stack.c, regcprop.c,
reginfo.c, regrename.c, reorg.c, sched-rgn.c, stack-ptr-mod.c,
store-motion.c, tracer.c, trans-mem.c, tree-call-cdce.c, tree-cfg.c,
tree-cfgcleanup.c, tree-complex.c, tree-eh.c, tree-emutls.c,
tree-if-conv.c, tree-into-ssa.c, tree-loop-distribution.c, tree-nrv.c,
tree-object-size.c, tree-parloops.c, tree-predcom.c, tree-ssa-ccp.c,
tree-ssa-copy.c, tree-ssa-copyrename.c, tree-ssa-dce.c,
tree-ssa-dom.c, tree-ssa-dse.c, tree-ssa-forwprop.c,
tree-ssa-ifcombine.c, tree-ssa-loop-ch.c, tree-ssa-loop-im.c,
tree-ssa-loop-ivcanon.c, tree-ssa-loop-prefetch.c,
tree-ssa-loop-unswitch.c, tree-ssa-loop.c, tree-ssa-math-opts.c,
tree-ssa-phiopt.c, tree-ssa-phiprop.c, tree-ssa-pre.c,
tree-ssa-reassoc.c, tree-ssa-sink.c, tree-ssa-strlen.c,
tree-ssa-structalias.c, tree-ssa-uncprop.c, tree-ssa-uninit.c,
tree-ssa.c, tree-ssanames.c, tree-stdarg.c, tree-switch-conversion.c,
tree-tailcall.c, tree-vect-generic.c, tree-vectorizer.c, tree-vrp.c,
tree.c, tsan.c, ubsan.c, var-tracking.c, vtable-verify.c, web.c:
Adjust.
From-SVN: r209482
Diffstat (limited to 'gcc/tree-ssa-phiopt.c')
-rw-r--r-- | gcc/tree-ssa-phiopt.c | 315 |
1 files changed, 154 insertions, 161 deletions
diff --git a/gcc/tree-ssa-phiopt.c b/gcc/tree-ssa-phiopt.c index 1ee39a5..9b5b563 100644 --- a/gcc/tree-ssa-phiopt.c +++ b/gcc/tree-ssa-phiopt.c @@ -59,7 +59,6 @@ along with GCC; see the file COPYING3. If not see #define HAVE_conditional_move (0) #endif -static unsigned int tree_ssa_phiopt (void); static unsigned int tree_ssa_phiopt_worker (bool, bool); static bool conditional_replacement (basic_block, basic_block, edge, edge, gimple, tree, tree); @@ -80,162 +79,6 @@ static void hoist_adjacent_loads (basic_block, basic_block, basic_block, basic_block); static bool gate_hoist_loads (void); -/* This pass tries to replaces an if-then-else block with an - assignment. We have four kinds of transformations. Some of these - transformations are also performed by the ifcvt RTL optimizer. - - Conditional Replacement - ----------------------- - - This transformation, implemented in conditional_replacement, - replaces - - bb0: - if (cond) goto bb2; else goto bb1; - bb1: - bb2: - x = PHI <0 (bb1), 1 (bb0), ...>; - - with - - bb0: - x' = cond; - goto bb2; - bb2: - x = PHI <x' (bb0), ...>; - - We remove bb1 as it becomes unreachable. This occurs often due to - gimplification of conditionals. - - Value Replacement - ----------------- - - This transformation, implemented in value_replacement, replaces - - bb0: - if (a != b) goto bb2; else goto bb1; - bb1: - bb2: - x = PHI <a (bb1), b (bb0), ...>; - - with - - bb0: - bb2: - x = PHI <b (bb0), ...>; - - This opportunity can sometimes occur as a result of other - optimizations. - - - Another case caught by value replacement looks like this: - - bb0: - t1 = a == CONST; - t2 = b > c; - t3 = t1 & t2; - if (t3 != 0) goto bb1; else goto bb2; - bb1: - bb2: - x = PHI (CONST, a) - - Gets replaced with: - bb0: - bb2: - t1 = a == CONST; - t2 = b > c; - t3 = t1 & t2; - x = a; - - ABS Replacement - --------------- - - This transformation, implemented in abs_replacement, replaces - - bb0: - if (a >= 0) goto bb2; else goto bb1; - bb1: - x = -a; - bb2: - x = PHI <x (bb1), a (bb0), ...>; - - with - - bb0: - x' = ABS_EXPR< a >; - bb2: - x = PHI <x' (bb0), ...>; - - MIN/MAX Replacement - ------------------- - - This transformation, minmax_replacement replaces - - bb0: - if (a <= b) goto bb2; else goto bb1; - bb1: - bb2: - x = PHI <b (bb1), a (bb0), ...>; - - with - - bb0: - x' = MIN_EXPR (a, b) - bb2: - x = PHI <x' (bb0), ...>; - - A similar transformation is done for MAX_EXPR. - - - This pass also performs a fifth transformation of a slightly different - flavor. - - Adjacent Load Hoisting - ---------------------- - - This transformation replaces - - bb0: - if (...) goto bb2; else goto bb1; - bb1: - x1 = (<expr>).field1; - goto bb3; - bb2: - x2 = (<expr>).field2; - bb3: - # x = PHI <x1, x2>; - - with - - bb0: - x1 = (<expr>).field1; - x2 = (<expr>).field2; - if (...) goto bb2; else goto bb1; - bb1: - goto bb3; - bb2: - bb3: - # x = PHI <x1, x2>; - - The purpose of this transformation is to enable generation of conditional - move instructions such as Intel CMOVE or PowerPC ISEL. Because one of - the loads is speculative, the transformation is restricted to very - specific cases to avoid introducing a page fault. We are looking for - the common idiom: - - if (...) - x = y->left; - else - x = y->right; - - where left and right are typically adjacent pointers in a tree structure. */ - -static unsigned int -tree_ssa_phiopt (void) -{ - return tree_ssa_phiopt_worker (false, gate_hoist_loads ()); -} - /* This pass tries to transform conditional stores into unconditional ones, enabling further simplifications with the simpler then and else blocks. In particular it replaces this: @@ -2200,8 +2043,155 @@ gate_hoist_loads (void) && HAVE_conditional_move); } -/* Always do these optimizations if we have SSA - trees to work on. */ +/* This pass tries to replaces an if-then-else block with an + assignment. We have four kinds of transformations. Some of these + transformations are also performed by the ifcvt RTL optimizer. + + Conditional Replacement + ----------------------- + + This transformation, implemented in conditional_replacement, + replaces + + bb0: + if (cond) goto bb2; else goto bb1; + bb1: + bb2: + x = PHI <0 (bb1), 1 (bb0), ...>; + + with + + bb0: + x' = cond; + goto bb2; + bb2: + x = PHI <x' (bb0), ...>; + + We remove bb1 as it becomes unreachable. This occurs often due to + gimplification of conditionals. + + Value Replacement + ----------------- + + This transformation, implemented in value_replacement, replaces + + bb0: + if (a != b) goto bb2; else goto bb1; + bb1: + bb2: + x = PHI <a (bb1), b (bb0), ...>; + + with + + bb0: + bb2: + x = PHI <b (bb0), ...>; + + This opportunity can sometimes occur as a result of other + optimizations. + + + Another case caught by value replacement looks like this: + + bb0: + t1 = a == CONST; + t2 = b > c; + t3 = t1 & t2; + if (t3 != 0) goto bb1; else goto bb2; + bb1: + bb2: + x = PHI (CONST, a) + + Gets replaced with: + bb0: + bb2: + t1 = a == CONST; + t2 = b > c; + t3 = t1 & t2; + x = a; + + ABS Replacement + --------------- + + This transformation, implemented in abs_replacement, replaces + + bb0: + if (a >= 0) goto bb2; else goto bb1; + bb1: + x = -a; + bb2: + x = PHI <x (bb1), a (bb0), ...>; + + with + + bb0: + x' = ABS_EXPR< a >; + bb2: + x = PHI <x' (bb0), ...>; + + MIN/MAX Replacement + ------------------- + + This transformation, minmax_replacement replaces + + bb0: + if (a <= b) goto bb2; else goto bb1; + bb1: + bb2: + x = PHI <b (bb1), a (bb0), ...>; + + with + + bb0: + x' = MIN_EXPR (a, b) + bb2: + x = PHI <x' (bb0), ...>; + + A similar transformation is done for MAX_EXPR. + + + This pass also performs a fifth transformation of a slightly different + flavor. + + Adjacent Load Hoisting + ---------------------- + + This transformation replaces + + bb0: + if (...) goto bb2; else goto bb1; + bb1: + x1 = (<expr>).field1; + goto bb3; + bb2: + x2 = (<expr>).field2; + bb3: + # x = PHI <x1, x2>; + + with + + bb0: + x1 = (<expr>).field1; + x2 = (<expr>).field2; + if (...) goto bb2; else goto bb1; + bb1: + goto bb3; + bb2: + bb3: + # x = PHI <x1, x2>; + + The purpose of this transformation is to enable generation of conditional + move instructions such as Intel CMOVE or PowerPC ISEL. Because one of + the loads is speculative, the transformation is restricted to very + specific cases to avoid introducing a page fault. We are looking for + the common idiom: + + if (...) + x = y->left; + else + x = y->right; + + where left and right are typically adjacent pointers in a tree structure. */ namespace { @@ -2229,7 +2219,10 @@ public: /* opt_pass methods: */ opt_pass * clone () { return new pass_phiopt (m_ctxt); } - unsigned int execute () { return tree_ssa_phiopt (); } + virtual unsigned int execute (function *) + { + return tree_ssa_phiopt_worker (false, gate_hoist_loads ()); + } }; // class pass_phiopt @@ -2267,7 +2260,7 @@ public: /* opt_pass methods: */ virtual bool gate (function *) { return flag_tree_cselim; } - unsigned int execute () { return tree_ssa_cs_elim (); } + virtual unsigned int execute (function *) { return tree_ssa_cs_elim (); } }; // class pass_cselim |