]> git.ipfire.org Git - thirdparty/gcc.git/blame - gcc/tree-ssa-phiopt.c
remove need for store_values_directly
[thirdparty/gcc.git] / gcc / tree-ssa-phiopt.c
CommitLineData
6de9cd9a 1/* Optimization of PHI nodes by converting them into straightline code.
5624e564 2 Copyright (C) 2004-2015 Free Software Foundation, Inc.
6de9cd9a
DN
3
4This file is part of GCC.
0385f644 5
6de9cd9a
DN
6GCC is free software; you can redistribute it and/or modify it
7under the terms of the GNU General Public License as published by the
9dcd6f09 8Free Software Foundation; either version 3, or (at your option) any
6de9cd9a 9later version.
0385f644 10
6de9cd9a
DN
11GCC is distributed in the hope that it will be useful, but WITHOUT
12ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
13FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
14for more details.
0385f644 15
6de9cd9a 16You should have received a copy of the GNU General Public License
9dcd6f09
NC
17along with GCC; see the file COPYING3. If not see
18<http://www.gnu.org/licenses/>. */
6de9cd9a
DN
19
20#include "config.h"
21#include "system.h"
22#include "coretypes.h"
4a8fb1a1 23#include "hash-table.h"
6de9cd9a 24#include "tm.h"
40e23961
MC
25#include "hash-set.h"
26#include "machmode.h"
27#include "vec.h"
28#include "double-int.h"
29#include "input.h"
30#include "alias.h"
31#include "symtab.h"
32#include "wide-int.h"
33#include "inchash.h"
6de9cd9a 34#include "tree.h"
40e23961 35#include "fold-const.h"
d8a2d370 36#include "stor-layout.h"
3a3f4da9 37#include "flags.h"
6de9cd9a 38#include "tm_p.h"
60393bbc 39#include "predict.h"
60393bbc 40#include "hard-reg-set.h"
60393bbc
AM
41#include "function.h"
42#include "dominance.h"
43#include "cfg.h"
44#include "cfganal.h"
45#include "basic-block.h"
2fb9a547
AM
46#include "tree-ssa-alias.h"
47#include "internal-fn.h"
48#include "gimple-expr.h"
49#include "is-a.h"
18f429e2 50#include "gimple.h"
45b0be94 51#include "gimplify.h"
5be5c238 52#include "gimple-iterator.h"
18f429e2 53#include "gimplify-me.h"
442b4905
AM
54#include "gimple-ssa.h"
55#include "tree-cfg.h"
56#include "tree-phinodes.h"
57#include "ssa-iterators.h"
d8a2d370 58#include "stringpool.h"
442b4905 59#include "tree-ssanames.h"
36566b39
PK
60#include "hashtab.h"
61#include "rtl.h"
62#include "statistics.h"
63#include "real.h"
64#include "fixed-value.h"
65#include "insn-config.h"
66#include "expmed.h"
67#include "dojump.h"
68#include "explow.h"
69#include "calls.h"
70#include "emit-rtl.h"
71#include "varasm.h"
72#include "stmt.h"
d8a2d370 73#include "expr.h"
442b4905 74#include "tree-dfa.h"
6de9cd9a 75#include "tree-pass.h"
6de9cd9a 76#include "langhooks.h"
a5828d1e 77#include "domwalk.h"
bfe068c3
IR
78#include "cfgloop.h"
79#include "tree-data-ref.h"
372a6eb8 80#include "gimple-pretty-print.h"
b0710fe1 81#include "insn-codes.h"
372a6eb8 82#include "optabs.h"
a9e0d843 83#include "tree-scalar-evolution.h"
421bf780 84#include "tree-inline.h"
372a6eb8
BS
85
86#ifndef HAVE_conditional_move
87#define HAVE_conditional_move (0)
88#endif
6de9cd9a 89
372a6eb8 90static unsigned int tree_ssa_phiopt_worker (bool, bool);
e5206274 91static bool conditional_replacement (basic_block, basic_block,
538dd0b7 92 edge, edge, gphi *, tree, tree);
210ac0b7
AP
93static int value_replacement (basic_block, basic_block,
94 edge, edge, gimple, tree, tree);
e5206274 95static bool minmax_replacement (basic_block, basic_block,
726a989a 96 edge, edge, gimple, tree, tree);
e5206274 97static bool abs_replacement (basic_block, basic_block,
726a989a 98 edge, edge, gimple, tree, tree);
a5828d1e 99static bool cond_store_replacement (basic_block, basic_block, edge, edge,
6e2830c3 100 hash_set<tree> *);
23782cc3 101static bool cond_if_else_store_replacement (basic_block, basic_block, basic_block);
6e2830c3 102static hash_set<tree> * get_non_trapping ();
726a989a 103static void replace_phi_edge_with_variable (basic_block, edge, gimple, tree);
372a6eb8
BS
104static void hoist_adjacent_loads (basic_block, basic_block,
105 basic_block, basic_block);
106static bool gate_hoist_loads (void);
1833df5c 107
a5828d1e
MM
108/* This pass tries to transform conditional stores into unconditional
109 ones, enabling further simplifications with the simpler then and else
110 blocks. In particular it replaces this:
111
112 bb0:
113 if (cond) goto bb2; else goto bb1;
114 bb1:
23782cc3 115 *p = RHS;
a5828d1e
MM
116 bb2:
117
118 with
119
120 bb0:
121 if (cond) goto bb1; else goto bb2;
122 bb1:
123 condtmp' = *p;
124 bb2:
125 condtmp = PHI <RHS, condtmp'>
23782cc3 126 *p = condtmp;
a5828d1e
MM
127
128 This transformation can only be done under several constraints,
23782cc3
JJ
129 documented below. It also replaces:
130
131 bb0:
132 if (cond) goto bb2; else goto bb1;
133 bb1:
134 *p = RHS1;
135 goto bb3;
136 bb2:
137 *p = RHS2;
138 bb3:
139
140 with
141
142 bb0:
143 if (cond) goto bb3; else goto bb1;
144 bb1:
145 bb3:
146 condtmp = PHI <RHS1, RHS2>
147 *p = condtmp; */
a5828d1e
MM
148
149static unsigned int
150tree_ssa_cs_elim (void)
151{
a9e0d843
RB
152 unsigned todo;
153 /* ??? We are not interested in loop related info, but the following
154 will create it, ICEing as we didn't init loops with pre-headers.
155 An interfacing issue of find_data_references_in_bb. */
156 loop_optimizer_init (LOOPS_NORMAL);
157 scev_initialize ();
158 todo = tree_ssa_phiopt_worker (true, false);
159 scev_finalize ();
160 loop_optimizer_finalize ();
161 return todo;
a5828d1e
MM
162}
163
b928d32b
AP
164/* Return the singleton PHI in the SEQ of PHIs for edges E0 and E1. */
165
538dd0b7 166static gphi *
b928d32b
AP
167single_non_singleton_phi_for_edges (gimple_seq seq, edge e0, edge e1)
168{
169 gimple_stmt_iterator i;
538dd0b7 170 gphi *phi = NULL;
b928d32b 171 if (gimple_seq_singleton_p (seq))
538dd0b7 172 return as_a <gphi *> (gsi_stmt (gsi_start (seq)));
b928d32b
AP
173 for (i = gsi_start (seq); !gsi_end_p (i); gsi_next (&i))
174 {
538dd0b7 175 gphi *p = as_a <gphi *> (gsi_stmt (i));
b928d32b
AP
176 /* If the PHI arguments are equal then we can skip this PHI. */
177 if (operand_equal_for_phi_arg_p (gimple_phi_arg_def (p, e0->dest_idx),
178 gimple_phi_arg_def (p, e1->dest_idx)))
179 continue;
180
181 /* If we already have a PHI that has the two edge arguments are
182 different, then return it is not a singleton for these PHIs. */
183 if (phi)
184 return NULL;
185
186 phi = p;
187 }
188 return phi;
189}
190
a5828d1e
MM
191/* The core routine of conditional store replacement and normal
192 phi optimizations. Both share much of the infrastructure in how
193 to match applicable basic block patterns. DO_STORE_ELIM is true
372a6eb8 194 when we want to do conditional store replacement, false otherwise.
c9ef86a1 195 DO_HOIST_LOADS is true when we want to hoist adjacent loads out
372a6eb8 196 of diamond control flow patterns, false otherwise. */
a5828d1e 197static unsigned int
372a6eb8 198tree_ssa_phiopt_worker (bool do_store_elim, bool do_hoist_loads)
6de9cd9a
DN
199{
200 basic_block bb;
8eaa0f34
ZD
201 basic_block *bb_order;
202 unsigned n, i;
3e0a08d7 203 bool cfgchanged = false;
6e2830c3 204 hash_set<tree> *nontrap = 0;
a5828d1e
MM
205
206 if (do_store_elim)
83d5977e
RG
207 /* Calculate the set of non-trapping memory accesses. */
208 nontrap = get_non_trapping ();
8eaa0f34
ZD
209
210 /* Search every basic block for COND_EXPR we may be able to optimize.
211
212 We walk the blocks in order that guarantees that a block with
213 a single predecessor is processed before the predecessor.
214 This ensures that we collapse inner ifs before visiting the
215 outer ones, and also that we do not try to visit a removed
216 block. */
3d9c733e 217 bb_order = single_pred_before_succ_order ();
0cae8d31 218 n = n_basic_blocks_for_fn (cfun) - NUM_FIXED_BLOCKS;
6de9cd9a 219
b8698a0f 220 for (i = 0; i < n; i++)
6de9cd9a 221 {
538dd0b7
DM
222 gimple cond_stmt;
223 gphi *phi;
80c4ed35
AP
224 basic_block bb1, bb2;
225 edge e1, e2;
8eaa0f34
ZD
226 tree arg0, arg1;
227
228 bb = bb_order[i];
0385f644 229
726a989a
RB
230 cond_stmt = last_stmt (bb);
231 /* Check to see if the last statement is a GIMPLE_COND. */
232 if (!cond_stmt
233 || gimple_code (cond_stmt) != GIMPLE_COND)
80c4ed35 234 continue;
0385f644 235
80c4ed35
AP
236 e1 = EDGE_SUCC (bb, 0);
237 bb1 = e1->dest;
238 e2 = EDGE_SUCC (bb, 1);
239 bb2 = e2->dest;
0385f644 240
80c4ed35
AP
241 /* We cannot do the optimization on abnormal edges. */
242 if ((e1->flags & EDGE_ABNORMAL) != 0
243 || (e2->flags & EDGE_ABNORMAL) != 0)
244 continue;
0385f644 245
80c4ed35 246 /* If either bb1's succ or bb2 or bb2's succ is non NULL. */
c5cbcccf 247 if (EDGE_COUNT (bb1->succs) == 0
80c4ed35 248 || bb2 == NULL
c5cbcccf 249 || EDGE_COUNT (bb2->succs) == 0)
80c4ed35 250 continue;
0385f644 251
80c4ed35
AP
252 /* Find the bb which is the fall through to the other. */
253 if (EDGE_SUCC (bb1, 0)->dest == bb2)
254 ;
255 else if (EDGE_SUCC (bb2, 0)->dest == bb1)
256 {
257 basic_block bb_tmp = bb1;
258 edge e_tmp = e1;
259 bb1 = bb2;
260 bb2 = bb_tmp;
261 e1 = e2;
262 e2 = e_tmp;
263 }
23782cc3
JJ
264 else if (do_store_elim
265 && EDGE_SUCC (bb1, 0)->dest == EDGE_SUCC (bb2, 0)->dest)
266 {
267 basic_block bb3 = EDGE_SUCC (bb1, 0)->dest;
268
269 if (!single_succ_p (bb1)
270 || (EDGE_SUCC (bb1, 0)->flags & EDGE_FALLTHRU) == 0
271 || !single_succ_p (bb2)
272 || (EDGE_SUCC (bb2, 0)->flags & EDGE_FALLTHRU) == 0
273 || EDGE_COUNT (bb3->preds) != 2)
274 continue;
275 if (cond_if_else_store_replacement (bb1, bb2, bb3))
276 cfgchanged = true;
277 continue;
278 }
372a6eb8
BS
279 else if (do_hoist_loads
280 && EDGE_SUCC (bb1, 0)->dest == EDGE_SUCC (bb2, 0)->dest)
281 {
282 basic_block bb3 = EDGE_SUCC (bb1, 0)->dest;
283
284 if (!FLOAT_TYPE_P (TREE_TYPE (gimple_cond_lhs (cond_stmt)))
285 && single_succ_p (bb1)
286 && single_succ_p (bb2)
287 && single_pred_p (bb1)
288 && single_pred_p (bb2)
289 && EDGE_COUNT (bb->succs) == 2
290 && EDGE_COUNT (bb3->preds) == 2
291 /* If one edge or the other is dominant, a conditional move
292 is likely to perform worse than the well-predicted branch. */
293 && !predictable_edge_p (EDGE_SUCC (bb, 0))
294 && !predictable_edge_p (EDGE_SUCC (bb, 1)))
295 hoist_adjacent_loads (bb, bb1, bb2, bb3);
296 continue;
297 }
80c4ed35 298 else
c9ef86a1 299 continue;
0385f644 300
80c4ed35 301 e1 = EDGE_SUCC (bb1, 0);
0385f644 302
80c4ed35 303 /* Make sure that bb1 is just a fall through. */
3d040dbc 304 if (!single_succ_p (bb1)
80c4ed35
AP
305 || (e1->flags & EDGE_FALLTHRU) == 0)
306 continue;
0385f644 307
2a925431
KH
308 /* Also make sure that bb1 only have one predecessor and that it
309 is bb. */
c5cbcccf
ZD
310 if (!single_pred_p (bb1)
311 || single_pred (bb1) != bb)
80c4ed35 312 continue;
0385f644 313
a5828d1e
MM
314 if (do_store_elim)
315 {
316 /* bb1 is the middle block, bb2 the join block, bb the split block,
317 e1 the fallthrough edge from bb1 to bb2. We can't do the
318 optimization if the join block has more than two predecessors. */
319 if (EDGE_COUNT (bb2->preds) > 2)
320 continue;
321 if (cond_store_replacement (bb1, bb2, e1, e2, nontrap))
322 cfgchanged = true;
323 }
324 else
325 {
726a989a 326 gimple_seq phis = phi_nodes (bb2);
e106efc7 327 gimple_stmt_iterator gsi;
210ac0b7 328 bool candorest = true;
b928d32b 329
210ac0b7
AP
330 /* Value replacement can work with more than one PHI
331 so try that first. */
332 for (gsi = gsi_start (phis); !gsi_end_p (gsi); gsi_next (&gsi))
333 {
538dd0b7 334 phi = as_a <gphi *> (gsi_stmt (gsi));
210ac0b7
AP
335 arg0 = gimple_phi_arg_def (phi, e1->dest_idx);
336 arg1 = gimple_phi_arg_def (phi, e2->dest_idx);
337 if (value_replacement (bb, bb1, e1, e2, phi, arg0, arg1) == 2)
338 {
339 candorest = false;
340 cfgchanged = true;
341 break;
342 }
343 }
a5828d1e 344
210ac0b7
AP
345 if (!candorest)
346 continue;
c9ef86a1 347
b928d32b 348 phi = single_non_singleton_phi_for_edges (phis, e1, e2);
e106efc7 349 if (!phi)
a5828d1e
MM
350 continue;
351
726a989a
RB
352 arg0 = gimple_phi_arg_def (phi, e1->dest_idx);
353 arg1 = gimple_phi_arg_def (phi, e2->dest_idx);
a5828d1e
MM
354
355 /* Something is wrong if we cannot find the arguments in the PHI
356 node. */
357 gcc_assert (arg0 != NULL && arg1 != NULL);
358
359 /* Do the replacement of conditional if it can be done. */
360 if (conditional_replacement (bb, bb1, e1, e2, phi, arg0, arg1))
361 cfgchanged = true;
a5828d1e
MM
362 else if (abs_replacement (bb, bb1, e1, e2, phi, arg0, arg1))
363 cfgchanged = true;
364 else if (minmax_replacement (bb, bb1, e1, e2, phi, arg0, arg1))
365 cfgchanged = true;
366 }
8eaa0f34
ZD
367 }
368
369 free (bb_order);
b8698a0f 370
a5828d1e 371 if (do_store_elim)
6e2830c3 372 delete nontrap;
a5828d1e
MM
373 /* If the CFG has changed, we should cleanup the CFG. */
374 if (cfgchanged && do_store_elim)
375 {
376 /* In cond-store replacement we have added some loads on edges
377 and new VOPS (as we moved the store, and created a load). */
726a989a 378 gsi_commit_edge_inserts ();
a5828d1e
MM
379 return TODO_cleanup_cfg | TODO_update_ssa_only_virtuals;
380 }
381 else if (cfgchanged)
382 return TODO_cleanup_cfg;
383 return 0;
8eaa0f34
ZD
384}
385
696e78bf 386/* Replace PHI node element whose edge is E in block BB with variable NEW.
80c4ed35 387 Remove the edge from COND_BLOCK which does not lead to BB (COND_BLOCK
1833df5c
JL
388 is known to have two edges, one of which must reach BB). */
389
390static void
e5206274 391replace_phi_edge_with_variable (basic_block cond_block,
726a989a 392 edge e, gimple phi, tree new_tree)
1833df5c 393{
726a989a 394 basic_block bb = gimple_bb (phi);
8a807136 395 basic_block block_to_remove;
726a989a 396 gimple_stmt_iterator gsi;
80c4ed35 397
0385f644 398 /* Change the PHI argument to new. */
c22940cd 399 SET_USE (PHI_ARG_DEF_PTR (phi, e->dest_idx), new_tree);
8a807136 400
8a807136 401 /* Remove the empty basic block. */
628f6a4e 402 if (EDGE_SUCC (cond_block, 0)->dest == bb)
1833df5c 403 {
628f6a4e
BE
404 EDGE_SUCC (cond_block, 0)->flags |= EDGE_FALLTHRU;
405 EDGE_SUCC (cond_block, 0)->flags &= ~(EDGE_TRUE_VALUE | EDGE_FALSE_VALUE);
afc970a4
JH
406 EDGE_SUCC (cond_block, 0)->probability = REG_BR_PROB_BASE;
407 EDGE_SUCC (cond_block, 0)->count += EDGE_SUCC (cond_block, 1)->count;
8a807136 408
628f6a4e 409 block_to_remove = EDGE_SUCC (cond_block, 1)->dest;
1833df5c
JL
410 }
411 else
412 {
628f6a4e
BE
413 EDGE_SUCC (cond_block, 1)->flags |= EDGE_FALLTHRU;
414 EDGE_SUCC (cond_block, 1)->flags
1833df5c 415 &= ~(EDGE_TRUE_VALUE | EDGE_FALSE_VALUE);
afc970a4
JH
416 EDGE_SUCC (cond_block, 1)->probability = REG_BR_PROB_BASE;
417 EDGE_SUCC (cond_block, 1)->count += EDGE_SUCC (cond_block, 0)->count;
8a807136 418
628f6a4e 419 block_to_remove = EDGE_SUCC (cond_block, 0)->dest;
1833df5c 420 }
8a807136 421 delete_basic_block (block_to_remove);
0385f644 422
1833df5c 423 /* Eliminate the COND_EXPR at the end of COND_BLOCK. */
726a989a
RB
424 gsi = gsi_last_bb (cond_block);
425 gsi_remove (&gsi, true);
0385f644 426
1833df5c
JL
427 if (dump_file && (dump_flags & TDF_DETAILS))
428 fprintf (dump_file,
429 "COND_EXPR in block %d and PHI in block %d converted to straightline code.\n",
430 cond_block->index,
431 bb->index);
432}
433
434/* The function conditional_replacement does the main work of doing the
435 conditional replacement. Return true if the replacement is done.
436 Otherwise return false.
437 BB is the basic block where the replacement is going to be done on. ARG0
471854f8 438 is argument 0 from PHI. Likewise for ARG1. */
1833df5c
JL
439
440static bool
80c4ed35 441conditional_replacement (basic_block cond_bb, basic_block middle_bb,
538dd0b7 442 edge e0, edge e1, gphi *phi,
80c4ed35 443 tree arg0, tree arg1)
1833df5c
JL
444{
445 tree result;
538dd0b7
DM
446 gimple stmt;
447 gassign *new_stmt;
726a989a
RB
448 tree cond;
449 gimple_stmt_iterator gsi;
1833df5c 450 edge true_edge, false_edge;
726a989a 451 tree new_var, new_var2;
809c929c 452 bool neg;
1833df5c 453
550386ad 454 /* FIXME: Gimplification of complex type is too hard for now. */
5dcf6b7f
JJ
455 /* We aren't prepared to handle vectors either (and it is a question
456 if it would be worthwhile anyway). */
457 if (!(INTEGRAL_TYPE_P (TREE_TYPE (arg0))
458 || POINTER_TYPE_P (TREE_TYPE (arg0)))
459 || !(INTEGRAL_TYPE_P (TREE_TYPE (arg1))
460 || POINTER_TYPE_P (TREE_TYPE (arg1))))
550386ad
AP
461 return false;
462
809c929c
PB
463 /* The PHI arguments have the constants 0 and 1, or 0 and -1, then
464 convert it to the conditional. */
1833df5c
JL
465 if ((integer_zerop (arg0) && integer_onep (arg1))
466 || (integer_zerop (arg1) && integer_onep (arg0)))
809c929c
PB
467 neg = false;
468 else if ((integer_zerop (arg0) && integer_all_onesp (arg1))
469 || (integer_zerop (arg1) && integer_all_onesp (arg0)))
470 neg = true;
1833df5c
JL
471 else
472 return false;
0385f644 473
80c4ed35 474 if (!empty_block_p (middle_bb))
1833df5c 475 return false;
0385f644 476
726a989a 477 /* At this point we know we have a GIMPLE_COND with two successors.
14886ab7
JL
478 One successor is BB, the other successor is an empty block which
479 falls through into BB.
0385f644 480
14886ab7 481 There is a single PHI node at the join point (BB) and its arguments
809c929c 482 are constants (0, 1) or (0, -1).
0385f644 483
14886ab7 484 So, given the condition COND, and the two PHI arguments, we can
0385f644
KH
485 rewrite this PHI into non-branching code:
486
14886ab7 487 dest = (COND) or dest = COND'
0385f644 488
14886ab7
JL
489 We use the condition as-is if the argument associated with the
490 true edge has the value one or the argument associated with the
491 false edge as the value zero. Note that those conditions are not
726a989a 492 the same since only one of the outgoing edges from the GIMPLE_COND
14886ab7 493 will directly reach BB and thus be associated with an argument. */
571325db 494
726a989a
RB
495 stmt = last_stmt (cond_bb);
496 result = PHI_RESULT (phi);
800dd123 497
726a989a
RB
498 /* To handle special cases like floating point comparison, it is easier and
499 less error-prone to build a tree and gimplify it on the fly though it is
500 less efficient. */
f8ecf734
RG
501 cond = fold_build2_loc (gimple_location (stmt),
502 gimple_cond_code (stmt), boolean_type_node,
503 gimple_cond_lhs (stmt), gimple_cond_rhs (stmt));
6de9cd9a 504
726a989a
RB
505 /* We need to know which is the true edge and which is the false
506 edge so that we know when to invert the condition below. */
507 extract_true_false_edges_from_block (cond_bb, &true_edge, &false_edge);
508 if ((e0 == true_edge && integer_zerop (arg0))
809c929c 509 || (e0 == false_edge && !integer_zerop (arg0))
726a989a 510 || (e1 == true_edge && integer_zerop (arg1))
809c929c 511 || (e1 == false_edge && !integer_zerop (arg1)))
f8ecf734 512 cond = fold_build1_loc (gimple_location (stmt),
809c929c
PB
513 TRUTH_NOT_EXPR, TREE_TYPE (cond), cond);
514
515 if (neg)
516 {
517 cond = fold_convert_loc (gimple_location (stmt),
518 TREE_TYPE (result), cond);
519 cond = fold_build1_loc (gimple_location (stmt),
520 NEGATE_EXPR, TREE_TYPE (cond), cond);
521 }
726a989a
RB
522
523 /* Insert our new statements at the end of conditional block before the
524 COND_STMT. */
525 gsi = gsi_for_stmt (stmt);
526 new_var = force_gimple_operand_gsi (&gsi, cond, true, NULL, true,
527 GSI_SAME_STMT);
528
529 if (!useless_type_conversion_p (TREE_TYPE (result), TREE_TYPE (new_var)))
530 {
f5045c96
AM
531 source_location locus_0, locus_1;
532
b731b390 533 new_var2 = make_ssa_name (TREE_TYPE (result));
0d0e4a03 534 new_stmt = gimple_build_assign (new_var2, CONVERT_EXPR, new_var);
726a989a
RB
535 gsi_insert_before (&gsi, new_stmt, GSI_SAME_STMT);
536 new_var = new_var2;
f5045c96
AM
537
538 /* Set the locus to the first argument, unless is doesn't have one. */
539 locus_0 = gimple_phi_arg_location (phi, 0);
540 locus_1 = gimple_phi_arg_location (phi, 1);
541 if (locus_0 == UNKNOWN_LOCATION)
542 locus_0 = locus_1;
543 gimple_set_location (new_stmt, locus_0);
6de9cd9a 544 }
0385f644 545
726a989a 546 replace_phi_edge_with_variable (cond_bb, e1, phi, new_var);
1833df5c 547
6de9cd9a
DN
548 /* Note that we optimized this PHI. */
549 return true;
550}
551
98dd3b73
RG
552/* Update *ARG which is defined in STMT so that it contains the
553 computed value if that seems profitable. Return true if the
554 statement is made dead by that rewriting. */
555
556static bool
557jump_function_from_stmt (tree *arg, gimple stmt)
558{
559 enum tree_code code = gimple_assign_rhs_code (stmt);
560 if (code == ADDR_EXPR)
561 {
562 /* For arg = &p->i transform it to p, if possible. */
563 tree rhs1 = gimple_assign_rhs1 (stmt);
564 HOST_WIDE_INT offset;
565 tree tem = get_addr_base_and_unit_offset (TREE_OPERAND (rhs1, 0),
566 &offset);
567 if (tem
568 && TREE_CODE (tem) == MEM_REF
807e902e 569 && (mem_ref_offset (tem) + offset) == 0)
98dd3b73
RG
570 {
571 *arg = TREE_OPERAND (tem, 0);
572 return true;
573 }
574 }
575 /* TODO: Much like IPA-CP jump-functions we want to handle constant
576 additions symbolically here, and we'd need to update the comparison
577 code that compares the arg + cst tuples in our caller. For now the
578 code above exactly handles the VEC_BASE pattern from vec.h. */
579 return false;
580}
581
c9ef86a1
ZC
582/* RHS is a source argument in a BIT_AND_EXPR which feeds a conditional
583 of the form SSA_NAME NE 0.
584
585 If RHS is fed by a simple EQ_EXPR comparison of two values, see if
586 the two input values of the EQ_EXPR match arg0 and arg1.
587
588 If so update *code and return TRUE. Otherwise return FALSE. */
589
590static bool
591rhs_is_fed_for_value_replacement (const_tree arg0, const_tree arg1,
592 enum tree_code *code, const_tree rhs)
593{
594 /* Obviously if RHS is not an SSA_NAME, we can't look at the defining
595 statement. */
596 if (TREE_CODE (rhs) == SSA_NAME)
597 {
598 gimple def1 = SSA_NAME_DEF_STMT (rhs);
599
600 /* Verify the defining statement has an EQ_EXPR on the RHS. */
601 if (is_gimple_assign (def1) && gimple_assign_rhs_code (def1) == EQ_EXPR)
602 {
603 /* Finally verify the source operands of the EQ_EXPR are equal
604 to arg0 and arg1. */
605 tree op0 = gimple_assign_rhs1 (def1);
606 tree op1 = gimple_assign_rhs2 (def1);
607 if ((operand_equal_for_phi_arg_p (arg0, op0)
608 && operand_equal_for_phi_arg_p (arg1, op1))
609 || (operand_equal_for_phi_arg_p (arg0, op1)
610 && operand_equal_for_phi_arg_p (arg1, op0)))
611 {
612 /* We will perform the optimization. */
613 *code = gimple_assign_rhs_code (def1);
614 return true;
615 }
616 }
617 }
618 return false;
619}
620
621/* Return TRUE if arg0/arg1 are equal to the rhs/lhs or lhs/rhs of COND.
622
623 Also return TRUE if arg0/arg1 are equal to the source arguments of a
624 an EQ comparison feeding a BIT_AND_EXPR which feeds COND.
625
626 Return FALSE otherwise. */
627
628static bool
629operand_equal_for_value_replacement (const_tree arg0, const_tree arg1,
630 enum tree_code *code, gimple cond)
631{
632 gimple def;
633 tree lhs = gimple_cond_lhs (cond);
634 tree rhs = gimple_cond_rhs (cond);
635
636 if ((operand_equal_for_phi_arg_p (arg0, lhs)
637 && operand_equal_for_phi_arg_p (arg1, rhs))
638 || (operand_equal_for_phi_arg_p (arg1, lhs)
639 && operand_equal_for_phi_arg_p (arg0, rhs)))
640 return true;
641
642 /* Now handle more complex case where we have an EQ comparison
643 which feeds a BIT_AND_EXPR which feeds COND.
644
645 First verify that COND is of the form SSA_NAME NE 0. */
646 if (*code != NE_EXPR || !integer_zerop (rhs)
647 || TREE_CODE (lhs) != SSA_NAME)
648 return false;
649
650 /* Now ensure that SSA_NAME is set by a BIT_AND_EXPR. */
651 def = SSA_NAME_DEF_STMT (lhs);
652 if (!is_gimple_assign (def) || gimple_assign_rhs_code (def) != BIT_AND_EXPR)
653 return false;
654
655 /* Now verify arg0/arg1 correspond to the source arguments of an
656 EQ comparison feeding the BIT_AND_EXPR. */
657
658 tree tmp = gimple_assign_rhs1 (def);
659 if (rhs_is_fed_for_value_replacement (arg0, arg1, code, tmp))
660 return true;
661
662 tmp = gimple_assign_rhs2 (def);
663 if (rhs_is_fed_for_value_replacement (arg0, arg1, code, tmp))
664 return true;
665
666 return false;
667}
668
421bf780
MG
669/* Returns true if ARG is a neutral element for operation CODE
670 on the RIGHT side. */
671
672static bool
673neutral_element_p (tree_code code, tree arg, bool right)
674{
675 switch (code)
676 {
677 case PLUS_EXPR:
678 case BIT_IOR_EXPR:
679 case BIT_XOR_EXPR:
680 return integer_zerop (arg);
681
682 case LROTATE_EXPR:
683 case RROTATE_EXPR:
684 case LSHIFT_EXPR:
685 case RSHIFT_EXPR:
686 case MINUS_EXPR:
687 case POINTER_PLUS_EXPR:
688 return right && integer_zerop (arg);
689
690 case MULT_EXPR:
691 return integer_onep (arg);
692
693 case TRUNC_DIV_EXPR:
694 case CEIL_DIV_EXPR:
695 case FLOOR_DIV_EXPR:
696 case ROUND_DIV_EXPR:
697 case EXACT_DIV_EXPR:
698 return right && integer_onep (arg);
699
700 case BIT_AND_EXPR:
701 return integer_all_onesp (arg);
702
703 default:
704 return false;
705 }
706}
707
708/* Returns true if ARG is an absorbing element for operation CODE. */
709
710static bool
711absorbing_element_p (tree_code code, tree arg)
712{
713 switch (code)
714 {
715 case BIT_IOR_EXPR:
716 return integer_all_onesp (arg);
717
718 case MULT_EXPR:
719 case BIT_AND_EXPR:
720 return integer_zerop (arg);
721
722 default:
723 return false;
724 }
725}
726
3a3f4da9 727/* The function value_replacement does the main work of doing the value
210ac0b7
AP
728 replacement. Return non-zero if the replacement is done. Otherwise return
729 0. If we remove the middle basic block, return 2.
3a3f4da9 730 BB is the basic block where the replacement is going to be done on. ARG0
471854f8 731 is argument 0 from the PHI. Likewise for ARG1. */
3a3f4da9 732
210ac0b7 733static int
80c4ed35 734value_replacement (basic_block cond_bb, basic_block middle_bb,
726a989a 735 edge e0, edge e1, gimple phi,
80c4ed35 736 tree arg0, tree arg1)
3a3f4da9 737{
98dd3b73 738 gimple_stmt_iterator gsi;
726a989a 739 gimple cond;
3a3f4da9 740 edge true_edge, false_edge;
726a989a 741 enum tree_code code;
210ac0b7 742 bool emtpy_or_with_defined_p = true;
3a3f4da9
AP
743
744 /* If the type says honor signed zeros we cannot do this
471854f8 745 optimization. */
3d3dbadd 746 if (HONOR_SIGNED_ZEROS (arg1))
210ac0b7 747 return 0;
3a3f4da9 748
210ac0b7
AP
749 /* If there is a statement in MIDDLE_BB that defines one of the PHI
750 arguments, then adjust arg0 or arg1. */
421bf780 751 gsi = gsi_start_nondebug_after_labels_bb (middle_bb);
210ac0b7 752 while (!gsi_end_p (gsi))
98dd3b73 753 {
210ac0b7
AP
754 gimple stmt = gsi_stmt (gsi);
755 tree lhs;
756 gsi_next_nondebug (&gsi);
757 if (!is_gimple_assign (stmt))
98dd3b73 758 {
210ac0b7
AP
759 emtpy_or_with_defined_p = false;
760 continue;
98dd3b73 761 }
210ac0b7
AP
762 /* Now try to adjust arg0 or arg1 according to the computation
763 in the statement. */
764 lhs = gimple_assign_lhs (stmt);
765 if (!(lhs == arg0
766 && jump_function_from_stmt (&arg0, stmt))
767 || (lhs == arg1
768 && jump_function_from_stmt (&arg1, stmt)))
769 emtpy_or_with_defined_p = false;
98dd3b73 770 }
3a3f4da9 771
726a989a
RB
772 cond = last_stmt (cond_bb);
773 code = gimple_cond_code (cond);
3a3f4da9
AP
774
775 /* This transformation is only valid for equality comparisons. */
726a989a 776 if (code != NE_EXPR && code != EQ_EXPR)
210ac0b7 777 return 0;
3a3f4da9
AP
778
779 /* We need to know which is the true edge and which is the false
780 edge so that we know if have abs or negative abs. */
80c4ed35 781 extract_true_false_edges_from_block (cond_bb, &true_edge, &false_edge);
3a3f4da9
AP
782
783 /* At this point we know we have a COND_EXPR with two successors.
784 One successor is BB, the other successor is an empty block which
785 falls through into BB.
786
787 The condition for the COND_EXPR is known to be NE_EXPR or EQ_EXPR.
788
789 There is a single PHI node at the join point (BB) with two arguments.
790
791 We now need to verify that the two arguments in the PHI node match
792 the two arguments to the equality comparison. */
0385f644 793
c9ef86a1 794 if (operand_equal_for_value_replacement (arg0, arg1, &code, cond))
3a3f4da9
AP
795 {
796 edge e;
797 tree arg;
798
84c672b9
JL
799 /* For NE_EXPR, we want to build an assignment result = arg where
800 arg is the PHI argument associated with the true edge. For
801 EQ_EXPR we want the PHI argument associated with the false edge. */
726a989a 802 e = (code == NE_EXPR ? true_edge : false_edge);
84c672b9
JL
803
804 /* Unfortunately, E may not reach BB (it may instead have gone to
805 OTHER_BLOCK). If that is the case, then we want the single outgoing
806 edge from OTHER_BLOCK which reaches BB and represents the desired
807 path from COND_BLOCK. */
80c4ed35 808 if (e->dest == middle_bb)
c5cbcccf 809 e = single_succ_edge (e->dest);
84c672b9
JL
810
811 /* Now we know the incoming edge to BB that has the argument for the
812 RHS of our new assignment statement. */
80c4ed35 813 if (e0 == e)
3a3f4da9
AP
814 arg = arg0;
815 else
816 arg = arg1;
817
210ac0b7 818 /* If the middle basic block was empty or is defining the
b928d32b
AP
819 PHI arguments and this is a single phi where the args are different
820 for the edges e0 and e1 then we can remove the middle basic block. */
210ac0b7 821 if (emtpy_or_with_defined_p
b928d32b 822 && single_non_singleton_phi_for_edges (phi_nodes (gimple_bb (phi)),
1a6230a8 823 e0, e1) == phi)
210ac0b7
AP
824 {
825 replace_phi_edge_with_variable (cond_bb, e1, phi, arg);
826 /* Note that we optimized this PHI. */
827 return 2;
828 }
829 else
830 {
831 /* Replace the PHI arguments with arg. */
832 SET_PHI_ARG_DEF (phi, e0->dest_idx, arg);
833 SET_PHI_ARG_DEF (phi, e1->dest_idx, arg);
834 if (dump_file && (dump_flags & TDF_DETAILS))
835 {
836 fprintf (dump_file, "PHI ");
837 print_generic_expr (dump_file, gimple_phi_result (phi), 0);
b928d32b
AP
838 fprintf (dump_file, " reduced for COND_EXPR in block %d to ",
839 cond_bb->index);
210ac0b7
AP
840 print_generic_expr (dump_file, arg, 0);
841 fprintf (dump_file, ".\n");
842 }
843 return 1;
844 }
3a3f4da9 845
3a3f4da9 846 }
421bf780
MG
847
848 /* Now optimize (x != 0) ? x + y : y to just y.
849 The following condition is too restrictive, there can easily be another
850 stmt in middle_bb, for instance a CONVERT_EXPR for the second argument. */
851 gimple assign = last_and_only_stmt (middle_bb);
852 if (!assign || gimple_code (assign) != GIMPLE_ASSIGN
853 || gimple_assign_rhs_class (assign) != GIMPLE_BINARY_RHS
854 || (!INTEGRAL_TYPE_P (TREE_TYPE (arg0))
855 && !POINTER_TYPE_P (TREE_TYPE (arg0))))
856 return 0;
857
ca73a1f7
MG
858 /* Punt if there are (degenerate) PHIs in middle_bb, there should not be. */
859 if (!gimple_seq_empty_p (phi_nodes (middle_bb)))
860 return 0;
861
87a34442
MG
862 /* Only transform if it removes the condition. */
863 if (!single_non_singleton_phi_for_edges (phi_nodes (gimple_bb (phi)), e0, e1))
864 return 0;
865
421bf780
MG
866 /* Size-wise, this is always profitable. */
867 if (optimize_bb_for_speed_p (cond_bb)
868 /* The special case is useless if it has a low probability. */
869 && profile_status_for_fn (cfun) != PROFILE_ABSENT
870 && EDGE_PRED (middle_bb, 0)->probability < PROB_EVEN
871 /* If assign is cheap, there is no point avoiding it. */
872 && estimate_num_insns (assign, &eni_time_weights)
873 >= 3 * estimate_num_insns (cond, &eni_time_weights))
874 return 0;
875
876 tree lhs = gimple_assign_lhs (assign);
877 tree rhs1 = gimple_assign_rhs1 (assign);
878 tree rhs2 = gimple_assign_rhs2 (assign);
879 enum tree_code code_def = gimple_assign_rhs_code (assign);
880 tree cond_lhs = gimple_cond_lhs (cond);
881 tree cond_rhs = gimple_cond_rhs (cond);
882
883 if (((code == NE_EXPR && e1 == false_edge)
884 || (code == EQ_EXPR && e1 == true_edge))
885 && arg0 == lhs
886 && ((arg1 == rhs1
887 && operand_equal_for_phi_arg_p (rhs2, cond_lhs)
888 && neutral_element_p (code_def, cond_rhs, true))
889 || (arg1 == rhs2
890 && operand_equal_for_phi_arg_p (rhs1, cond_lhs)
891 && neutral_element_p (code_def, cond_rhs, false))
892 || (operand_equal_for_phi_arg_p (arg1, cond_rhs)
893 && (operand_equal_for_phi_arg_p (rhs2, cond_lhs)
894 || operand_equal_for_phi_arg_p (rhs1, cond_lhs))
895 && absorbing_element_p (code_def, cond_rhs))))
896 {
897 gsi = gsi_for_stmt (cond);
f7a0790f
JJ
898 if (INTEGRAL_TYPE_P (TREE_TYPE (lhs)))
899 {
900 /* Moving ASSIGN might change VR of lhs, e.g. when moving u_6
901 def-stmt in:
902 if (n_5 != 0)
903 goto <bb 3>;
904 else
905 goto <bb 4>;
906
907 <bb 3>:
908 # RANGE [0, 4294967294]
909 u_6 = n_5 + 4294967295;
910
911 <bb 4>:
912 # u_3 = PHI <u_6(3), 4294967295(2)> */
913 SSA_NAME_RANGE_INFO (lhs) = NULL;
914 SSA_NAME_ANTI_RANGE_P (lhs) = 0;
915 /* If available, we can use VR of phi result at least. */
916 tree phires = gimple_phi_result (phi);
917 struct range_info_def *phires_range_info
918 = SSA_NAME_RANGE_INFO (phires);
919 if (phires_range_info)
920 duplicate_ssa_name_range_info (lhs, SSA_NAME_RANGE_TYPE (phires),
921 phires_range_info);
922 }
421bf780
MG
923 gimple_stmt_iterator gsi_from = gsi_for_stmt (assign);
924 gsi_move_before (&gsi_from, &gsi);
925 replace_phi_edge_with_variable (cond_bb, e1, phi, lhs);
926 return 2;
927 }
928
210ac0b7 929 return 0;
3a3f4da9
AP
930}
931
8eaa0f34
ZD
932/* The function minmax_replacement does the main work of doing the minmax
933 replacement. Return true if the replacement is done. Otherwise return
934 false.
935 BB is the basic block where the replacement is going to be done on. ARG0
936 is argument 0 from the PHI. Likewise for ARG1. */
937
938static bool
939minmax_replacement (basic_block cond_bb, basic_block middle_bb,
726a989a 940 edge e0, edge e1, gimple phi,
8eaa0f34
ZD
941 tree arg0, tree arg1)
942{
943 tree result, type;
538dd0b7
DM
944 gcond *cond;
945 gassign *new_stmt;
8eaa0f34
ZD
946 edge true_edge, false_edge;
947 enum tree_code cmp, minmax, ass_code;
948 tree smaller, larger, arg_true, arg_false;
726a989a 949 gimple_stmt_iterator gsi, gsi_from;
8eaa0f34
ZD
950
951 type = TREE_TYPE (PHI_RESULT (phi));
952
953 /* The optimization may be unsafe due to NaNs. */
1b457aa4 954 if (HONOR_NANS (type))
8eaa0f34
ZD
955 return false;
956
538dd0b7 957 cond = as_a <gcond *> (last_stmt (cond_bb));
726a989a 958 cmp = gimple_cond_code (cond);
8eaa0f34
ZD
959
960 /* This transformation is only valid for order comparisons. Record which
961 operand is smaller/larger if the result of the comparison is true. */
962 if (cmp == LT_EXPR || cmp == LE_EXPR)
963 {
726a989a
RB
964 smaller = gimple_cond_lhs (cond);
965 larger = gimple_cond_rhs (cond);
8eaa0f34
ZD
966 }
967 else if (cmp == GT_EXPR || cmp == GE_EXPR)
968 {
726a989a
RB
969 smaller = gimple_cond_rhs (cond);
970 larger = gimple_cond_lhs (cond);
8eaa0f34
ZD
971 }
972 else
973 return false;
974
975 /* We need to know which is the true edge and which is the false
976 edge so that we know if have abs or negative abs. */
977 extract_true_false_edges_from_block (cond_bb, &true_edge, &false_edge);
978
979 /* Forward the edges over the middle basic block. */
980 if (true_edge->dest == middle_bb)
981 true_edge = EDGE_SUCC (true_edge->dest, 0);
982 if (false_edge->dest == middle_bb)
983 false_edge = EDGE_SUCC (false_edge->dest, 0);
984
985 if (true_edge == e0)
986 {
987 gcc_assert (false_edge == e1);
988 arg_true = arg0;
989 arg_false = arg1;
990 }
991 else
992 {
993 gcc_assert (false_edge == e0);
994 gcc_assert (true_edge == e1);
995 arg_true = arg1;
996 arg_false = arg0;
997 }
998
999 if (empty_block_p (middle_bb))
1000 {
1001 if (operand_equal_for_phi_arg_p (arg_true, smaller)
1002 && operand_equal_for_phi_arg_p (arg_false, larger))
1003 {
1004 /* Case
b8698a0f 1005
8eaa0f34
ZD
1006 if (smaller < larger)
1007 rslt = smaller;
1008 else
1009 rslt = larger; */
1010 minmax = MIN_EXPR;
1011 }
1012 else if (operand_equal_for_phi_arg_p (arg_false, smaller)
1013 && operand_equal_for_phi_arg_p (arg_true, larger))
1014 minmax = MAX_EXPR;
1015 else
1016 return false;
1017 }
1018 else
1019 {
1020 /* Recognize the following case, assuming d <= u:
1021
1022 if (a <= u)
1023 b = MAX (a, d);
1024 x = PHI <b, u>
1025
1026 This is equivalent to
1027
1028 b = MAX (a, d);
1029 x = MIN (b, u); */
1030
726a989a
RB
1031 gimple assign = last_and_only_stmt (middle_bb);
1032 tree lhs, op0, op1, bound;
8eaa0f34
ZD
1033
1034 if (!assign
726a989a 1035 || gimple_code (assign) != GIMPLE_ASSIGN)
8eaa0f34
ZD
1036 return false;
1037
726a989a
RB
1038 lhs = gimple_assign_lhs (assign);
1039 ass_code = gimple_assign_rhs_code (assign);
8eaa0f34
ZD
1040 if (ass_code != MAX_EXPR && ass_code != MIN_EXPR)
1041 return false;
726a989a
RB
1042 op0 = gimple_assign_rhs1 (assign);
1043 op1 = gimple_assign_rhs2 (assign);
8eaa0f34
ZD
1044
1045 if (true_edge->src == middle_bb)
1046 {
1047 /* We got here if the condition is true, i.e., SMALLER < LARGER. */
1048 if (!operand_equal_for_phi_arg_p (lhs, arg_true))
1049 return false;
1050
1051 if (operand_equal_for_phi_arg_p (arg_false, larger))
1052 {
1053 /* Case
1054
1055 if (smaller < larger)
1056 {
1057 r' = MAX_EXPR (smaller, bound)
1058 }
1059 r = PHI <r', larger> --> to be turned to MIN_EXPR. */
1060 if (ass_code != MAX_EXPR)
1061 return false;
1062
1063 minmax = MIN_EXPR;
1064 if (operand_equal_for_phi_arg_p (op0, smaller))
1065 bound = op1;
1066 else if (operand_equal_for_phi_arg_p (op1, smaller))
1067 bound = op0;
1068 else
1069 return false;
1070
1071 /* We need BOUND <= LARGER. */
987b67bc
KH
1072 if (!integer_nonzerop (fold_build2 (LE_EXPR, boolean_type_node,
1073 bound, larger)))
8eaa0f34
ZD
1074 return false;
1075 }
1076 else if (operand_equal_for_phi_arg_p (arg_false, smaller))
1077 {
1078 /* Case
1079
1080 if (smaller < larger)
1081 {
1082 r' = MIN_EXPR (larger, bound)
1083 }
1084 r = PHI <r', smaller> --> to be turned to MAX_EXPR. */
1085 if (ass_code != MIN_EXPR)
1086 return false;
1087
1088 minmax = MAX_EXPR;
1089 if (operand_equal_for_phi_arg_p (op0, larger))
1090 bound = op1;
1091 else if (operand_equal_for_phi_arg_p (op1, larger))
1092 bound = op0;
1093 else
1094 return false;
1095
1096 /* We need BOUND >= SMALLER. */
987b67bc
KH
1097 if (!integer_nonzerop (fold_build2 (GE_EXPR, boolean_type_node,
1098 bound, smaller)))
8eaa0f34
ZD
1099 return false;
1100 }
1101 else
1102 return false;
1103 }
1104 else
1105 {
1106 /* We got here if the condition is false, i.e., SMALLER > LARGER. */
1107 if (!operand_equal_for_phi_arg_p (lhs, arg_false))
1108 return false;
1109
1110 if (operand_equal_for_phi_arg_p (arg_true, larger))
1111 {
1112 /* Case
1113
1114 if (smaller > larger)
1115 {
1116 r' = MIN_EXPR (smaller, bound)
1117 }
1118 r = PHI <r', larger> --> to be turned to MAX_EXPR. */
1119 if (ass_code != MIN_EXPR)
1120 return false;
1121
1122 minmax = MAX_EXPR;
1123 if (operand_equal_for_phi_arg_p (op0, smaller))
1124 bound = op1;
1125 else if (operand_equal_for_phi_arg_p (op1, smaller))
1126 bound = op0;
1127 else
1128 return false;
1129
1130 /* We need BOUND >= LARGER. */
987b67bc
KH
1131 if (!integer_nonzerop (fold_build2 (GE_EXPR, boolean_type_node,
1132 bound, larger)))
8eaa0f34
ZD
1133 return false;
1134 }
1135 else if (operand_equal_for_phi_arg_p (arg_true, smaller))
1136 {
1137 /* Case
1138
1139 if (smaller > larger)
1140 {
1141 r' = MAX_EXPR (larger, bound)
1142 }
1143 r = PHI <r', smaller> --> to be turned to MIN_EXPR. */
1144 if (ass_code != MAX_EXPR)
1145 return false;
1146
1147 minmax = MIN_EXPR;
1148 if (operand_equal_for_phi_arg_p (op0, larger))
1149 bound = op1;
1150 else if (operand_equal_for_phi_arg_p (op1, larger))
1151 bound = op0;
1152 else
1153 return false;
1154
1155 /* We need BOUND <= SMALLER. */
987b67bc
KH
1156 if (!integer_nonzerop (fold_build2 (LE_EXPR, boolean_type_node,
1157 bound, smaller)))
8eaa0f34
ZD
1158 return false;
1159 }
1160 else
1161 return false;
1162 }
1163
1164 /* Move the statement from the middle block. */
726a989a 1165 gsi = gsi_last_bb (cond_bb);
21719cea 1166 gsi_from = gsi_last_nondebug_bb (middle_bb);
726a989a 1167 gsi_move_before (&gsi_from, &gsi);
8eaa0f34
ZD
1168 }
1169
1170 /* Emit the statement to compute min/max. */
1171 result = duplicate_ssa_name (PHI_RESULT (phi), NULL);
0d0e4a03 1172 new_stmt = gimple_build_assign (result, minmax, arg0, arg1);
726a989a
RB
1173 gsi = gsi_last_bb (cond_bb);
1174 gsi_insert_before (&gsi, new_stmt, GSI_NEW_STMT);
8eaa0f34 1175
e5206274 1176 replace_phi_edge_with_variable (cond_bb, e1, phi, result);
8eaa0f34
ZD
1177 return true;
1178}
1179
cc52902d
AP
1180/* The function absolute_replacement does the main work of doing the absolute
1181 replacement. Return true if the replacement is done. Otherwise return
1182 false.
1183 bb is the basic block where the replacement is going to be done on. arg0
6c6cfbfd 1184 is argument 0 from the phi. Likewise for arg1. */
80c4ed35 1185
cc52902d 1186static bool
80c4ed35 1187abs_replacement (basic_block cond_bb, basic_block middle_bb,
e5206274 1188 edge e0 ATTRIBUTE_UNUSED, edge e1,
726a989a 1189 gimple phi, tree arg0, tree arg1)
cc52902d
AP
1190{
1191 tree result;
538dd0b7
DM
1192 gassign *new_stmt;
1193 gimple cond;
726a989a 1194 gimple_stmt_iterator gsi;
cc52902d 1195 edge true_edge, false_edge;
726a989a 1196 gimple assign;
cc52902d 1197 edge e;
8eaa0f34 1198 tree rhs, lhs;
cc52902d
AP
1199 bool negate;
1200 enum tree_code cond_code;
1201
1202 /* If the type says honor signed zeros we cannot do this
471854f8 1203 optimization. */
3d3dbadd 1204 if (HONOR_SIGNED_ZEROS (arg1))
cc52902d
AP
1205 return false;
1206
cc52902d
AP
1207 /* OTHER_BLOCK must have only one executable statement which must have the
1208 form arg0 = -arg1 or arg1 = -arg0. */
cc52902d 1209
8eaa0f34 1210 assign = last_and_only_stmt (middle_bb);
cc52902d
AP
1211 /* If we did not find the proper negation assignment, then we can not
1212 optimize. */
1213 if (assign == NULL)
1214 return false;
b8698a0f 1215
8eaa0f34
ZD
1216 /* If we got here, then we have found the only executable statement
1217 in OTHER_BLOCK. If it is anything other than arg = -arg1 or
1218 arg1 = -arg0, then we can not optimize. */
726a989a 1219 if (gimple_code (assign) != GIMPLE_ASSIGN)
8eaa0f34
ZD
1220 return false;
1221
726a989a 1222 lhs = gimple_assign_lhs (assign);
8eaa0f34 1223
726a989a 1224 if (gimple_assign_rhs_code (assign) != NEGATE_EXPR)
8eaa0f34
ZD
1225 return false;
1226
726a989a 1227 rhs = gimple_assign_rhs1 (assign);
b8698a0f 1228
8eaa0f34
ZD
1229 /* The assignment has to be arg0 = -arg1 or arg1 = -arg0. */
1230 if (!(lhs == arg0 && rhs == arg1)
1231 && !(lhs == arg1 && rhs == arg0))
1232 return false;
cc52902d 1233
726a989a 1234 cond = last_stmt (cond_bb);
cc52902d
AP
1235 result = PHI_RESULT (phi);
1236
1237 /* Only relationals comparing arg[01] against zero are interesting. */
726a989a 1238 cond_code = gimple_cond_code (cond);
cc52902d
AP
1239 if (cond_code != GT_EXPR && cond_code != GE_EXPR
1240 && cond_code != LT_EXPR && cond_code != LE_EXPR)
1241 return false;
1242
471854f8 1243 /* Make sure the conditional is arg[01] OP y. */
726a989a 1244 if (gimple_cond_lhs (cond) != rhs)
cc52902d
AP
1245 return false;
1246
726a989a
RB
1247 if (FLOAT_TYPE_P (TREE_TYPE (gimple_cond_rhs (cond)))
1248 ? real_zerop (gimple_cond_rhs (cond))
1249 : integer_zerop (gimple_cond_rhs (cond)))
cc52902d
AP
1250 ;
1251 else
1252 return false;
1253
1254 /* We need to know which is the true edge and which is the false
1255 edge so that we know if have abs or negative abs. */
80c4ed35 1256 extract_true_false_edges_from_block (cond_bb, &true_edge, &false_edge);
cc52902d
AP
1257
1258 /* For GT_EXPR/GE_EXPR, if the true edge goes to OTHER_BLOCK, then we
1259 will need to negate the result. Similarly for LT_EXPR/LE_EXPR if
1260 the false edge goes to OTHER_BLOCK. */
1261 if (cond_code == GT_EXPR || cond_code == GE_EXPR)
1262 e = true_edge;
1263 else
1264 e = false_edge;
0385f644 1265
80c4ed35 1266 if (e->dest == middle_bb)
cc52902d
AP
1267 negate = true;
1268 else
1269 negate = false;
0385f644 1270
80c4ed35 1271 result = duplicate_ssa_name (result, NULL);
0385f644 1272
cc52902d 1273 if (negate)
b731b390 1274 lhs = make_ssa_name (TREE_TYPE (result));
cc52902d
AP
1275 else
1276 lhs = result;
1277
471854f8 1278 /* Build the modify expression with abs expression. */
0d0e4a03 1279 new_stmt = gimple_build_assign (lhs, ABS_EXPR, rhs);
cc52902d 1280
726a989a
RB
1281 gsi = gsi_last_bb (cond_bb);
1282 gsi_insert_before (&gsi, new_stmt, GSI_NEW_STMT);
cc52902d
AP
1283
1284 if (negate)
1285 {
726a989a 1286 /* Get the right GSI. We want to insert after the recently
cc52902d
AP
1287 added ABS_EXPR statement (which we know is the first statement
1288 in the block. */
0d0e4a03 1289 new_stmt = gimple_build_assign (result, NEGATE_EXPR, lhs);
cc52902d 1290
726a989a 1291 gsi_insert_after (&gsi, new_stmt, GSI_NEW_STMT);
cc52902d 1292 }
0385f644 1293
e5206274 1294 replace_phi_edge_with_variable (cond_bb, e1, phi, result);
cc52902d
AP
1295
1296 /* Note that we optimized this PHI. */
1297 return true;
1298}
1299
a5828d1e
MM
1300/* Auxiliary functions to determine the set of memory accesses which
1301 can't trap because they are preceded by accesses to the same memory
70f34814 1302 portion. We do that for MEM_REFs, so we only need to track
a5828d1e
MM
1303 the SSA_NAME of the pointer indirectly referenced. The algorithm
1304 simply is a walk over all instructions in dominator order. When
70f34814 1305 we see an MEM_REF we determine if we've already seen a same
a5828d1e 1306 ref anywhere up to the root of the dominator tree. If we do the
e08f02f0 1307 current access can't trap. If we don't see any dominating access
a5828d1e 1308 the current access might trap, but might also make later accesses
e08f02f0
MM
1309 non-trapping, so we remember it. We need to be careful with loads
1310 or stores, for instance a load might not trap, while a store would,
1311 so if we see a dominating read access this doesn't mean that a later
1312 write access would not trap. Hence we also need to differentiate the
1313 type of access(es) seen.
1314
1315 ??? We currently are very conservative and assume that a load might
1316 trap even if a store doesn't (write-only memory). This probably is
1317 overly conservative. */
a5828d1e 1318
70f34814 1319/* A hash-table of SSA_NAMEs, and in which basic block an MEM_REF
a5828d1e
MM
1320 through it was seen, which would constitute a no-trap region for
1321 same accesses. */
1322struct name_to_bb
1323{
69ef9a79 1324 unsigned int ssa_name_ver;
c1ca73d8 1325 unsigned int phase;
69ef9a79
JJ
1326 bool store;
1327 HOST_WIDE_INT offset, size;
a5828d1e
MM
1328 basic_block bb;
1329};
1330
4a8fb1a1
LC
1331/* Hashtable helpers. */
1332
1333struct ssa_names_hasher : typed_free_remove <name_to_bb>
1334{
67f58944
TS
1335 typedef name_to_bb *value_type;
1336 typedef name_to_bb *compare_type;
1337 static inline hashval_t hash (const name_to_bb *);
1338 static inline bool equal (const name_to_bb *, const name_to_bb *);
4a8fb1a1 1339};
a5828d1e 1340
c1ca73d8
MM
1341/* Used for quick clearing of the hash-table when we see calls.
1342 Hash entries with phase < nt_call_phase are invalid. */
1343static unsigned int nt_call_phase;
1344
69ef9a79 1345/* The hash function. */
4a8fb1a1
LC
1346
1347inline hashval_t
67f58944 1348ssa_names_hasher::hash (const name_to_bb *n)
a5828d1e 1349{
69ef9a79
JJ
1350 return n->ssa_name_ver ^ (((hashval_t) n->store) << 31)
1351 ^ (n->offset << 6) ^ (n->size << 3);
a5828d1e
MM
1352}
1353
69ef9a79 1354/* The equality function of *P1 and *P2. */
a5828d1e 1355
4a8fb1a1 1356inline bool
67f58944 1357ssa_names_hasher::equal (const name_to_bb *n1, const name_to_bb *n2)
4a8fb1a1 1358{
69ef9a79
JJ
1359 return n1->ssa_name_ver == n2->ssa_name_ver
1360 && n1->store == n2->store
1361 && n1->offset == n2->offset
1362 && n1->size == n2->size;
a5828d1e
MM
1363}
1364
c203e8a7
TS
1365class nontrapping_dom_walker : public dom_walker
1366{
1367public:
6e2830c3 1368 nontrapping_dom_walker (cdi_direction direction, hash_set<tree> *ps)
c203e8a7
TS
1369 : dom_walker (direction), m_nontrapping (ps), m_seen_ssa_names (128) {}
1370
1371 virtual void before_dom_children (basic_block);
1372 virtual void after_dom_children (basic_block);
1373
1374private:
1375
1376 /* We see the expression EXP in basic block BB. If it's an interesting
1377 expression (an MEM_REF through an SSA_NAME) possibly insert the
1378 expression into the set NONTRAP or the hash table of seen expressions.
1379 STORE is true if this expression is on the LHS, otherwise it's on
1380 the RHS. */
1381 void add_or_mark_expr (basic_block, tree, bool);
1382
6e2830c3 1383 hash_set<tree> *m_nontrapping;
c203e8a7
TS
1384
1385 /* The hash table for remembering what we've seen. */
1386 hash_table<ssa_names_hasher> m_seen_ssa_names;
1387};
1388
1389/* Called by walk_dominator_tree, when entering the block BB. */
1390void
1391nontrapping_dom_walker::before_dom_children (basic_block bb)
1392{
1393 edge e;
1394 edge_iterator ei;
1395 gimple_stmt_iterator gsi;
1396
1397 /* If we haven't seen all our predecessors, clear the hash-table. */
1398 FOR_EACH_EDGE (e, ei, bb->preds)
1399 if ((((size_t)e->src->aux) & 2) == 0)
1400 {
1401 nt_call_phase++;
1402 break;
1403 }
1404
1405 /* Mark this BB as being on the path to dominator root and as visited. */
1406 bb->aux = (void*)(1 | 2);
1407
1408 /* And walk the statements in order. */
1409 for (gsi = gsi_start_bb (bb); !gsi_end_p (gsi); gsi_next (&gsi))
1410 {
1411 gimple stmt = gsi_stmt (gsi);
1412
1413 if (is_gimple_call (stmt) && !nonfreeing_call_p (stmt))
1414 nt_call_phase++;
1415 else if (gimple_assign_single_p (stmt) && !gimple_has_volatile_ops (stmt))
1416 {
1417 add_or_mark_expr (bb, gimple_assign_lhs (stmt), true);
1418 add_or_mark_expr (bb, gimple_assign_rhs1 (stmt), false);
1419 }
1420 }
1421}
1422
1423/* Called by walk_dominator_tree, when basic block BB is exited. */
1424void
1425nontrapping_dom_walker::after_dom_children (basic_block bb)
1426{
1427 /* This BB isn't on the path to dominator root anymore. */
1428 bb->aux = (void*)2;
1429}
4a8fb1a1 1430
fa10beec 1431/* We see the expression EXP in basic block BB. If it's an interesting
70f34814 1432 expression (an MEM_REF through an SSA_NAME) possibly insert the
e08f02f0
MM
1433 expression into the set NONTRAP or the hash table of seen expressions.
1434 STORE is true if this expression is on the LHS, otherwise it's on
1435 the RHS. */
c203e8a7
TS
1436void
1437nontrapping_dom_walker::add_or_mark_expr (basic_block bb, tree exp, bool store)
a5828d1e 1438{
69ef9a79
JJ
1439 HOST_WIDE_INT size;
1440
70f34814 1441 if (TREE_CODE (exp) == MEM_REF
69ef9a79 1442 && TREE_CODE (TREE_OPERAND (exp, 0)) == SSA_NAME
9541ffee 1443 && tree_fits_shwi_p (TREE_OPERAND (exp, 1))
69ef9a79 1444 && (size = int_size_in_bytes (TREE_TYPE (exp))) > 0)
a5828d1e
MM
1445 {
1446 tree name = TREE_OPERAND (exp, 0);
1447 struct name_to_bb map;
4a8fb1a1 1448 name_to_bb **slot;
e08f02f0 1449 struct name_to_bb *n2bb;
a5828d1e
MM
1450 basic_block found_bb = 0;
1451
70f34814 1452 /* Try to find the last seen MEM_REF through the same
a5828d1e 1453 SSA_NAME, which can trap. */
69ef9a79 1454 map.ssa_name_ver = SSA_NAME_VERSION (name);
c1ca73d8 1455 map.phase = 0;
a5828d1e 1456 map.bb = 0;
e08f02f0 1457 map.store = store;
9439e9a1 1458 map.offset = tree_to_shwi (TREE_OPERAND (exp, 1));
69ef9a79
JJ
1459 map.size = size;
1460
c203e8a7 1461 slot = m_seen_ssa_names.find_slot (&map, INSERT);
4a8fb1a1 1462 n2bb = *slot;
c1ca73d8 1463 if (n2bb && n2bb->phase >= nt_call_phase)
e08f02f0 1464 found_bb = n2bb->bb;
a5828d1e 1465
70f34814 1466 /* If we've found a trapping MEM_REF, _and_ it dominates EXP
a5828d1e
MM
1467 (it's in a basic block on the path from us to the dominator root)
1468 then we can't trap. */
c1ca73d8 1469 if (found_bb && (((size_t)found_bb->aux) & 1) == 1)
a5828d1e 1470 {
6e2830c3 1471 m_nontrapping->add (exp);
a5828d1e
MM
1472 }
1473 else
1474 {
1475 /* EXP might trap, so insert it into the hash table. */
e08f02f0 1476 if (n2bb)
a5828d1e 1477 {
c1ca73d8 1478 n2bb->phase = nt_call_phase;
e08f02f0 1479 n2bb->bb = bb;
a5828d1e
MM
1480 }
1481 else
1482 {
e08f02f0 1483 n2bb = XNEW (struct name_to_bb);
69ef9a79 1484 n2bb->ssa_name_ver = SSA_NAME_VERSION (name);
c1ca73d8 1485 n2bb->phase = nt_call_phase;
e08f02f0
MM
1486 n2bb->bb = bb;
1487 n2bb->store = store;
69ef9a79
JJ
1488 n2bb->offset = map.offset;
1489 n2bb->size = size;
e08f02f0 1490 *slot = n2bb;
a5828d1e
MM
1491 }
1492 }
1493 }
1494}
1495
a5828d1e
MM
1496/* This is the entry point of gathering non trapping memory accesses.
1497 It will do a dominator walk over the whole function, and it will
1498 make use of the bb->aux pointers. It returns a set of trees
70f34814 1499 (the MEM_REFs itself) which can't trap. */
6e2830c3 1500static hash_set<tree> *
a5828d1e
MM
1501get_non_trapping (void)
1502{
c1ca73d8 1503 nt_call_phase = 0;
6e2830c3 1504 hash_set<tree> *nontrap = new hash_set<tree>;
a5828d1e
MM
1505 /* We're going to do a dominator walk, so ensure that we have
1506 dominance information. */
1507 calculate_dominance_info (CDI_DOMINATORS);
1508
4d9192b5
TS
1509 nontrapping_dom_walker (CDI_DOMINATORS, nontrap)
1510 .walk (cfun->cfg->x_entry_block_ptr);
1511
c1ca73d8 1512 clear_aux_for_blocks ();
a5828d1e
MM
1513 return nontrap;
1514}
1515
1516/* Do the main work of conditional store replacement. We already know
1517 that the recognized pattern looks like so:
1518
1519 split:
1520 if (cond) goto MIDDLE_BB; else goto JOIN_BB (edge E1)
1521 MIDDLE_BB:
1522 something
1523 fallthrough (edge E0)
1524 JOIN_BB:
1525 some more
1526
1527 We check that MIDDLE_BB contains only one store, that that store
1528 doesn't trap (not via NOTRAP, but via checking if an access to the same
1529 memory location dominates us) and that the store has a "simple" RHS. */
1530
1531static bool
1532cond_store_replacement (basic_block middle_bb, basic_block join_bb,
6e2830c3 1533 edge e0, edge e1, hash_set<tree> *nontrap)
a5828d1e 1534{
726a989a 1535 gimple assign = last_and_only_stmt (middle_bb);
83d5977e 1536 tree lhs, rhs, name, name2;
538dd0b7
DM
1537 gphi *newphi;
1538 gassign *new_stmt;
726a989a 1539 gimple_stmt_iterator gsi;
f5045c96 1540 source_location locus;
a5828d1e
MM
1541
1542 /* Check if middle_bb contains of only one store. */
1543 if (!assign
d7fa6ee2
JJ
1544 || !gimple_assign_single_p (assign)
1545 || gimple_has_volatile_ops (assign))
a5828d1e
MM
1546 return false;
1547
f5045c96 1548 locus = gimple_location (assign);
726a989a
RB
1549 lhs = gimple_assign_lhs (assign);
1550 rhs = gimple_assign_rhs1 (assign);
70f34814 1551 if (TREE_CODE (lhs) != MEM_REF
23782cc3 1552 || TREE_CODE (TREE_OPERAND (lhs, 0)) != SSA_NAME
742d143c 1553 || !is_gimple_reg_type (TREE_TYPE (lhs)))
a5828d1e 1554 return false;
23782cc3 1555
a5828d1e
MM
1556 /* Prove that we can move the store down. We could also check
1557 TREE_THIS_NOTRAP here, but in that case we also could move stores,
1558 whose value is not available readily, which we want to avoid. */
6e2830c3 1559 if (!nontrap->contains (lhs))
a5828d1e
MM
1560 return false;
1561
1562 /* Now we've checked the constraints, so do the transformation:
1563 1) Remove the single store. */
726a989a 1564 gsi = gsi_for_stmt (assign);
742d143c 1565 unlink_stmt_vdef (assign);
726a989a 1566 gsi_remove (&gsi, true);
23782cc3 1567 release_defs (assign);
a5828d1e 1568
83d5977e 1569 /* 2) Insert a load from the memory of the store to the temporary
a5828d1e
MM
1570 on the edge which did not contain the store. */
1571 lhs = unshare_expr (lhs);
83d5977e
RG
1572 name = make_temp_ssa_name (TREE_TYPE (lhs), NULL, "cstore");
1573 new_stmt = gimple_build_assign (name, lhs);
f5045c96 1574 gimple_set_location (new_stmt, locus);
726a989a 1575 gsi_insert_on_edge (e1, new_stmt);
a5828d1e 1576
83d5977e 1577 /* 3) Create a PHI node at the join block, with one argument
a5828d1e
MM
1578 holding the old RHS, and the other holding the temporary
1579 where we stored the old memory contents. */
83d5977e
RG
1580 name2 = make_temp_ssa_name (TREE_TYPE (lhs), NULL, "cstore");
1581 newphi = create_phi_node (name2, join_bb);
9e227d60
DC
1582 add_phi_arg (newphi, rhs, e0, locus);
1583 add_phi_arg (newphi, name, e1, locus);
a5828d1e
MM
1584
1585 lhs = unshare_expr (lhs);
726a989a 1586 new_stmt = gimple_build_assign (lhs, PHI_RESULT (newphi));
a5828d1e 1587
83d5977e 1588 /* 4) Insert that PHI node. */
726a989a
RB
1589 gsi = gsi_after_labels (join_bb);
1590 if (gsi_end_p (gsi))
a5828d1e 1591 {
726a989a
RB
1592 gsi = gsi_last_bb (join_bb);
1593 gsi_insert_after (&gsi, new_stmt, GSI_NEW_STMT);
a5828d1e
MM
1594 }
1595 else
726a989a 1596 gsi_insert_before (&gsi, new_stmt, GSI_NEW_STMT);
a5828d1e
MM
1597
1598 return true;
1599}
6de9cd9a 1600
bfe068c3 1601/* Do the main work of conditional store replacement. */
23782cc3
JJ
1602
1603static bool
bfe068c3
IR
1604cond_if_else_store_replacement_1 (basic_block then_bb, basic_block else_bb,
1605 basic_block join_bb, gimple then_assign,
1606 gimple else_assign)
23782cc3 1607{
83d5977e 1608 tree lhs_base, lhs, then_rhs, else_rhs, name;
23782cc3
JJ
1609 source_location then_locus, else_locus;
1610 gimple_stmt_iterator gsi;
538dd0b7
DM
1611 gphi *newphi;
1612 gassign *new_stmt;
23782cc3 1613
23782cc3
JJ
1614 if (then_assign == NULL
1615 || !gimple_assign_single_p (then_assign)
47598145 1616 || gimple_clobber_p (then_assign)
d7fa6ee2 1617 || gimple_has_volatile_ops (then_assign)
23782cc3 1618 || else_assign == NULL
47598145 1619 || !gimple_assign_single_p (else_assign)
d7fa6ee2
JJ
1620 || gimple_clobber_p (else_assign)
1621 || gimple_has_volatile_ops (else_assign))
23782cc3
JJ
1622 return false;
1623
1624 lhs = gimple_assign_lhs (then_assign);
1625 if (!is_gimple_reg_type (TREE_TYPE (lhs))
1626 || !operand_equal_p (lhs, gimple_assign_lhs (else_assign), 0))
1627 return false;
1628
1629 lhs_base = get_base_address (lhs);
1630 if (lhs_base == NULL_TREE
1631 || (!DECL_P (lhs_base) && TREE_CODE (lhs_base) != MEM_REF))
1632 return false;
1633
1634 then_rhs = gimple_assign_rhs1 (then_assign);
1635 else_rhs = gimple_assign_rhs1 (else_assign);
1636 then_locus = gimple_location (then_assign);
1637 else_locus = gimple_location (else_assign);
1638
1639 /* Now we've checked the constraints, so do the transformation:
1640 1) Remove the stores. */
1641 gsi = gsi_for_stmt (then_assign);
1642 unlink_stmt_vdef (then_assign);
1643 gsi_remove (&gsi, true);
1644 release_defs (then_assign);
1645
1646 gsi = gsi_for_stmt (else_assign);
1647 unlink_stmt_vdef (else_assign);
1648 gsi_remove (&gsi, true);
1649 release_defs (else_assign);
1650
83d5977e 1651 /* 2) Create a PHI node at the join block, with one argument
23782cc3
JJ
1652 holding the old RHS, and the other holding the temporary
1653 where we stored the old memory contents. */
83d5977e
RG
1654 name = make_temp_ssa_name (TREE_TYPE (lhs), NULL, "cstore");
1655 newphi = create_phi_node (name, join_bb);
9e227d60
DC
1656 add_phi_arg (newphi, then_rhs, EDGE_SUCC (then_bb, 0), then_locus);
1657 add_phi_arg (newphi, else_rhs, EDGE_SUCC (else_bb, 0), else_locus);
23782cc3
JJ
1658
1659 new_stmt = gimple_build_assign (lhs, PHI_RESULT (newphi));
1660
83d5977e 1661 /* 3) Insert that PHI node. */
23782cc3
JJ
1662 gsi = gsi_after_labels (join_bb);
1663 if (gsi_end_p (gsi))
1664 {
1665 gsi = gsi_last_bb (join_bb);
1666 gsi_insert_after (&gsi, new_stmt, GSI_NEW_STMT);
1667 }
1668 else
1669 gsi_insert_before (&gsi, new_stmt, GSI_NEW_STMT);
1670
1671 return true;
1672}
1673
bfe068c3
IR
1674/* Conditional store replacement. We already know
1675 that the recognized pattern looks like so:
1676
1677 split:
1678 if (cond) goto THEN_BB; else goto ELSE_BB (edge E1)
1679 THEN_BB:
1680 ...
1681 X = Y;
1682 ...
1683 goto JOIN_BB;
1684 ELSE_BB:
1685 ...
1686 X = Z;
1687 ...
1688 fallthrough (edge E0)
1689 JOIN_BB:
1690 some more
1691
1692 We check that it is safe to sink the store to JOIN_BB by verifying that
1693 there are no read-after-write or write-after-write dependencies in
1694 THEN_BB and ELSE_BB. */
1695
1696static bool
1697cond_if_else_store_replacement (basic_block then_bb, basic_block else_bb,
1698 basic_block join_bb)
1699{
1700 gimple then_assign = last_and_only_stmt (then_bb);
1701 gimple else_assign = last_and_only_stmt (else_bb);
9771b263
DN
1702 vec<data_reference_p> then_datarefs, else_datarefs;
1703 vec<ddr_p> then_ddrs, else_ddrs;
bfe068c3
IR
1704 gimple then_store, else_store;
1705 bool found, ok = false, res;
1706 struct data_dependence_relation *ddr;
1707 data_reference_p then_dr, else_dr;
1708 int i, j;
1709 tree then_lhs, else_lhs;
bfe068c3
IR
1710 basic_block blocks[3];
1711
1712 if (MAX_STORES_TO_SINK == 0)
1713 return false;
1714
1715 /* Handle the case with single statement in THEN_BB and ELSE_BB. */
1716 if (then_assign && else_assign)
1717 return cond_if_else_store_replacement_1 (then_bb, else_bb, join_bb,
1718 then_assign, else_assign);
1719
1720 /* Find data references. */
9771b263
DN
1721 then_datarefs.create (1);
1722 else_datarefs.create (1);
bfe068c3
IR
1723 if ((find_data_references_in_bb (NULL, then_bb, &then_datarefs)
1724 == chrec_dont_know)
9771b263 1725 || !then_datarefs.length ()
bfe068c3 1726 || (find_data_references_in_bb (NULL, else_bb, &else_datarefs)
5ce9450f 1727 == chrec_dont_know)
9771b263 1728 || !else_datarefs.length ())
bfe068c3
IR
1729 {
1730 free_data_refs (then_datarefs);
1731 free_data_refs (else_datarefs);
1732 return false;
1733 }
1734
1735 /* Find pairs of stores with equal LHS. */
00f96dc9 1736 auto_vec<gimple, 1> then_stores, else_stores;
9771b263 1737 FOR_EACH_VEC_ELT (then_datarefs, i, then_dr)
bfe068c3
IR
1738 {
1739 if (DR_IS_READ (then_dr))
1740 continue;
1741
1742 then_store = DR_STMT (then_dr);
59daeef4 1743 then_lhs = gimple_get_lhs (then_store);
5ce9450f
JJ
1744 if (then_lhs == NULL_TREE)
1745 continue;
bfe068c3
IR
1746 found = false;
1747
9771b263 1748 FOR_EACH_VEC_ELT (else_datarefs, j, else_dr)
bfe068c3
IR
1749 {
1750 if (DR_IS_READ (else_dr))
1751 continue;
1752
1753 else_store = DR_STMT (else_dr);
59daeef4 1754 else_lhs = gimple_get_lhs (else_store);
5ce9450f
JJ
1755 if (else_lhs == NULL_TREE)
1756 continue;
bfe068c3
IR
1757
1758 if (operand_equal_p (then_lhs, else_lhs, 0))
1759 {
1760 found = true;
1761 break;
1762 }
1763 }
1764
1765 if (!found)
1766 continue;
1767
9771b263
DN
1768 then_stores.safe_push (then_store);
1769 else_stores.safe_push (else_store);
bfe068c3
IR
1770 }
1771
1772 /* No pairs of stores found. */
9771b263
DN
1773 if (!then_stores.length ()
1774 || then_stores.length () > (unsigned) MAX_STORES_TO_SINK)
bfe068c3
IR
1775 {
1776 free_data_refs (then_datarefs);
1777 free_data_refs (else_datarefs);
bfe068c3
IR
1778 return false;
1779 }
1780
1781 /* Compute and check data dependencies in both basic blocks. */
9771b263
DN
1782 then_ddrs.create (1);
1783 else_ddrs.create (1);
1784 if (!compute_all_dependences (then_datarefs, &then_ddrs,
6e1aa848 1785 vNULL, false)
9771b263 1786 || !compute_all_dependences (else_datarefs, &else_ddrs,
6e1aa848 1787 vNULL, false))
795e8869
JJ
1788 {
1789 free_dependence_relations (then_ddrs);
1790 free_dependence_relations (else_ddrs);
1791 free_data_refs (then_datarefs);
1792 free_data_refs (else_datarefs);
795e8869
JJ
1793 return false;
1794 }
bfe068c3
IR
1795 blocks[0] = then_bb;
1796 blocks[1] = else_bb;
1797 blocks[2] = join_bb;
1798 renumber_gimple_stmt_uids_in_blocks (blocks, 3);
1799
1800 /* Check that there are no read-after-write or write-after-write dependencies
1801 in THEN_BB. */
9771b263 1802 FOR_EACH_VEC_ELT (then_ddrs, i, ddr)
bfe068c3
IR
1803 {
1804 struct data_reference *dra = DDR_A (ddr);
1805 struct data_reference *drb = DDR_B (ddr);
1806
1807 if (DDR_ARE_DEPENDENT (ddr) != chrec_known
1808 && ((DR_IS_READ (dra) && DR_IS_WRITE (drb)
1809 && gimple_uid (DR_STMT (dra)) > gimple_uid (DR_STMT (drb)))
1810 || (DR_IS_READ (drb) && DR_IS_WRITE (dra)
1811 && gimple_uid (DR_STMT (drb)) > gimple_uid (DR_STMT (dra)))
1812 || (DR_IS_WRITE (dra) && DR_IS_WRITE (drb))))
1813 {
1814 free_dependence_relations (then_ddrs);
1815 free_dependence_relations (else_ddrs);
dbaa912c
RG
1816 free_data_refs (then_datarefs);
1817 free_data_refs (else_datarefs);
bfe068c3
IR
1818 return false;
1819 }
1820 }
1821
1822 /* Check that there are no read-after-write or write-after-write dependencies
1823 in ELSE_BB. */
9771b263 1824 FOR_EACH_VEC_ELT (else_ddrs, i, ddr)
bfe068c3
IR
1825 {
1826 struct data_reference *dra = DDR_A (ddr);
1827 struct data_reference *drb = DDR_B (ddr);
1828
1829 if (DDR_ARE_DEPENDENT (ddr) != chrec_known
1830 && ((DR_IS_READ (dra) && DR_IS_WRITE (drb)
1831 && gimple_uid (DR_STMT (dra)) > gimple_uid (DR_STMT (drb)))
1832 || (DR_IS_READ (drb) && DR_IS_WRITE (dra)
1833 && gimple_uid (DR_STMT (drb)) > gimple_uid (DR_STMT (dra)))
1834 || (DR_IS_WRITE (dra) && DR_IS_WRITE (drb))))
1835 {
1836 free_dependence_relations (then_ddrs);
1837 free_dependence_relations (else_ddrs);
dbaa912c
RG
1838 free_data_refs (then_datarefs);
1839 free_data_refs (else_datarefs);
bfe068c3
IR
1840 return false;
1841 }
1842 }
1843
1844 /* Sink stores with same LHS. */
9771b263 1845 FOR_EACH_VEC_ELT (then_stores, i, then_store)
bfe068c3 1846 {
9771b263 1847 else_store = else_stores[i];
bfe068c3
IR
1848 res = cond_if_else_store_replacement_1 (then_bb, else_bb, join_bb,
1849 then_store, else_store);
1850 ok = ok || res;
1851 }
1852
1853 free_dependence_relations (then_ddrs);
1854 free_dependence_relations (else_ddrs);
dbaa912c
RG
1855 free_data_refs (then_datarefs);
1856 free_data_refs (else_datarefs);
bfe068c3
IR
1857
1858 return ok;
1859}
1860
372a6eb8
BS
1861/* Return TRUE if STMT has a VUSE whose corresponding VDEF is in BB. */
1862
1863static bool
1864local_mem_dependence (gimple stmt, basic_block bb)
1865{
1866 tree vuse = gimple_vuse (stmt);
1867 gimple def;
1868
1869 if (!vuse)
1870 return false;
1871
1872 def = SSA_NAME_DEF_STMT (vuse);
1873 return (def && gimple_bb (def) == bb);
1874}
1875
1876/* Given a "diamond" control-flow pattern where BB0 tests a condition,
1877 BB1 and BB2 are "then" and "else" blocks dependent on this test,
c9ef86a1 1878 and BB3 rejoins control flow following BB1 and BB2, look for
372a6eb8
BS
1879 opportunities to hoist loads as follows. If BB3 contains a PHI of
1880 two loads, one each occurring in BB1 and BB2, and the loads are
1881 provably of adjacent fields in the same structure, then move both
1882 loads into BB0. Of course this can only be done if there are no
1883 dependencies preventing such motion.
1884
1885 One of the hoisted loads will always be speculative, so the
1886 transformation is currently conservative:
1887
1888 - The fields must be strictly adjacent.
1889 - The two fields must occupy a single memory block that is
1890 guaranteed to not cross a page boundary.
1891
1892 The last is difficult to prove, as such memory blocks should be
1893 aligned on the minimum of the stack alignment boundary and the
1894 alignment guaranteed by heap allocation interfaces. Thus we rely
1895 on a parameter for the alignment value.
1896
1897 Provided a good value is used for the last case, the first
1898 restriction could possibly be relaxed. */
1899
1900static void
1901hoist_adjacent_loads (basic_block bb0, basic_block bb1,
1902 basic_block bb2, basic_block bb3)
1903{
1904 int param_align = PARAM_VALUE (PARAM_L1_CACHE_LINE_SIZE);
1905 unsigned param_align_bits = (unsigned) (param_align * BITS_PER_UNIT);
538dd0b7 1906 gphi_iterator gsi;
372a6eb8
BS
1907
1908 /* Walk the phis in bb3 looking for an opportunity. We are looking
1909 for phis of two SSA names, one each of which is defined in bb1 and
1910 bb2. */
1911 for (gsi = gsi_start_phis (bb3); !gsi_end_p (gsi); gsi_next (&gsi))
1912 {
538dd0b7 1913 gphi *phi_stmt = gsi.phi ();
372a6eb8
BS
1914 gimple def1, def2, defswap;
1915 tree arg1, arg2, ref1, ref2, field1, field2, fieldswap;
1916 tree tree_offset1, tree_offset2, tree_size2, next;
1917 int offset1, offset2, size2;
1918 unsigned align1;
1919 gimple_stmt_iterator gsi2;
1920 basic_block bb_for_def1, bb_for_def2;
1921
ea057359
RG
1922 if (gimple_phi_num_args (phi_stmt) != 2
1923 || virtual_operand_p (gimple_phi_result (phi_stmt)))
372a6eb8
BS
1924 continue;
1925
1926 arg1 = gimple_phi_arg_def (phi_stmt, 0);
1927 arg2 = gimple_phi_arg_def (phi_stmt, 1);
c9ef86a1 1928
372a6eb8
BS
1929 if (TREE_CODE (arg1) != SSA_NAME
1930 || TREE_CODE (arg2) != SSA_NAME
1931 || SSA_NAME_IS_DEFAULT_DEF (arg1)
ea057359 1932 || SSA_NAME_IS_DEFAULT_DEF (arg2))
372a6eb8
BS
1933 continue;
1934
1935 def1 = SSA_NAME_DEF_STMT (arg1);
1936 def2 = SSA_NAME_DEF_STMT (arg2);
1937
1938 if ((gimple_bb (def1) != bb1 || gimple_bb (def2) != bb2)
1939 && (gimple_bb (def2) != bb1 || gimple_bb (def1) != bb2))
1940 continue;
1941
1942 /* Check the mode of the arguments to be sure a conditional move
1943 can be generated for it. */
0a5f2683
BS
1944 if (optab_handler (movcc_optab, TYPE_MODE (TREE_TYPE (arg1)))
1945 == CODE_FOR_nothing)
372a6eb8
BS
1946 continue;
1947
1948 /* Both statements must be assignments whose RHS is a COMPONENT_REF. */
1949 if (!gimple_assign_single_p (def1)
d7fa6ee2
JJ
1950 || !gimple_assign_single_p (def2)
1951 || gimple_has_volatile_ops (def1)
1952 || gimple_has_volatile_ops (def2))
372a6eb8
BS
1953 continue;
1954
1955 ref1 = gimple_assign_rhs1 (def1);
1956 ref2 = gimple_assign_rhs1 (def2);
1957
1958 if (TREE_CODE (ref1) != COMPONENT_REF
1959 || TREE_CODE (ref2) != COMPONENT_REF)
1960 continue;
1961
1962 /* The zeroth operand of the two component references must be
1963 identical. It is not sufficient to compare get_base_address of
1964 the two references, because this could allow for different
1965 elements of the same array in the two trees. It is not safe to
1966 assume that the existence of one array element implies the
1967 existence of a different one. */
1968 if (!operand_equal_p (TREE_OPERAND (ref1, 0), TREE_OPERAND (ref2, 0), 0))
1969 continue;
1970
1971 field1 = TREE_OPERAND (ref1, 1);
1972 field2 = TREE_OPERAND (ref2, 1);
1973
1974 /* Check for field adjacency, and ensure field1 comes first. */
1975 for (next = DECL_CHAIN (field1);
1976 next && TREE_CODE (next) != FIELD_DECL;
1977 next = DECL_CHAIN (next))
1978 ;
1979
1980 if (next != field2)
1981 {
1982 for (next = DECL_CHAIN (field2);
1983 next && TREE_CODE (next) != FIELD_DECL;
1984 next = DECL_CHAIN (next))
1985 ;
1986
1987 if (next != field1)
1988 continue;
1989
1990 fieldswap = field1;
1991 field1 = field2;
1992 field2 = fieldswap;
1993 defswap = def1;
1994 def1 = def2;
1995 def2 = defswap;
372a6eb8
BS
1996 }
1997
9b10be32
BS
1998 bb_for_def1 = gimple_bb (def1);
1999 bb_for_def2 = gimple_bb (def2);
2000
372a6eb8
BS
2001 /* Check for proper alignment of the first field. */
2002 tree_offset1 = bit_position (field1);
2003 tree_offset2 = bit_position (field2);
2004 tree_size2 = DECL_SIZE (field2);
2005
cc269bb6
RS
2006 if (!tree_fits_uhwi_p (tree_offset1)
2007 || !tree_fits_uhwi_p (tree_offset2)
2008 || !tree_fits_uhwi_p (tree_size2))
372a6eb8
BS
2009 continue;
2010
eb1ce453
KZ
2011 offset1 = tree_to_uhwi (tree_offset1);
2012 offset2 = tree_to_uhwi (tree_offset2);
2013 size2 = tree_to_uhwi (tree_size2);
372a6eb8
BS
2014 align1 = DECL_ALIGN (field1) % param_align_bits;
2015
2016 if (offset1 % BITS_PER_UNIT != 0)
2017 continue;
2018
2019 /* For profitability, the two field references should fit within
2020 a single cache line. */
2021 if (align1 + offset2 - offset1 + size2 > param_align_bits)
2022 continue;
2023
2024 /* The two expressions cannot be dependent upon vdefs defined
2025 in bb1/bb2. */
2026 if (local_mem_dependence (def1, bb_for_def1)
2027 || local_mem_dependence (def2, bb_for_def2))
2028 continue;
2029
2030 /* The conditions are satisfied; hoist the loads from bb1 and bb2 into
2031 bb0. We hoist the first one first so that a cache miss is handled
2032 efficiently regardless of hardware cache-fill policy. */
2033 gsi2 = gsi_for_stmt (def1);
2034 gsi_move_to_bb_end (&gsi2, bb0);
2035 gsi2 = gsi_for_stmt (def2);
2036 gsi_move_to_bb_end (&gsi2, bb0);
2037
2038 if (dump_file && (dump_flags & TDF_DETAILS))
2039 {
2040 fprintf (dump_file,
2041 "\nHoisting adjacent loads from %d and %d into %d: \n",
2042 bb_for_def1->index, bb_for_def2->index, bb0->index);
2043 print_gimple_stmt (dump_file, def1, 0, TDF_VOPS|TDF_MEMSYMS);
2044 print_gimple_stmt (dump_file, def2, 0, TDF_VOPS|TDF_MEMSYMS);
2045 }
2046 }
2047}
2048
2049/* Determine whether we should attempt to hoist adjacent loads out of
2050 diamond patterns in pass_phiopt. Always hoist loads if
2051 -fhoist-adjacent-loads is specified and the target machine has
7ef58a1a 2052 both a conditional move instruction and a defined cache line size. */
372a6eb8
BS
2053
2054static bool
2055gate_hoist_loads (void)
2056{
7ef58a1a
BS
2057 return (flag_hoist_adjacent_loads == 1
2058 && PARAM_VALUE (PARAM_L1_CACHE_LINE_SIZE)
2059 && HAVE_conditional_move);
372a6eb8
BS
2060}
2061
be55bfe6
TS
2062/* This pass tries to replaces an if-then-else block with an
2063 assignment. We have four kinds of transformations. Some of these
2064 transformations are also performed by the ifcvt RTL optimizer.
2065
2066 Conditional Replacement
2067 -----------------------
2068
2069 This transformation, implemented in conditional_replacement,
2070 replaces
2071
2072 bb0:
2073 if (cond) goto bb2; else goto bb1;
2074 bb1:
2075 bb2:
2076 x = PHI <0 (bb1), 1 (bb0), ...>;
2077
2078 with
2079
2080 bb0:
2081 x' = cond;
2082 goto bb2;
2083 bb2:
2084 x = PHI <x' (bb0), ...>;
2085
2086 We remove bb1 as it becomes unreachable. This occurs often due to
2087 gimplification of conditionals.
2088
2089 Value Replacement
2090 -----------------
2091
2092 This transformation, implemented in value_replacement, replaces
2093
2094 bb0:
2095 if (a != b) goto bb2; else goto bb1;
2096 bb1:
2097 bb2:
2098 x = PHI <a (bb1), b (bb0), ...>;
2099
2100 with
2101
2102 bb0:
2103 bb2:
2104 x = PHI <b (bb0), ...>;
2105
2106 This opportunity can sometimes occur as a result of other
2107 optimizations.
2108
2109
2110 Another case caught by value replacement looks like this:
2111
2112 bb0:
2113 t1 = a == CONST;
2114 t2 = b > c;
2115 t3 = t1 & t2;
2116 if (t3 != 0) goto bb1; else goto bb2;
2117 bb1:
2118 bb2:
2119 x = PHI (CONST, a)
2120
2121 Gets replaced with:
2122 bb0:
2123 bb2:
2124 t1 = a == CONST;
2125 t2 = b > c;
2126 t3 = t1 & t2;
2127 x = a;
2128
2129 ABS Replacement
2130 ---------------
2131
2132 This transformation, implemented in abs_replacement, replaces
2133
2134 bb0:
2135 if (a >= 0) goto bb2; else goto bb1;
2136 bb1:
2137 x = -a;
2138 bb2:
2139 x = PHI <x (bb1), a (bb0), ...>;
2140
2141 with
2142
2143 bb0:
2144 x' = ABS_EXPR< a >;
2145 bb2:
2146 x = PHI <x' (bb0), ...>;
2147
2148 MIN/MAX Replacement
2149 -------------------
2150
2151 This transformation, minmax_replacement replaces
2152
2153 bb0:
2154 if (a <= b) goto bb2; else goto bb1;
2155 bb1:
2156 bb2:
2157 x = PHI <b (bb1), a (bb0), ...>;
2158
2159 with
2160
2161 bb0:
2162 x' = MIN_EXPR (a, b)
2163 bb2:
2164 x = PHI <x' (bb0), ...>;
2165
2166 A similar transformation is done for MAX_EXPR.
2167
2168
2169 This pass also performs a fifth transformation of a slightly different
2170 flavor.
2171
2172 Adjacent Load Hoisting
2173 ----------------------
2174
2175 This transformation replaces
2176
2177 bb0:
2178 if (...) goto bb2; else goto bb1;
2179 bb1:
2180 x1 = (<expr>).field1;
2181 goto bb3;
2182 bb2:
2183 x2 = (<expr>).field2;
2184 bb3:
2185 # x = PHI <x1, x2>;
2186
2187 with
2188
2189 bb0:
2190 x1 = (<expr>).field1;
2191 x2 = (<expr>).field2;
2192 if (...) goto bb2; else goto bb1;
2193 bb1:
2194 goto bb3;
2195 bb2:
2196 bb3:
2197 # x = PHI <x1, x2>;
2198
2199 The purpose of this transformation is to enable generation of conditional
2200 move instructions such as Intel CMOVE or PowerPC ISEL. Because one of
2201 the loads is speculative, the transformation is restricted to very
2202 specific cases to avoid introducing a page fault. We are looking for
2203 the common idiom:
2204
2205 if (...)
2206 x = y->left;
2207 else
2208 x = y->right;
2209
2210 where left and right are typically adjacent pointers in a tree structure. */
0385f644 2211
27a4cd48
DM
2212namespace {
2213
2214const pass_data pass_data_phiopt =
6de9cd9a 2215{
27a4cd48
DM
2216 GIMPLE_PASS, /* type */
2217 "phiopt", /* name */
2218 OPTGROUP_NONE, /* optinfo_flags */
27a4cd48
DM
2219 TV_TREE_PHIOPT, /* tv_id */
2220 ( PROP_cfg | PROP_ssa ), /* properties_required */
2221 0, /* properties_provided */
2222 0, /* properties_destroyed */
2223 0, /* todo_flags_start */
3bea341f 2224 0, /* todo_flags_finish */
6de9cd9a 2225};
a5828d1e 2226
27a4cd48
DM
2227class pass_phiopt : public gimple_opt_pass
2228{
2229public:
c3284718
RS
2230 pass_phiopt (gcc::context *ctxt)
2231 : gimple_opt_pass (pass_data_phiopt, ctxt)
27a4cd48
DM
2232 {}
2233
2234 /* opt_pass methods: */
65d3284b 2235 opt_pass * clone () { return new pass_phiopt (m_ctxt); }
68f6df73 2236 virtual bool gate (function *) { return flag_ssa_phiopt; }
be55bfe6
TS
2237 virtual unsigned int execute (function *)
2238 {
2239 return tree_ssa_phiopt_worker (false, gate_hoist_loads ());
2240 }
27a4cd48
DM
2241
2242}; // class pass_phiopt
2243
2244} // anon namespace
2245
2246gimple_opt_pass *
2247make_pass_phiopt (gcc::context *ctxt)
2248{
2249 return new pass_phiopt (ctxt);
2250}
2251
27a4cd48
DM
2252namespace {
2253
2254const pass_data pass_data_cselim =
a5828d1e 2255{
27a4cd48
DM
2256 GIMPLE_PASS, /* type */
2257 "cselim", /* name */
2258 OPTGROUP_NONE, /* optinfo_flags */
27a4cd48
DM
2259 TV_TREE_PHIOPT, /* tv_id */
2260 ( PROP_cfg | PROP_ssa ), /* properties_required */
2261 0, /* properties_provided */
2262 0, /* properties_destroyed */
2263 0, /* todo_flags_start */
3bea341f 2264 0, /* todo_flags_finish */
a5828d1e 2265};
27a4cd48
DM
2266
2267class pass_cselim : public gimple_opt_pass
2268{
2269public:
c3284718
RS
2270 pass_cselim (gcc::context *ctxt)
2271 : gimple_opt_pass (pass_data_cselim, ctxt)
27a4cd48
DM
2272 {}
2273
2274 /* opt_pass methods: */
1a3d085c 2275 virtual bool gate (function *) { return flag_tree_cselim; }
be55bfe6 2276 virtual unsigned int execute (function *) { return tree_ssa_cs_elim (); }
27a4cd48
DM
2277
2278}; // class pass_cselim
2279
2280} // anon namespace
2281
2282gimple_opt_pass *
2283make_pass_cselim (gcc::context *ctxt)
2284{
2285 return new pass_cselim (ctxt);
2286}