]> git.ipfire.org Git - thirdparty/gcc.git/blame - gcc/tree-ssa-phiopt.c
Eliminate source_location in favor of location_t
[thirdparty/gcc.git] / gcc / tree-ssa-phiopt.c
CommitLineData
6de9cd9a 1/* Optimization of PHI nodes by converting them into straightline code.
85ec4feb 2 Copyright (C) 2004-2018 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"
c7131fb2 23#include "backend.h"
957060b5
AM
24#include "insn-codes.h"
25#include "rtl.h"
6de9cd9a 26#include "tree.h"
c7131fb2 27#include "gimple.h"
957060b5
AM
28#include "cfghooks.h"
29#include "tree-pass.h"
c7131fb2 30#include "ssa.h"
957060b5
AM
31#include "optabs-tree.h"
32#include "insn-config.h"
33#include "gimple-pretty-print.h"
40e23961 34#include "fold-const.h"
d8a2d370 35#include "stor-layout.h"
60393bbc 36#include "cfganal.h"
45b0be94 37#include "gimplify.h"
5be5c238 38#include "gimple-iterator.h"
18f429e2 39#include "gimplify-me.h"
442b4905 40#include "tree-cfg.h"
442b4905 41#include "tree-dfa.h"
a5828d1e 42#include "domwalk.h"
bfe068c3
IR
43#include "cfgloop.h"
44#include "tree-data-ref.h"
a9e0d843 45#include "tree-scalar-evolution.h"
421bf780 46#include "tree-inline.h"
49b8fe6c 47#include "params.h"
58f12ec1 48#include "case-cfn-macros.h"
372a6eb8 49
1cab645d 50static unsigned int tree_ssa_phiopt_worker (bool, bool, bool);
e5206274 51static bool conditional_replacement (basic_block, basic_block,
538dd0b7 52 edge, edge, gphi *, tree, tree);
cfd719e7
JJ
53static gphi *factor_out_conditional_conversion (edge, edge, gphi *, tree, tree,
54 gimple *);
210ac0b7 55static int value_replacement (basic_block, basic_block,
355fe088 56 edge, edge, gimple *, tree, tree);
e5206274 57static bool minmax_replacement (basic_block, basic_block,
355fe088 58 edge, edge, gimple *, tree, tree);
e5206274 59static bool abs_replacement (basic_block, basic_block,
355fe088 60 edge, edge, gimple *, tree, tree);
58f12ec1
KV
61static bool cond_removal_in_popcount_pattern (basic_block, basic_block,
62 edge, edge, gimple *, tree, tree);
a5828d1e 63static bool cond_store_replacement (basic_block, basic_block, edge, edge,
6e2830c3 64 hash_set<tree> *);
23782cc3 65static bool cond_if_else_store_replacement (basic_block, basic_block, basic_block);
6e2830c3 66static hash_set<tree> * get_non_trapping ();
355fe088 67static void replace_phi_edge_with_variable (basic_block, edge, gimple *, tree);
372a6eb8
BS
68static void hoist_adjacent_loads (basic_block, basic_block,
69 basic_block, basic_block);
70static bool gate_hoist_loads (void);
1833df5c 71
a5828d1e
MM
72/* This pass tries to transform conditional stores into unconditional
73 ones, enabling further simplifications with the simpler then and else
74 blocks. In particular it replaces this:
75
76 bb0:
77 if (cond) goto bb2; else goto bb1;
78 bb1:
23782cc3 79 *p = RHS;
a5828d1e
MM
80 bb2:
81
82 with
83
84 bb0:
85 if (cond) goto bb1; else goto bb2;
86 bb1:
87 condtmp' = *p;
88 bb2:
89 condtmp = PHI <RHS, condtmp'>
23782cc3 90 *p = condtmp;
a5828d1e
MM
91
92 This transformation can only be done under several constraints,
23782cc3
JJ
93 documented below. It also replaces:
94
95 bb0:
96 if (cond) goto bb2; else goto bb1;
97 bb1:
98 *p = RHS1;
99 goto bb3;
100 bb2:
101 *p = RHS2;
102 bb3:
103
104 with
105
106 bb0:
107 if (cond) goto bb3; else goto bb1;
108 bb1:
109 bb3:
110 condtmp = PHI <RHS1, RHS2>
111 *p = condtmp; */
a5828d1e
MM
112
113static unsigned int
114tree_ssa_cs_elim (void)
115{
a9e0d843
RB
116 unsigned todo;
117 /* ??? We are not interested in loop related info, but the following
118 will create it, ICEing as we didn't init loops with pre-headers.
119 An interfacing issue of find_data_references_in_bb. */
120 loop_optimizer_init (LOOPS_NORMAL);
121 scev_initialize ();
1cab645d 122 todo = tree_ssa_phiopt_worker (true, false, false);
a9e0d843
RB
123 scev_finalize ();
124 loop_optimizer_finalize ();
125 return todo;
a5828d1e
MM
126}
127
b928d32b
AP
128/* Return the singleton PHI in the SEQ of PHIs for edges E0 and E1. */
129
538dd0b7 130static gphi *
b928d32b
AP
131single_non_singleton_phi_for_edges (gimple_seq seq, edge e0, edge e1)
132{
133 gimple_stmt_iterator i;
538dd0b7 134 gphi *phi = NULL;
b928d32b 135 if (gimple_seq_singleton_p (seq))
538dd0b7 136 return as_a <gphi *> (gsi_stmt (gsi_start (seq)));
b928d32b
AP
137 for (i = gsi_start (seq); !gsi_end_p (i); gsi_next (&i))
138 {
538dd0b7 139 gphi *p = as_a <gphi *> (gsi_stmt (i));
b928d32b
AP
140 /* If the PHI arguments are equal then we can skip this PHI. */
141 if (operand_equal_for_phi_arg_p (gimple_phi_arg_def (p, e0->dest_idx),
142 gimple_phi_arg_def (p, e1->dest_idx)))
143 continue;
144
145 /* If we already have a PHI that has the two edge arguments are
146 different, then return it is not a singleton for these PHIs. */
147 if (phi)
148 return NULL;
149
150 phi = p;
151 }
152 return phi;
153}
154
a5828d1e
MM
155/* The core routine of conditional store replacement and normal
156 phi optimizations. Both share much of the infrastructure in how
157 to match applicable basic block patterns. DO_STORE_ELIM is true
372a6eb8 158 when we want to do conditional store replacement, false otherwise.
c9ef86a1 159 DO_HOIST_LOADS is true when we want to hoist adjacent loads out
372a6eb8 160 of diamond control flow patterns, false otherwise. */
a5828d1e 161static unsigned int
1cab645d 162tree_ssa_phiopt_worker (bool do_store_elim, bool do_hoist_loads, bool early_p)
6de9cd9a
DN
163{
164 basic_block bb;
8eaa0f34
ZD
165 basic_block *bb_order;
166 unsigned n, i;
3e0a08d7 167 bool cfgchanged = false;
6e2830c3 168 hash_set<tree> *nontrap = 0;
a5828d1e
MM
169
170 if (do_store_elim)
83d5977e
RG
171 /* Calculate the set of non-trapping memory accesses. */
172 nontrap = get_non_trapping ();
8eaa0f34
ZD
173
174 /* Search every basic block for COND_EXPR we may be able to optimize.
175
176 We walk the blocks in order that guarantees that a block with
177 a single predecessor is processed before the predecessor.
178 This ensures that we collapse inner ifs before visiting the
179 outer ones, and also that we do not try to visit a removed
180 block. */
3d9c733e 181 bb_order = single_pred_before_succ_order ();
0cae8d31 182 n = n_basic_blocks_for_fn (cfun) - NUM_FIXED_BLOCKS;
6de9cd9a 183
b8698a0f 184 for (i = 0; i < n; i++)
6de9cd9a 185 {
355fe088 186 gimple *cond_stmt;
538dd0b7 187 gphi *phi;
80c4ed35
AP
188 basic_block bb1, bb2;
189 edge e1, e2;
8eaa0f34
ZD
190 tree arg0, arg1;
191
192 bb = bb_order[i];
0385f644 193
726a989a
RB
194 cond_stmt = last_stmt (bb);
195 /* Check to see if the last statement is a GIMPLE_COND. */
196 if (!cond_stmt
197 || gimple_code (cond_stmt) != GIMPLE_COND)
80c4ed35 198 continue;
0385f644 199
80c4ed35
AP
200 e1 = EDGE_SUCC (bb, 0);
201 bb1 = e1->dest;
202 e2 = EDGE_SUCC (bb, 1);
203 bb2 = e2->dest;
0385f644 204
80c4ed35
AP
205 /* We cannot do the optimization on abnormal edges. */
206 if ((e1->flags & EDGE_ABNORMAL) != 0
207 || (e2->flags & EDGE_ABNORMAL) != 0)
208 continue;
0385f644 209
80c4ed35 210 /* If either bb1's succ or bb2 or bb2's succ is non NULL. */
c5cbcccf 211 if (EDGE_COUNT (bb1->succs) == 0
80c4ed35 212 || bb2 == NULL
c5cbcccf 213 || EDGE_COUNT (bb2->succs) == 0)
80c4ed35 214 continue;
0385f644 215
80c4ed35
AP
216 /* Find the bb which is the fall through to the other. */
217 if (EDGE_SUCC (bb1, 0)->dest == bb2)
218 ;
219 else if (EDGE_SUCC (bb2, 0)->dest == bb1)
220 {
6b4db501
MM
221 std::swap (bb1, bb2);
222 std::swap (e1, e2);
80c4ed35 223 }
23782cc3
JJ
224 else if (do_store_elim
225 && EDGE_SUCC (bb1, 0)->dest == EDGE_SUCC (bb2, 0)->dest)
226 {
227 basic_block bb3 = EDGE_SUCC (bb1, 0)->dest;
228
229 if (!single_succ_p (bb1)
230 || (EDGE_SUCC (bb1, 0)->flags & EDGE_FALLTHRU) == 0
231 || !single_succ_p (bb2)
232 || (EDGE_SUCC (bb2, 0)->flags & EDGE_FALLTHRU) == 0
233 || EDGE_COUNT (bb3->preds) != 2)
234 continue;
235 if (cond_if_else_store_replacement (bb1, bb2, bb3))
236 cfgchanged = true;
237 continue;
238 }
372a6eb8 239 else if (do_hoist_loads
cfd719e7 240 && EDGE_SUCC (bb1, 0)->dest == EDGE_SUCC (bb2, 0)->dest)
372a6eb8
BS
241 {
242 basic_block bb3 = EDGE_SUCC (bb1, 0)->dest;
243
244 if (!FLOAT_TYPE_P (TREE_TYPE (gimple_cond_lhs (cond_stmt)))
245 && single_succ_p (bb1)
246 && single_succ_p (bb2)
247 && single_pred_p (bb1)
248 && single_pred_p (bb2)
249 && EDGE_COUNT (bb->succs) == 2
250 && EDGE_COUNT (bb3->preds) == 2
251 /* If one edge or the other is dominant, a conditional move
252 is likely to perform worse than the well-predicted branch. */
253 && !predictable_edge_p (EDGE_SUCC (bb, 0))
254 && !predictable_edge_p (EDGE_SUCC (bb, 1)))
255 hoist_adjacent_loads (bb, bb1, bb2, bb3);
256 continue;
257 }
80c4ed35 258 else
c9ef86a1 259 continue;
0385f644 260
80c4ed35 261 e1 = EDGE_SUCC (bb1, 0);
0385f644 262
80c4ed35 263 /* Make sure that bb1 is just a fall through. */
3d040dbc 264 if (!single_succ_p (bb1)
80c4ed35
AP
265 || (e1->flags & EDGE_FALLTHRU) == 0)
266 continue;
0385f644 267
2a925431
KH
268 /* Also make sure that bb1 only have one predecessor and that it
269 is bb. */
c5cbcccf
ZD
270 if (!single_pred_p (bb1)
271 || single_pred (bb1) != bb)
80c4ed35 272 continue;
0385f644 273
a5828d1e
MM
274 if (do_store_elim)
275 {
276 /* bb1 is the middle block, bb2 the join block, bb the split block,
277 e1 the fallthrough edge from bb1 to bb2. We can't do the
278 optimization if the join block has more than two predecessors. */
279 if (EDGE_COUNT (bb2->preds) > 2)
280 continue;
281 if (cond_store_replacement (bb1, bb2, e1, e2, nontrap))
282 cfgchanged = true;
283 }
284 else
285 {
726a989a 286 gimple_seq phis = phi_nodes (bb2);
e106efc7 287 gimple_stmt_iterator gsi;
210ac0b7 288 bool candorest = true;
b928d32b 289
210ac0b7
AP
290 /* Value replacement can work with more than one PHI
291 so try that first. */
1cab645d
RB
292 if (!early_p)
293 for (gsi = gsi_start (phis); !gsi_end_p (gsi); gsi_next (&gsi))
294 {
295 phi = as_a <gphi *> (gsi_stmt (gsi));
296 arg0 = gimple_phi_arg_def (phi, e1->dest_idx);
297 arg1 = gimple_phi_arg_def (phi, e2->dest_idx);
298 if (value_replacement (bb, bb1, e1, e2, phi, arg0, arg1) == 2)
299 {
300 candorest = false;
301 cfgchanged = true;
302 break;
303 }
304 }
a5828d1e 305
210ac0b7
AP
306 if (!candorest)
307 continue;
c9ef86a1 308
b928d32b 309 phi = single_non_singleton_phi_for_edges (phis, e1, e2);
e106efc7 310 if (!phi)
a5828d1e
MM
311 continue;
312
726a989a
RB
313 arg0 = gimple_phi_arg_def (phi, e1->dest_idx);
314 arg1 = gimple_phi_arg_def (phi, e2->dest_idx);
a5828d1e
MM
315
316 /* Something is wrong if we cannot find the arguments in the PHI
317 node. */
0e0997a2 318 gcc_assert (arg0 != NULL_TREE && arg1 != NULL_TREE);
a5828d1e 319
0e0997a2 320 gphi *newphi = factor_out_conditional_conversion (e1, e2, phi,
cfd719e7
JJ
321 arg0, arg1,
322 cond_stmt);
0e0997a2 323 if (newphi != NULL)
98441735 324 {
0e0997a2 325 phi = newphi;
98441735
KV
326 /* factor_out_conditional_conversion may create a new PHI in
327 BB2 and eliminate an existing PHI in BB2. Recompute values
328 that may be affected by that change. */
98441735
KV
329 arg0 = gimple_phi_arg_def (phi, e1->dest_idx);
330 arg1 = gimple_phi_arg_def (phi, e2->dest_idx);
0e0997a2 331 gcc_assert (arg0 != NULL_TREE && arg1 != NULL_TREE);
98441735
KV
332 }
333
a5828d1e 334 /* Do the replacement of conditional if it can be done. */
1cab645d
RB
335 if (!early_p
336 && conditional_replacement (bb, bb1, e1, e2, phi, arg0, arg1))
a5828d1e 337 cfgchanged = true;
a5828d1e
MM
338 else if (abs_replacement (bb, bb1, e1, e2, phi, arg0, arg1))
339 cfgchanged = true;
1cab645d
RB
340 else if (!early_p
341 && cond_removal_in_popcount_pattern (bb, bb1, e1, e2,
342 phi, arg0, arg1))
58f12ec1 343 cfgchanged = true;
a5828d1e
MM
344 else if (minmax_replacement (bb, bb1, e1, e2, phi, arg0, arg1))
345 cfgchanged = true;
346 }
8eaa0f34
ZD
347 }
348
349 free (bb_order);
b8698a0f 350
a5828d1e 351 if (do_store_elim)
6e2830c3 352 delete nontrap;
a5828d1e
MM
353 /* If the CFG has changed, we should cleanup the CFG. */
354 if (cfgchanged && do_store_elim)
355 {
356 /* In cond-store replacement we have added some loads on edges
357 and new VOPS (as we moved the store, and created a load). */
726a989a 358 gsi_commit_edge_inserts ();
a5828d1e
MM
359 return TODO_cleanup_cfg | TODO_update_ssa_only_virtuals;
360 }
361 else if (cfgchanged)
362 return TODO_cleanup_cfg;
363 return 0;
8eaa0f34
ZD
364}
365
696e78bf 366/* Replace PHI node element whose edge is E in block BB with variable NEW.
80c4ed35 367 Remove the edge from COND_BLOCK which does not lead to BB (COND_BLOCK
1833df5c
JL
368 is known to have two edges, one of which must reach BB). */
369
370static void
e5206274 371replace_phi_edge_with_variable (basic_block cond_block,
355fe088 372 edge e, gimple *phi, tree new_tree)
1833df5c 373{
726a989a 374 basic_block bb = gimple_bb (phi);
8a807136 375 basic_block block_to_remove;
726a989a 376 gimple_stmt_iterator gsi;
80c4ed35 377
0385f644 378 /* Change the PHI argument to new. */
c22940cd 379 SET_USE (PHI_ARG_DEF_PTR (phi, e->dest_idx), new_tree);
8a807136 380
8a807136 381 /* Remove the empty basic block. */
628f6a4e 382 if (EDGE_SUCC (cond_block, 0)->dest == bb)
1833df5c 383 {
628f6a4e
BE
384 EDGE_SUCC (cond_block, 0)->flags |= EDGE_FALLTHRU;
385 EDGE_SUCC (cond_block, 0)->flags &= ~(EDGE_TRUE_VALUE | EDGE_FALSE_VALUE);
357067f2 386 EDGE_SUCC (cond_block, 0)->probability = profile_probability::always ();
8a807136 387
628f6a4e 388 block_to_remove = EDGE_SUCC (cond_block, 1)->dest;
1833df5c
JL
389 }
390 else
391 {
628f6a4e
BE
392 EDGE_SUCC (cond_block, 1)->flags |= EDGE_FALLTHRU;
393 EDGE_SUCC (cond_block, 1)->flags
1833df5c 394 &= ~(EDGE_TRUE_VALUE | EDGE_FALSE_VALUE);
357067f2 395 EDGE_SUCC (cond_block, 1)->probability = profile_probability::always ();
8a807136 396
628f6a4e 397 block_to_remove = EDGE_SUCC (cond_block, 0)->dest;
1833df5c 398 }
8a807136 399 delete_basic_block (block_to_remove);
0385f644 400
1833df5c 401 /* Eliminate the COND_EXPR at the end of COND_BLOCK. */
726a989a
RB
402 gsi = gsi_last_bb (cond_block);
403 gsi_remove (&gsi, true);
0385f644 404
1833df5c
JL
405 if (dump_file && (dump_flags & TDF_DETAILS))
406 fprintf (dump_file,
407 "COND_EXPR in block %d and PHI in block %d converted to straightline code.\n",
408 cond_block->index,
409 bb->index);
410}
411
98441735
KV
412/* PR66726: Factor conversion out of COND_EXPR. If the arguments of the PHI
413 stmt are CONVERT_STMT, factor out the conversion and perform the conversion
cfd719e7
JJ
414 to the result of PHI stmt. COND_STMT is the controlling predicate.
415 Return the newly-created PHI, if any. */
98441735 416
0e0997a2 417static gphi *
98441735 418factor_out_conditional_conversion (edge e0, edge e1, gphi *phi,
cfd719e7 419 tree arg0, tree arg1, gimple *cond_stmt)
98441735 420{
355fe088 421 gimple *arg0_def_stmt = NULL, *arg1_def_stmt = NULL, *new_stmt;
98441735
KV
422 tree new_arg0 = NULL_TREE, new_arg1 = NULL_TREE;
423 tree temp, result;
424 gphi *newphi;
425 gimple_stmt_iterator gsi, gsi_for_def;
620e594b 426 location_t locus = gimple_location (phi);
98441735
KV
427 enum tree_code convert_code;
428
429 /* Handle only PHI statements with two arguments. TODO: If all
430 other arguments to PHI are INTEGER_CST or if their defining
431 statement have the same unary operation, we can handle more
432 than two arguments too. */
433 if (gimple_phi_num_args (phi) != 2)
0e0997a2 434 return NULL;
98441735
KV
435
436 /* First canonicalize to simplify tests. */
437 if (TREE_CODE (arg0) != SSA_NAME)
438 {
439 std::swap (arg0, arg1);
440 std::swap (e0, e1);
441 }
442
443 if (TREE_CODE (arg0) != SSA_NAME
444 || (TREE_CODE (arg1) != SSA_NAME
445 && TREE_CODE (arg1) != INTEGER_CST))
0e0997a2 446 return NULL;
98441735
KV
447
448 /* Check if arg0 is an SSA_NAME and the stmt which defines arg0 is
449 a conversion. */
450 arg0_def_stmt = SSA_NAME_DEF_STMT (arg0);
a88a7b22 451 if (!gimple_assign_cast_p (arg0_def_stmt))
0e0997a2 452 return NULL;
98441735
KV
453
454 /* Use the RHS as new_arg0. */
455 convert_code = gimple_assign_rhs_code (arg0_def_stmt);
456 new_arg0 = gimple_assign_rhs1 (arg0_def_stmt);
457 if (convert_code == VIEW_CONVERT_EXPR)
a88a7b22
EB
458 {
459 new_arg0 = TREE_OPERAND (new_arg0, 0);
460 if (!is_gimple_reg_type (TREE_TYPE (new_arg0)))
461 return NULL;
462 }
98441735
KV
463
464 if (TREE_CODE (arg1) == SSA_NAME)
465 {
466 /* Check if arg1 is an SSA_NAME and the stmt which defines arg1
467 is a conversion. */
468 arg1_def_stmt = SSA_NAME_DEF_STMT (arg1);
469 if (!is_gimple_assign (arg1_def_stmt)
470 || gimple_assign_rhs_code (arg1_def_stmt) != convert_code)
0e0997a2 471 return NULL;
98441735
KV
472
473 /* Use the RHS as new_arg1. */
474 new_arg1 = gimple_assign_rhs1 (arg1_def_stmt);
475 if (convert_code == VIEW_CONVERT_EXPR)
476 new_arg1 = TREE_OPERAND (new_arg1, 0);
477 }
478 else
479 {
480 /* If arg1 is an INTEGER_CST, fold it to new type. */
481 if (INTEGRAL_TYPE_P (TREE_TYPE (new_arg0))
482 && int_fits_type_p (arg1, TREE_TYPE (new_arg0)))
483 {
484 if (gimple_assign_cast_p (arg0_def_stmt))
cfd719e7
JJ
485 {
486 /* For the INTEGER_CST case, we are just moving the
487 conversion from one place to another, which can often
488 hurt as the conversion moves further away from the
489 statement that computes the value. So, perform this
490 only if new_arg0 is an operand of COND_STMT, or
491 if arg0_def_stmt is the only non-debug stmt in
492 its basic block, because then it is possible this
493 could enable further optimizations (minmax replacement
494 etc.). See PR71016. */
495 if (new_arg0 != gimple_cond_lhs (cond_stmt)
496 && new_arg0 != gimple_cond_rhs (cond_stmt)
497 && gimple_bb (arg0_def_stmt) == e0->src)
498 {
499 gsi = gsi_for_stmt (arg0_def_stmt);
500 gsi_prev_nondebug (&gsi);
501 if (!gsi_end_p (gsi))
502 return NULL;
503 gsi = gsi_for_stmt (arg0_def_stmt);
504 gsi_next_nondebug (&gsi);
505 if (!gsi_end_p (gsi))
506 return NULL;
507 }
508 new_arg1 = fold_convert (TREE_TYPE (new_arg0), arg1);
509 }
98441735 510 else
0e0997a2 511 return NULL;
98441735
KV
512 }
513 else
0e0997a2 514 return NULL;
98441735
KV
515 }
516
517 /* If arg0/arg1 have > 1 use, then this transformation actually increases
518 the number of expressions evaluated at runtime. */
519 if (!has_single_use (arg0)
520 || (arg1_def_stmt && !has_single_use (arg1)))
0e0997a2 521 return NULL;
98441735
KV
522
523 /* If types of new_arg0 and new_arg1 are different bailout. */
524 if (!types_compatible_p (TREE_TYPE (new_arg0), TREE_TYPE (new_arg1)))
0e0997a2 525 return NULL;
98441735
KV
526
527 /* Create a new PHI stmt. */
528 result = PHI_RESULT (phi);
529 temp = make_ssa_name (TREE_TYPE (new_arg0), NULL);
530 newphi = create_phi_node (temp, gimple_bb (phi));
531
532 if (dump_file && (dump_flags & TDF_DETAILS))
533 {
534 fprintf (dump_file, "PHI ");
ef6cb4c7 535 print_generic_expr (dump_file, gimple_phi_result (phi));
98441735
KV
536 fprintf (dump_file,
537 " changed to factor conversion out from COND_EXPR.\n");
538 fprintf (dump_file, "New stmt with CAST that defines ");
ef6cb4c7 539 print_generic_expr (dump_file, result);
98441735
KV
540 fprintf (dump_file, ".\n");
541 }
542
543 /* Remove the old cast(s) that has single use. */
544 gsi_for_def = gsi_for_stmt (arg0_def_stmt);
545 gsi_remove (&gsi_for_def, true);
d1acc3f4
JL
546 release_defs (arg0_def_stmt);
547
98441735
KV
548 if (arg1_def_stmt)
549 {
550 gsi_for_def = gsi_for_stmt (arg1_def_stmt);
551 gsi_remove (&gsi_for_def, true);
d1acc3f4 552 release_defs (arg1_def_stmt);
98441735
KV
553 }
554
555 add_phi_arg (newphi, new_arg0, e0, locus);
556 add_phi_arg (newphi, new_arg1, e1, locus);
557
558 /* Create the conversion stmt and insert it. */
559 if (convert_code == VIEW_CONVERT_EXPR)
a4710e09
JJ
560 {
561 temp = fold_build1 (VIEW_CONVERT_EXPR, TREE_TYPE (result), temp);
562 new_stmt = gimple_build_assign (result, temp);
563 }
564 else
565 new_stmt = gimple_build_assign (result, convert_code, temp);
98441735
KV
566 gsi = gsi_after_labels (gimple_bb (phi));
567 gsi_insert_before (&gsi, new_stmt, GSI_SAME_STMT);
568
d1acc3f4 569 /* Remove the original PHI stmt. */
98441735
KV
570 gsi = gsi_for_stmt (phi);
571 gsi_remove (&gsi, true);
0e0997a2 572 return newphi;
98441735
KV
573}
574
1833df5c
JL
575/* The function conditional_replacement does the main work of doing the
576 conditional replacement. Return true if the replacement is done.
577 Otherwise return false.
578 BB is the basic block where the replacement is going to be done on. ARG0
471854f8 579 is argument 0 from PHI. Likewise for ARG1. */
1833df5c
JL
580
581static bool
80c4ed35 582conditional_replacement (basic_block cond_bb, basic_block middle_bb,
538dd0b7 583 edge e0, edge e1, gphi *phi,
80c4ed35 584 tree arg0, tree arg1)
1833df5c
JL
585{
586 tree result;
355fe088 587 gimple *stmt;
538dd0b7 588 gassign *new_stmt;
726a989a
RB
589 tree cond;
590 gimple_stmt_iterator gsi;
1833df5c 591 edge true_edge, false_edge;
726a989a 592 tree new_var, new_var2;
809c929c 593 bool neg;
1833df5c 594
550386ad 595 /* FIXME: Gimplification of complex type is too hard for now. */
5dcf6b7f
JJ
596 /* We aren't prepared to handle vectors either (and it is a question
597 if it would be worthwhile anyway). */
598 if (!(INTEGRAL_TYPE_P (TREE_TYPE (arg0))
599 || POINTER_TYPE_P (TREE_TYPE (arg0)))
600 || !(INTEGRAL_TYPE_P (TREE_TYPE (arg1))
601 || POINTER_TYPE_P (TREE_TYPE (arg1))))
550386ad
AP
602 return false;
603
809c929c
PB
604 /* The PHI arguments have the constants 0 and 1, or 0 and -1, then
605 convert it to the conditional. */
1833df5c
JL
606 if ((integer_zerop (arg0) && integer_onep (arg1))
607 || (integer_zerop (arg1) && integer_onep (arg0)))
809c929c
PB
608 neg = false;
609 else if ((integer_zerop (arg0) && integer_all_onesp (arg1))
610 || (integer_zerop (arg1) && integer_all_onesp (arg0)))
611 neg = true;
1833df5c
JL
612 else
613 return false;
0385f644 614
80c4ed35 615 if (!empty_block_p (middle_bb))
1833df5c 616 return false;
0385f644 617
726a989a 618 /* At this point we know we have a GIMPLE_COND with two successors.
14886ab7
JL
619 One successor is BB, the other successor is an empty block which
620 falls through into BB.
0385f644 621
14886ab7 622 There is a single PHI node at the join point (BB) and its arguments
809c929c 623 are constants (0, 1) or (0, -1).
0385f644 624
14886ab7 625 So, given the condition COND, and the two PHI arguments, we can
0385f644
KH
626 rewrite this PHI into non-branching code:
627
14886ab7 628 dest = (COND) or dest = COND'
0385f644 629
14886ab7
JL
630 We use the condition as-is if the argument associated with the
631 true edge has the value one or the argument associated with the
632 false edge as the value zero. Note that those conditions are not
726a989a 633 the same since only one of the outgoing edges from the GIMPLE_COND
14886ab7 634 will directly reach BB and thus be associated with an argument. */
571325db 635
726a989a
RB
636 stmt = last_stmt (cond_bb);
637 result = PHI_RESULT (phi);
800dd123 638
726a989a
RB
639 /* To handle special cases like floating point comparison, it is easier and
640 less error-prone to build a tree and gimplify it on the fly though it is
641 less efficient. */
f8ecf734
RG
642 cond = fold_build2_loc (gimple_location (stmt),
643 gimple_cond_code (stmt), boolean_type_node,
644 gimple_cond_lhs (stmt), gimple_cond_rhs (stmt));
6de9cd9a 645
726a989a
RB
646 /* We need to know which is the true edge and which is the false
647 edge so that we know when to invert the condition below. */
648 extract_true_false_edges_from_block (cond_bb, &true_edge, &false_edge);
649 if ((e0 == true_edge && integer_zerop (arg0))
809c929c 650 || (e0 == false_edge && !integer_zerop (arg0))
726a989a 651 || (e1 == true_edge && integer_zerop (arg1))
809c929c 652 || (e1 == false_edge && !integer_zerop (arg1)))
f8ecf734 653 cond = fold_build1_loc (gimple_location (stmt),
809c929c
PB
654 TRUTH_NOT_EXPR, TREE_TYPE (cond), cond);
655
656 if (neg)
657 {
658 cond = fold_convert_loc (gimple_location (stmt),
659 TREE_TYPE (result), cond);
660 cond = fold_build1_loc (gimple_location (stmt),
661 NEGATE_EXPR, TREE_TYPE (cond), cond);
662 }
726a989a
RB
663
664 /* Insert our new statements at the end of conditional block before the
665 COND_STMT. */
666 gsi = gsi_for_stmt (stmt);
667 new_var = force_gimple_operand_gsi (&gsi, cond, true, NULL, true,
668 GSI_SAME_STMT);
669
670 if (!useless_type_conversion_p (TREE_TYPE (result), TREE_TYPE (new_var)))
671 {
620e594b 672 location_t locus_0, locus_1;
f5045c96 673
b731b390 674 new_var2 = make_ssa_name (TREE_TYPE (result));
0d0e4a03 675 new_stmt = gimple_build_assign (new_var2, CONVERT_EXPR, new_var);
726a989a
RB
676 gsi_insert_before (&gsi, new_stmt, GSI_SAME_STMT);
677 new_var = new_var2;
f5045c96
AM
678
679 /* Set the locus to the first argument, unless is doesn't have one. */
680 locus_0 = gimple_phi_arg_location (phi, 0);
681 locus_1 = gimple_phi_arg_location (phi, 1);
682 if (locus_0 == UNKNOWN_LOCATION)
683 locus_0 = locus_1;
684 gimple_set_location (new_stmt, locus_0);
6de9cd9a 685 }
0385f644 686
726a989a 687 replace_phi_edge_with_variable (cond_bb, e1, phi, new_var);
1833df5c 688
6de9cd9a
DN
689 /* Note that we optimized this PHI. */
690 return true;
691}
692
98dd3b73
RG
693/* Update *ARG which is defined in STMT so that it contains the
694 computed value if that seems profitable. Return true if the
695 statement is made dead by that rewriting. */
696
697static bool
355fe088 698jump_function_from_stmt (tree *arg, gimple *stmt)
98dd3b73
RG
699{
700 enum tree_code code = gimple_assign_rhs_code (stmt);
701 if (code == ADDR_EXPR)
702 {
703 /* For arg = &p->i transform it to p, if possible. */
704 tree rhs1 = gimple_assign_rhs1 (stmt);
a90c8804 705 poly_int64 offset;
98dd3b73
RG
706 tree tem = get_addr_base_and_unit_offset (TREE_OPERAND (rhs1, 0),
707 &offset);
708 if (tem
709 && TREE_CODE (tem) == MEM_REF
a90c8804 710 && known_eq (mem_ref_offset (tem) + offset, 0))
98dd3b73
RG
711 {
712 *arg = TREE_OPERAND (tem, 0);
713 return true;
714 }
715 }
716 /* TODO: Much like IPA-CP jump-functions we want to handle constant
717 additions symbolically here, and we'd need to update the comparison
718 code that compares the arg + cst tuples in our caller. For now the
719 code above exactly handles the VEC_BASE pattern from vec.h. */
720 return false;
721}
722
c9ef86a1
ZC
723/* RHS is a source argument in a BIT_AND_EXPR which feeds a conditional
724 of the form SSA_NAME NE 0.
725
726 If RHS is fed by a simple EQ_EXPR comparison of two values, see if
727 the two input values of the EQ_EXPR match arg0 and arg1.
728
729 If so update *code and return TRUE. Otherwise return FALSE. */
730
731static bool
732rhs_is_fed_for_value_replacement (const_tree arg0, const_tree arg1,
733 enum tree_code *code, const_tree rhs)
734{
735 /* Obviously if RHS is not an SSA_NAME, we can't look at the defining
736 statement. */
737 if (TREE_CODE (rhs) == SSA_NAME)
738 {
355fe088 739 gimple *def1 = SSA_NAME_DEF_STMT (rhs);
c9ef86a1
ZC
740
741 /* Verify the defining statement has an EQ_EXPR on the RHS. */
742 if (is_gimple_assign (def1) && gimple_assign_rhs_code (def1) == EQ_EXPR)
743 {
744 /* Finally verify the source operands of the EQ_EXPR are equal
745 to arg0 and arg1. */
746 tree op0 = gimple_assign_rhs1 (def1);
747 tree op1 = gimple_assign_rhs2 (def1);
748 if ((operand_equal_for_phi_arg_p (arg0, op0)
749 && operand_equal_for_phi_arg_p (arg1, op1))
750 || (operand_equal_for_phi_arg_p (arg0, op1)
751 && operand_equal_for_phi_arg_p (arg1, op0)))
752 {
753 /* We will perform the optimization. */
754 *code = gimple_assign_rhs_code (def1);
755 return true;
756 }
757 }
758 }
759 return false;
760}
761
762/* Return TRUE if arg0/arg1 are equal to the rhs/lhs or lhs/rhs of COND.
763
764 Also return TRUE if arg0/arg1 are equal to the source arguments of a
765 an EQ comparison feeding a BIT_AND_EXPR which feeds COND.
766
767 Return FALSE otherwise. */
768
769static bool
770operand_equal_for_value_replacement (const_tree arg0, const_tree arg1,
355fe088 771 enum tree_code *code, gimple *cond)
c9ef86a1 772{
355fe088 773 gimple *def;
c9ef86a1
ZC
774 tree lhs = gimple_cond_lhs (cond);
775 tree rhs = gimple_cond_rhs (cond);
776
777 if ((operand_equal_for_phi_arg_p (arg0, lhs)
778 && operand_equal_for_phi_arg_p (arg1, rhs))
779 || (operand_equal_for_phi_arg_p (arg1, lhs)
780 && operand_equal_for_phi_arg_p (arg0, rhs)))
781 return true;
782
783 /* Now handle more complex case where we have an EQ comparison
784 which feeds a BIT_AND_EXPR which feeds COND.
785
786 First verify that COND is of the form SSA_NAME NE 0. */
787 if (*code != NE_EXPR || !integer_zerop (rhs)
788 || TREE_CODE (lhs) != SSA_NAME)
789 return false;
790
791 /* Now ensure that SSA_NAME is set by a BIT_AND_EXPR. */
792 def = SSA_NAME_DEF_STMT (lhs);
793 if (!is_gimple_assign (def) || gimple_assign_rhs_code (def) != BIT_AND_EXPR)
794 return false;
795
796 /* Now verify arg0/arg1 correspond to the source arguments of an
797 EQ comparison feeding the BIT_AND_EXPR. */
798
799 tree tmp = gimple_assign_rhs1 (def);
800 if (rhs_is_fed_for_value_replacement (arg0, arg1, code, tmp))
801 return true;
802
803 tmp = gimple_assign_rhs2 (def);
804 if (rhs_is_fed_for_value_replacement (arg0, arg1, code, tmp))
805 return true;
806
807 return false;
808}
809
421bf780
MG
810/* Returns true if ARG is a neutral element for operation CODE
811 on the RIGHT side. */
812
813static bool
814neutral_element_p (tree_code code, tree arg, bool right)
815{
816 switch (code)
817 {
818 case PLUS_EXPR:
819 case BIT_IOR_EXPR:
820 case BIT_XOR_EXPR:
821 return integer_zerop (arg);
822
823 case LROTATE_EXPR:
824 case RROTATE_EXPR:
825 case LSHIFT_EXPR:
826 case RSHIFT_EXPR:
827 case MINUS_EXPR:
828 case POINTER_PLUS_EXPR:
829 return right && integer_zerop (arg);
830
831 case MULT_EXPR:
832 return integer_onep (arg);
833
834 case TRUNC_DIV_EXPR:
835 case CEIL_DIV_EXPR:
836 case FLOOR_DIV_EXPR:
837 case ROUND_DIV_EXPR:
838 case EXACT_DIV_EXPR:
839 return right && integer_onep (arg);
840
841 case BIT_AND_EXPR:
842 return integer_all_onesp (arg);
843
844 default:
845 return false;
846 }
847}
848
849/* Returns true if ARG is an absorbing element for operation CODE. */
850
851static bool
9513d5fb 852absorbing_element_p (tree_code code, tree arg, bool right, tree rval)
421bf780
MG
853{
854 switch (code)
855 {
856 case BIT_IOR_EXPR:
857 return integer_all_onesp (arg);
858
859 case MULT_EXPR:
860 case BIT_AND_EXPR:
861 return integer_zerop (arg);
862
9737f35b
RB
863 case LSHIFT_EXPR:
864 case RSHIFT_EXPR:
865 case LROTATE_EXPR:
866 case RROTATE_EXPR:
9513d5fb
RB
867 return !right && integer_zerop (arg);
868
9737f35b
RB
869 case TRUNC_DIV_EXPR:
870 case CEIL_DIV_EXPR:
871 case FLOOR_DIV_EXPR:
872 case ROUND_DIV_EXPR:
873 case EXACT_DIV_EXPR:
874 case TRUNC_MOD_EXPR:
875 case CEIL_MOD_EXPR:
876 case FLOOR_MOD_EXPR:
877 case ROUND_MOD_EXPR:
9513d5fb
RB
878 return (!right
879 && integer_zerop (arg)
880 && tree_single_nonzero_warnv_p (rval, NULL));
9737f35b 881
421bf780
MG
882 default:
883 return false;
884 }
885}
886
3a3f4da9 887/* The function value_replacement does the main work of doing the value
210ac0b7
AP
888 replacement. Return non-zero if the replacement is done. Otherwise return
889 0. If we remove the middle basic block, return 2.
3a3f4da9 890 BB is the basic block where the replacement is going to be done on. ARG0
471854f8 891 is argument 0 from the PHI. Likewise for ARG1. */
3a3f4da9 892
210ac0b7 893static int
80c4ed35 894value_replacement (basic_block cond_bb, basic_block middle_bb,
355fe088 895 edge e0, edge e1, gimple *phi,
80c4ed35 896 tree arg0, tree arg1)
3a3f4da9 897{
98dd3b73 898 gimple_stmt_iterator gsi;
355fe088 899 gimple *cond;
3a3f4da9 900 edge true_edge, false_edge;
726a989a 901 enum tree_code code;
210ac0b7 902 bool emtpy_or_with_defined_p = true;
3a3f4da9
AP
903
904 /* If the type says honor signed zeros we cannot do this
471854f8 905 optimization. */
3d3dbadd 906 if (HONOR_SIGNED_ZEROS (arg1))
210ac0b7 907 return 0;
3a3f4da9 908
210ac0b7
AP
909 /* If there is a statement in MIDDLE_BB that defines one of the PHI
910 arguments, then adjust arg0 or arg1. */
421bf780 911 gsi = gsi_start_nondebug_after_labels_bb (middle_bb);
210ac0b7 912 while (!gsi_end_p (gsi))
98dd3b73 913 {
355fe088 914 gimple *stmt = gsi_stmt (gsi);
210ac0b7
AP
915 tree lhs;
916 gsi_next_nondebug (&gsi);
917 if (!is_gimple_assign (stmt))
98dd3b73 918 {
1cab645d
RB
919 if (gimple_code (stmt) != GIMPLE_PREDICT
920 && gimple_code (stmt) != GIMPLE_NOP)
921 emtpy_or_with_defined_p = false;
210ac0b7 922 continue;
98dd3b73 923 }
210ac0b7
AP
924 /* Now try to adjust arg0 or arg1 according to the computation
925 in the statement. */
926 lhs = gimple_assign_lhs (stmt);
927 if (!(lhs == arg0
928 && jump_function_from_stmt (&arg0, stmt))
929 || (lhs == arg1
930 && jump_function_from_stmt (&arg1, stmt)))
931 emtpy_or_with_defined_p = false;
98dd3b73 932 }
3a3f4da9 933
726a989a
RB
934 cond = last_stmt (cond_bb);
935 code = gimple_cond_code (cond);
3a3f4da9
AP
936
937 /* This transformation is only valid for equality comparisons. */
726a989a 938 if (code != NE_EXPR && code != EQ_EXPR)
210ac0b7 939 return 0;
3a3f4da9
AP
940
941 /* We need to know which is the true edge and which is the false
942 edge so that we know if have abs or negative abs. */
80c4ed35 943 extract_true_false_edges_from_block (cond_bb, &true_edge, &false_edge);
3a3f4da9
AP
944
945 /* At this point we know we have a COND_EXPR with two successors.
946 One successor is BB, the other successor is an empty block which
947 falls through into BB.
948
949 The condition for the COND_EXPR is known to be NE_EXPR or EQ_EXPR.
950
951 There is a single PHI node at the join point (BB) with two arguments.
952
953 We now need to verify that the two arguments in the PHI node match
954 the two arguments to the equality comparison. */
0385f644 955
c9ef86a1 956 if (operand_equal_for_value_replacement (arg0, arg1, &code, cond))
3a3f4da9
AP
957 {
958 edge e;
959 tree arg;
960
84c672b9
JL
961 /* For NE_EXPR, we want to build an assignment result = arg where
962 arg is the PHI argument associated with the true edge. For
963 EQ_EXPR we want the PHI argument associated with the false edge. */
726a989a 964 e = (code == NE_EXPR ? true_edge : false_edge);
84c672b9
JL
965
966 /* Unfortunately, E may not reach BB (it may instead have gone to
967 OTHER_BLOCK). If that is the case, then we want the single outgoing
968 edge from OTHER_BLOCK which reaches BB and represents the desired
969 path from COND_BLOCK. */
80c4ed35 970 if (e->dest == middle_bb)
c5cbcccf 971 e = single_succ_edge (e->dest);
84c672b9
JL
972
973 /* Now we know the incoming edge to BB that has the argument for the
974 RHS of our new assignment statement. */
80c4ed35 975 if (e0 == e)
3a3f4da9
AP
976 arg = arg0;
977 else
978 arg = arg1;
979
210ac0b7 980 /* If the middle basic block was empty or is defining the
b928d32b
AP
981 PHI arguments and this is a single phi where the args are different
982 for the edges e0 and e1 then we can remove the middle basic block. */
210ac0b7 983 if (emtpy_or_with_defined_p
b928d32b 984 && single_non_singleton_phi_for_edges (phi_nodes (gimple_bb (phi)),
1a6230a8 985 e0, e1) == phi)
210ac0b7
AP
986 {
987 replace_phi_edge_with_variable (cond_bb, e1, phi, arg);
988 /* Note that we optimized this PHI. */
989 return 2;
990 }
991 else
992 {
993 /* Replace the PHI arguments with arg. */
994 SET_PHI_ARG_DEF (phi, e0->dest_idx, arg);
995 SET_PHI_ARG_DEF (phi, e1->dest_idx, arg);
996 if (dump_file && (dump_flags & TDF_DETAILS))
997 {
998 fprintf (dump_file, "PHI ");
ef6cb4c7 999 print_generic_expr (dump_file, gimple_phi_result (phi));
b928d32b
AP
1000 fprintf (dump_file, " reduced for COND_EXPR in block %d to ",
1001 cond_bb->index);
ef6cb4c7 1002 print_generic_expr (dump_file, arg);
210ac0b7
AP
1003 fprintf (dump_file, ".\n");
1004 }
1005 return 1;
1006 }
3a3f4da9 1007
3a3f4da9 1008 }
421bf780 1009
14745bca
JJ
1010 /* Now optimize (x != 0) ? x + y : y to just x + y. */
1011 gsi = gsi_last_nondebug_bb (middle_bb);
1012 if (gsi_end_p (gsi))
1013 return 0;
1014
1015 gimple *assign = gsi_stmt (gsi);
1016 if (!is_gimple_assign (assign)
421bf780
MG
1017 || gimple_assign_rhs_class (assign) != GIMPLE_BINARY_RHS
1018 || (!INTEGRAL_TYPE_P (TREE_TYPE (arg0))
1019 && !POINTER_TYPE_P (TREE_TYPE (arg0))))
1020 return 0;
1021
ca73a1f7
MG
1022 /* Punt if there are (degenerate) PHIs in middle_bb, there should not be. */
1023 if (!gimple_seq_empty_p (phi_nodes (middle_bb)))
1024 return 0;
1025
14745bca
JJ
1026 /* Allow up to 2 cheap preparation statements that prepare argument
1027 for assign, e.g.:
1028 if (y_4 != 0)
1029 goto <bb 3>;
1030 else
1031 goto <bb 4>;
1032 <bb 3>:
1033 _1 = (int) y_4;
1034 iftmp.0_6 = x_5(D) r<< _1;
1035 <bb 4>:
1036 # iftmp.0_2 = PHI <iftmp.0_6(3), x_5(D)(2)>
1037 or:
1038 if (y_3(D) == 0)
1039 goto <bb 4>;
1040 else
1041 goto <bb 3>;
1042 <bb 3>:
1043 y_4 = y_3(D) & 31;
1044 _1 = (int) y_4;
1045 _6 = x_5(D) r<< _1;
1046 <bb 4>:
1047 # _2 = PHI <x_5(D)(2), _6(3)> */
1048 gimple *prep_stmt[2] = { NULL, NULL };
1049 int prep_cnt;
1050 for (prep_cnt = 0; ; prep_cnt++)
1051 {
1052 gsi_prev_nondebug (&gsi);
1053 if (gsi_end_p (gsi))
1054 break;
1055
1056 gimple *g = gsi_stmt (gsi);
1057 if (gimple_code (g) == GIMPLE_LABEL)
1058 break;
1059
1060 if (prep_cnt == 2 || !is_gimple_assign (g))
1061 return 0;
1062
1063 tree lhs = gimple_assign_lhs (g);
1064 tree rhs1 = gimple_assign_rhs1 (g);
1065 use_operand_p use_p;
1066 gimple *use_stmt;
1067 if (TREE_CODE (lhs) != SSA_NAME
1068 || TREE_CODE (rhs1) != SSA_NAME
1069 || !INTEGRAL_TYPE_P (TREE_TYPE (lhs))
1070 || !INTEGRAL_TYPE_P (TREE_TYPE (rhs1))
1071 || !single_imm_use (lhs, &use_p, &use_stmt)
1072 || use_stmt != (prep_cnt ? prep_stmt[prep_cnt - 1] : assign))
1073 return 0;
1074 switch (gimple_assign_rhs_code (g))
1075 {
1076 CASE_CONVERT:
1077 break;
1078 case PLUS_EXPR:
1079 case BIT_AND_EXPR:
1080 case BIT_IOR_EXPR:
1081 case BIT_XOR_EXPR:
1082 if (TREE_CODE (gimple_assign_rhs2 (g)) != INTEGER_CST)
1083 return 0;
1084 break;
1085 default:
1086 return 0;
1087 }
1088 prep_stmt[prep_cnt] = g;
1089 }
1090
87a34442
MG
1091 /* Only transform if it removes the condition. */
1092 if (!single_non_singleton_phi_for_edges (phi_nodes (gimple_bb (phi)), e0, e1))
1093 return 0;
1094
421bf780
MG
1095 /* Size-wise, this is always profitable. */
1096 if (optimize_bb_for_speed_p (cond_bb)
1097 /* The special case is useless if it has a low probability. */
1098 && profile_status_for_fn (cfun) != PROFILE_ABSENT
357067f2 1099 && EDGE_PRED (middle_bb, 0)->probability < profile_probability::even ()
421bf780 1100 /* If assign is cheap, there is no point avoiding it. */
14745bca 1101 && estimate_num_insns (bb_seq (middle_bb), &eni_time_weights)
421bf780
MG
1102 >= 3 * estimate_num_insns (cond, &eni_time_weights))
1103 return 0;
1104
1105 tree lhs = gimple_assign_lhs (assign);
1106 tree rhs1 = gimple_assign_rhs1 (assign);
1107 tree rhs2 = gimple_assign_rhs2 (assign);
1108 enum tree_code code_def = gimple_assign_rhs_code (assign);
1109 tree cond_lhs = gimple_cond_lhs (cond);
1110 tree cond_rhs = gimple_cond_rhs (cond);
1111
14745bca
JJ
1112 /* Propagate the cond_rhs constant through preparation stmts,
1113 make sure UB isn't invoked while doing that. */
1114 for (int i = prep_cnt - 1; i >= 0; --i)
1115 {
1116 gimple *g = prep_stmt[i];
1117 tree grhs1 = gimple_assign_rhs1 (g);
1118 if (!operand_equal_for_phi_arg_p (cond_lhs, grhs1))
1119 return 0;
1120 cond_lhs = gimple_assign_lhs (g);
1121 cond_rhs = fold_convert (TREE_TYPE (grhs1), cond_rhs);
1122 if (TREE_CODE (cond_rhs) != INTEGER_CST
1123 || TREE_OVERFLOW (cond_rhs))
1124 return 0;
1125 if (gimple_assign_rhs_class (g) == GIMPLE_BINARY_RHS)
1126 {
1127 cond_rhs = int_const_binop (gimple_assign_rhs_code (g), cond_rhs,
1128 gimple_assign_rhs2 (g));
1129 if (TREE_OVERFLOW (cond_rhs))
1130 return 0;
1131 }
1132 cond_rhs = fold_convert (TREE_TYPE (cond_lhs), cond_rhs);
1133 if (TREE_CODE (cond_rhs) != INTEGER_CST
1134 || TREE_OVERFLOW (cond_rhs))
1135 return 0;
1136 }
1137
421bf780
MG
1138 if (((code == NE_EXPR && e1 == false_edge)
1139 || (code == EQ_EXPR && e1 == true_edge))
1140 && arg0 == lhs
1141 && ((arg1 == rhs1
1142 && operand_equal_for_phi_arg_p (rhs2, cond_lhs)
1143 && neutral_element_p (code_def, cond_rhs, true))
1144 || (arg1 == rhs2
1145 && operand_equal_for_phi_arg_p (rhs1, cond_lhs)
1146 && neutral_element_p (code_def, cond_rhs, false))
1147 || (operand_equal_for_phi_arg_p (arg1, cond_rhs)
9737f35b 1148 && ((operand_equal_for_phi_arg_p (rhs2, cond_lhs)
9513d5fb 1149 && absorbing_element_p (code_def, cond_rhs, true, rhs2))
9737f35b 1150 || (operand_equal_for_phi_arg_p (rhs1, cond_lhs)
9513d5fb
RB
1151 && absorbing_element_p (code_def,
1152 cond_rhs, false, rhs2))))))
421bf780
MG
1153 {
1154 gsi = gsi_for_stmt (cond);
5a40ae3c
RB
1155 /* Moving ASSIGN might change VR of lhs, e.g. when moving u_6
1156 def-stmt in:
1157 if (n_5 != 0)
1158 goto <bb 3>;
1159 else
1160 goto <bb 4>;
1161
1162 <bb 3>:
1163 # RANGE [0, 4294967294]
1164 u_6 = n_5 + 4294967295;
1165
1166 <bb 4>:
1167 # u_3 = PHI <u_6(3), 4294967295(2)> */
1168 reset_flow_sensitive_info (lhs);
f7a0790f
JJ
1169 if (INTEGRAL_TYPE_P (TREE_TYPE (lhs)))
1170 {
f7a0790f
JJ
1171 /* If available, we can use VR of phi result at least. */
1172 tree phires = gimple_phi_result (phi);
1173 struct range_info_def *phires_range_info
1174 = SSA_NAME_RANGE_INFO (phires);
1175 if (phires_range_info)
1176 duplicate_ssa_name_range_info (lhs, SSA_NAME_RANGE_TYPE (phires),
1177 phires_range_info);
1178 }
14745bca
JJ
1179 gimple_stmt_iterator gsi_from;
1180 for (int i = prep_cnt - 1; i >= 0; --i)
1181 {
1182 tree plhs = gimple_assign_lhs (prep_stmt[i]);
5a40ae3c 1183 reset_flow_sensitive_info (plhs);
14745bca
JJ
1184 gsi_from = gsi_for_stmt (prep_stmt[i]);
1185 gsi_move_before (&gsi_from, &gsi);
1186 }
1187 gsi_from = gsi_for_stmt (assign);
421bf780
MG
1188 gsi_move_before (&gsi_from, &gsi);
1189 replace_phi_edge_with_variable (cond_bb, e1, phi, lhs);
1190 return 2;
1191 }
1192
210ac0b7 1193 return 0;
3a3f4da9
AP
1194}
1195
8eaa0f34
ZD
1196/* The function minmax_replacement does the main work of doing the minmax
1197 replacement. Return true if the replacement is done. Otherwise return
1198 false.
1199 BB is the basic block where the replacement is going to be done on. ARG0
1200 is argument 0 from the PHI. Likewise for ARG1. */
1201
1202static bool
1203minmax_replacement (basic_block cond_bb, basic_block middle_bb,
355fe088 1204 edge e0, edge e1, gimple *phi,
8eaa0f34
ZD
1205 tree arg0, tree arg1)
1206{
85eaf6c6 1207 tree result, type, rhs;
538dd0b7
DM
1208 gcond *cond;
1209 gassign *new_stmt;
8eaa0f34
ZD
1210 edge true_edge, false_edge;
1211 enum tree_code cmp, minmax, ass_code;
a9fee7cd 1212 tree smaller, alt_smaller, larger, alt_larger, arg_true, arg_false;
726a989a 1213 gimple_stmt_iterator gsi, gsi_from;
8eaa0f34
ZD
1214
1215 type = TREE_TYPE (PHI_RESULT (phi));
1216
1217 /* The optimization may be unsafe due to NaNs. */
d657e995 1218 if (HONOR_NANS (type) || HONOR_SIGNED_ZEROS (type))
8eaa0f34
ZD
1219 return false;
1220
538dd0b7 1221 cond = as_a <gcond *> (last_stmt (cond_bb));
726a989a 1222 cmp = gimple_cond_code (cond);
85eaf6c6
RB
1223 rhs = gimple_cond_rhs (cond);
1224
1225 /* Turn EQ/NE of extreme values to order comparisons. */
1226 if ((cmp == NE_EXPR || cmp == EQ_EXPR)
1227 && TREE_CODE (rhs) == INTEGER_CST)
1228 {
1229 if (wi::eq_p (wi::to_wide (rhs), wi::min_value (TREE_TYPE (rhs))))
1230 {
1231 cmp = (cmp == EQ_EXPR) ? LT_EXPR : GE_EXPR;
1232 rhs = wide_int_to_tree (TREE_TYPE (rhs),
1233 wi::min_value (TREE_TYPE (rhs)) + 1);
1234 }
1235 else if (wi::eq_p (wi::to_wide (rhs), wi::max_value (TREE_TYPE (rhs))))
1236 {
1237 cmp = (cmp == EQ_EXPR) ? GT_EXPR : LE_EXPR;
1238 rhs = wide_int_to_tree (TREE_TYPE (rhs),
1239 wi::max_value (TREE_TYPE (rhs)) - 1);
1240 }
1241 }
8eaa0f34
ZD
1242
1243 /* This transformation is only valid for order comparisons. Record which
1244 operand is smaller/larger if the result of the comparison is true. */
a9fee7cd
RB
1245 alt_smaller = NULL_TREE;
1246 alt_larger = NULL_TREE;
8eaa0f34
ZD
1247 if (cmp == LT_EXPR || cmp == LE_EXPR)
1248 {
726a989a 1249 smaller = gimple_cond_lhs (cond);
85eaf6c6 1250 larger = rhs;
a9fee7cd
RB
1251 /* If we have smaller < CST it is equivalent to smaller <= CST-1.
1252 Likewise smaller <= CST is equivalent to smaller < CST+1. */
1253 if (TREE_CODE (larger) == INTEGER_CST)
1254 {
1255 if (cmp == LT_EXPR)
1256 {
4a669ac3 1257 wi::overflow_type overflow;
8e6cdc90
RS
1258 wide_int alt = wi::sub (wi::to_wide (larger), 1,
1259 TYPE_SIGN (TREE_TYPE (larger)),
a9fee7cd
RB
1260 &overflow);
1261 if (! overflow)
1262 alt_larger = wide_int_to_tree (TREE_TYPE (larger), alt);
1263 }
1264 else
1265 {
4a669ac3 1266 wi::overflow_type overflow;
8e6cdc90
RS
1267 wide_int alt = wi::add (wi::to_wide (larger), 1,
1268 TYPE_SIGN (TREE_TYPE (larger)),
a9fee7cd
RB
1269 &overflow);
1270 if (! overflow)
1271 alt_larger = wide_int_to_tree (TREE_TYPE (larger), alt);
1272 }
1273 }
8eaa0f34
ZD
1274 }
1275 else if (cmp == GT_EXPR || cmp == GE_EXPR)
1276 {
85eaf6c6 1277 smaller = rhs;
726a989a 1278 larger = gimple_cond_lhs (cond);
a9fee7cd
RB
1279 /* If we have larger > CST it is equivalent to larger >= CST+1.
1280 Likewise larger >= CST is equivalent to larger > CST-1. */
1281 if (TREE_CODE (smaller) == INTEGER_CST)
1282 {
4a669ac3 1283 wi::overflow_type overflow;
a9fee7cd
RB
1284 if (cmp == GT_EXPR)
1285 {
8e6cdc90
RS
1286 wide_int alt = wi::add (wi::to_wide (smaller), 1,
1287 TYPE_SIGN (TREE_TYPE (smaller)),
a9fee7cd
RB
1288 &overflow);
1289 if (! overflow)
1290 alt_smaller = wide_int_to_tree (TREE_TYPE (smaller), alt);
1291 }
1292 else
1293 {
8e6cdc90
RS
1294 wide_int alt = wi::sub (wi::to_wide (smaller), 1,
1295 TYPE_SIGN (TREE_TYPE (smaller)),
a9fee7cd
RB
1296 &overflow);
1297 if (! overflow)
1298 alt_smaller = wide_int_to_tree (TREE_TYPE (smaller), alt);
1299 }
1300 }
8eaa0f34
ZD
1301 }
1302 else
1303 return false;
1304
1305 /* We need to know which is the true edge and which is the false
1306 edge so that we know if have abs or negative abs. */
1307 extract_true_false_edges_from_block (cond_bb, &true_edge, &false_edge);
1308
1309 /* Forward the edges over the middle basic block. */
1310 if (true_edge->dest == middle_bb)
1311 true_edge = EDGE_SUCC (true_edge->dest, 0);
1312 if (false_edge->dest == middle_bb)
1313 false_edge = EDGE_SUCC (false_edge->dest, 0);
1314
1315 if (true_edge == e0)
1316 {
1317 gcc_assert (false_edge == e1);
1318 arg_true = arg0;
1319 arg_false = arg1;
1320 }
1321 else
1322 {
1323 gcc_assert (false_edge == e0);
1324 gcc_assert (true_edge == e1);
1325 arg_true = arg1;
1326 arg_false = arg0;
1327 }
1328
1329 if (empty_block_p (middle_bb))
1330 {
a9fee7cd
RB
1331 if ((operand_equal_for_phi_arg_p (arg_true, smaller)
1332 || (alt_smaller
1333 && operand_equal_for_phi_arg_p (arg_true, alt_smaller)))
1334 && (operand_equal_for_phi_arg_p (arg_false, larger)
1335 || (alt_larger
1336 && operand_equal_for_phi_arg_p (arg_true, alt_larger))))
8eaa0f34
ZD
1337 {
1338 /* Case
b8698a0f 1339
8eaa0f34
ZD
1340 if (smaller < larger)
1341 rslt = smaller;
1342 else
1343 rslt = larger; */
1344 minmax = MIN_EXPR;
1345 }
a9fee7cd
RB
1346 else if ((operand_equal_for_phi_arg_p (arg_false, smaller)
1347 || (alt_smaller
1348 && operand_equal_for_phi_arg_p (arg_false, alt_smaller)))
1349 && (operand_equal_for_phi_arg_p (arg_true, larger)
1350 || (alt_larger
1351 && operand_equal_for_phi_arg_p (arg_true, alt_larger))))
8eaa0f34
ZD
1352 minmax = MAX_EXPR;
1353 else
1354 return false;
1355 }
1356 else
1357 {
1358 /* Recognize the following case, assuming d <= u:
1359
1360 if (a <= u)
1361 b = MAX (a, d);
1362 x = PHI <b, u>
1363
1364 This is equivalent to
1365
1366 b = MAX (a, d);
1367 x = MIN (b, u); */
1368
355fe088 1369 gimple *assign = last_and_only_stmt (middle_bb);
726a989a 1370 tree lhs, op0, op1, bound;
8eaa0f34
ZD
1371
1372 if (!assign
726a989a 1373 || gimple_code (assign) != GIMPLE_ASSIGN)
8eaa0f34
ZD
1374 return false;
1375
726a989a
RB
1376 lhs = gimple_assign_lhs (assign);
1377 ass_code = gimple_assign_rhs_code (assign);
8eaa0f34
ZD
1378 if (ass_code != MAX_EXPR && ass_code != MIN_EXPR)
1379 return false;
726a989a
RB
1380 op0 = gimple_assign_rhs1 (assign);
1381 op1 = gimple_assign_rhs2 (assign);
8eaa0f34
ZD
1382
1383 if (true_edge->src == middle_bb)
1384 {
1385 /* We got here if the condition is true, i.e., SMALLER < LARGER. */
1386 if (!operand_equal_for_phi_arg_p (lhs, arg_true))
1387 return false;
1388
a9fee7cd
RB
1389 if (operand_equal_for_phi_arg_p (arg_false, larger)
1390 || (alt_larger
1391 && operand_equal_for_phi_arg_p (arg_false, alt_larger)))
8eaa0f34
ZD
1392 {
1393 /* Case
1394
1395 if (smaller < larger)
1396 {
1397 r' = MAX_EXPR (smaller, bound)
1398 }
1399 r = PHI <r', larger> --> to be turned to MIN_EXPR. */
1400 if (ass_code != MAX_EXPR)
1401 return false;
1402
1403 minmax = MIN_EXPR;
a9fee7cd
RB
1404 if (operand_equal_for_phi_arg_p (op0, smaller)
1405 || (alt_smaller
1406 && operand_equal_for_phi_arg_p (op0, alt_smaller)))
8eaa0f34 1407 bound = op1;
a9fee7cd
RB
1408 else if (operand_equal_for_phi_arg_p (op1, smaller)
1409 || (alt_smaller
1410 && operand_equal_for_phi_arg_p (op1, alt_smaller)))
8eaa0f34
ZD
1411 bound = op0;
1412 else
1413 return false;
1414
1415 /* We need BOUND <= LARGER. */
987b67bc
KH
1416 if (!integer_nonzerop (fold_build2 (LE_EXPR, boolean_type_node,
1417 bound, larger)))
8eaa0f34
ZD
1418 return false;
1419 }
a9fee7cd
RB
1420 else if (operand_equal_for_phi_arg_p (arg_false, smaller)
1421 || (alt_smaller
1422 && operand_equal_for_phi_arg_p (arg_false, alt_smaller)))
8eaa0f34
ZD
1423 {
1424 /* Case
1425
1426 if (smaller < larger)
1427 {
1428 r' = MIN_EXPR (larger, bound)
1429 }
1430 r = PHI <r', smaller> --> to be turned to MAX_EXPR. */
1431 if (ass_code != MIN_EXPR)
1432 return false;
1433
1434 minmax = MAX_EXPR;
a9fee7cd
RB
1435 if (operand_equal_for_phi_arg_p (op0, larger)
1436 || (alt_larger
1437 && operand_equal_for_phi_arg_p (op0, alt_larger)))
8eaa0f34 1438 bound = op1;
a9fee7cd
RB
1439 else if (operand_equal_for_phi_arg_p (op1, larger)
1440 || (alt_larger
1441 && operand_equal_for_phi_arg_p (op1, alt_larger)))
8eaa0f34
ZD
1442 bound = op0;
1443 else
1444 return false;
1445
1446 /* We need BOUND >= SMALLER. */
987b67bc
KH
1447 if (!integer_nonzerop (fold_build2 (GE_EXPR, boolean_type_node,
1448 bound, smaller)))
8eaa0f34
ZD
1449 return false;
1450 }
1451 else
1452 return false;
1453 }
1454 else
1455 {
1456 /* We got here if the condition is false, i.e., SMALLER > LARGER. */
1457 if (!operand_equal_for_phi_arg_p (lhs, arg_false))
1458 return false;
1459
a9fee7cd
RB
1460 if (operand_equal_for_phi_arg_p (arg_true, larger)
1461 || (alt_larger
1462 && operand_equal_for_phi_arg_p (arg_true, alt_larger)))
8eaa0f34
ZD
1463 {
1464 /* Case
1465
1466 if (smaller > larger)
1467 {
1468 r' = MIN_EXPR (smaller, bound)
1469 }
1470 r = PHI <r', larger> --> to be turned to MAX_EXPR. */
1471 if (ass_code != MIN_EXPR)
1472 return false;
1473
1474 minmax = MAX_EXPR;
a9fee7cd
RB
1475 if (operand_equal_for_phi_arg_p (op0, smaller)
1476 || (alt_smaller
1477 && operand_equal_for_phi_arg_p (op0, alt_smaller)))
8eaa0f34 1478 bound = op1;
a9fee7cd
RB
1479 else if (operand_equal_for_phi_arg_p (op1, smaller)
1480 || (alt_smaller
1481 && operand_equal_for_phi_arg_p (op1, alt_smaller)))
8eaa0f34
ZD
1482 bound = op0;
1483 else
1484 return false;
1485
1486 /* We need BOUND >= LARGER. */
987b67bc
KH
1487 if (!integer_nonzerop (fold_build2 (GE_EXPR, boolean_type_node,
1488 bound, larger)))
8eaa0f34
ZD
1489 return false;
1490 }
a9fee7cd
RB
1491 else if (operand_equal_for_phi_arg_p (arg_true, smaller)
1492 || (alt_smaller
1493 && operand_equal_for_phi_arg_p (arg_true, alt_smaller)))
8eaa0f34
ZD
1494 {
1495 /* Case
1496
1497 if (smaller > larger)
1498 {
1499 r' = MAX_EXPR (larger, bound)
1500 }
1501 r = PHI <r', smaller> --> to be turned to MIN_EXPR. */
1502 if (ass_code != MAX_EXPR)
1503 return false;
1504
1505 minmax = MIN_EXPR;
1506 if (operand_equal_for_phi_arg_p (op0, larger))
1507 bound = op1;
1508 else if (operand_equal_for_phi_arg_p (op1, larger))
1509 bound = op0;
1510 else
1511 return false;
1512
1513 /* We need BOUND <= SMALLER. */
987b67bc
KH
1514 if (!integer_nonzerop (fold_build2 (LE_EXPR, boolean_type_node,
1515 bound, smaller)))
8eaa0f34
ZD
1516 return false;
1517 }
1518 else
1519 return false;
1520 }
1521
1522 /* Move the statement from the middle block. */
726a989a 1523 gsi = gsi_last_bb (cond_bb);
21719cea 1524 gsi_from = gsi_last_nondebug_bb (middle_bb);
5a40ae3c
RB
1525 reset_flow_sensitive_info (SINGLE_SSA_TREE_OPERAND (gsi_stmt (gsi_from),
1526 SSA_OP_DEF));
726a989a 1527 gsi_move_before (&gsi_from, &gsi);
8eaa0f34
ZD
1528 }
1529
a6810021
NS
1530 /* Create an SSA var to hold the min/max result. If we're the only
1531 things setting the target PHI, then we can clone the PHI
1532 variable. Otherwise we must create a new one. */
1533 result = PHI_RESULT (phi);
1534 if (EDGE_COUNT (gimple_bb (phi)->preds) == 2)
1535 result = duplicate_ssa_name (result, NULL);
1536 else
1537 result = make_ssa_name (TREE_TYPE (result));
1538
8eaa0f34 1539 /* Emit the statement to compute min/max. */
0d0e4a03 1540 new_stmt = gimple_build_assign (result, minmax, arg0, arg1);
726a989a
RB
1541 gsi = gsi_last_bb (cond_bb);
1542 gsi_insert_before (&gsi, new_stmt, GSI_NEW_STMT);
8eaa0f34 1543
e5206274 1544 replace_phi_edge_with_variable (cond_bb, e1, phi, result);
9edaabf3 1545
8eaa0f34
ZD
1546 return true;
1547}
1548
58f12ec1
KV
1549/* Convert
1550
1551 <bb 2>
1552 if (b_4(D) != 0)
1553 goto <bb 3>
1554 else
1555 goto <bb 4>
1556
1557 <bb 3>
1558 _2 = (unsigned long) b_4(D);
1559 _9 = __builtin_popcountl (_2);
1560 OR
1561 _9 = __builtin_popcountl (b_4(D));
1562
1563 <bb 4>
1564 c_12 = PHI <0(2), _9(3)>
1565
1566 Into
1567 <bb 2>
1568 _2 = (unsigned long) b_4(D);
1569 _9 = __builtin_popcountl (_2);
1570 OR
1571 _9 = __builtin_popcountl (b_4(D));
1572
1573 <bb 4>
1574 c_12 = PHI <_9(2)>
1575*/
1576
1577static bool
1578cond_removal_in_popcount_pattern (basic_block cond_bb, basic_block middle_bb,
1579 edge e1, edge e2,
1580 gimple *phi, tree arg0, tree arg1)
1581{
1582 gimple *cond;
1583 gimple_stmt_iterator gsi, gsi_from;
1584 gimple *popcount;
1585 gimple *cast = NULL;
1586 tree lhs, arg;
1587
1588 /* Check that
1589 _2 = (unsigned long) b_4(D);
1590 _9 = __builtin_popcountl (_2);
1591 OR
1592 _9 = __builtin_popcountl (b_4(D));
1593 are the only stmts in the middle_bb. */
1594
1595 gsi = gsi_start_nondebug_after_labels_bb (middle_bb);
1596 if (gsi_end_p (gsi))
1597 return false;
1598 cast = gsi_stmt (gsi);
1599 gsi_next_nondebug (&gsi);
1600 if (!gsi_end_p (gsi))
1601 {
1602 popcount = gsi_stmt (gsi);
1603 gsi_next_nondebug (&gsi);
1604 if (!gsi_end_p (gsi))
1605 return false;
1606 }
1607 else
1608 {
1609 popcount = cast;
1610 cast = NULL;
1611 }
1612
1613 /* Check that we have a popcount builtin. */
1614 if (!is_gimple_call (popcount))
1615 return false;
1616 combined_fn cfn = gimple_call_combined_fn (popcount);
1617 switch (cfn)
1618 {
1619 CASE_CFN_POPCOUNT:
1620 break;
1621 default:
1622 return false;
1623 }
1624
1625 arg = gimple_call_arg (popcount, 0);
1626 lhs = gimple_get_lhs (popcount);
1627
1628 if (cast)
1629 {
1630 /* We have a cast stmt feeding popcount builtin. */
1631 /* Check that we have a cast prior to that. */
1632 if (gimple_code (cast) != GIMPLE_ASSIGN
1633 || !CONVERT_EXPR_CODE_P (gimple_assign_rhs_code (cast)))
1634 return false;
1635 /* Result of the cast stmt is the argument to the builtin. */
1636 if (arg != gimple_assign_lhs (cast))
1637 return false;
1638 arg = gimple_assign_rhs1 (cast);
1639 }
1640
7f15cc4d
KV
1641 cond = last_stmt (cond_bb);
1642
1643 /* Cond_bb has a check for b_4 [!=|==] 0 before calling the popcount
1644 builtin. */
1645 if (gimple_code (cond) != GIMPLE_COND
1646 || (gimple_cond_code (cond) != NE_EXPR
1647 && gimple_cond_code (cond) != EQ_EXPR)
1648 || !integer_zerop (gimple_cond_rhs (cond))
1649 || arg != gimple_cond_lhs (cond))
1650 return false;
1651
58f12ec1 1652 /* Canonicalize. */
7f15cc4d
KV
1653 if ((e2->flags & EDGE_TRUE_VALUE
1654 && gimple_cond_code (cond) == NE_EXPR)
1655 || (e1->flags & EDGE_TRUE_VALUE
1656 && gimple_cond_code (cond) == EQ_EXPR))
58f12ec1
KV
1657 {
1658 std::swap (arg0, arg1);
1659 std::swap (e1, e2);
1660 }
1661
1662 /* Check PHI arguments. */
1663 if (lhs != arg0 || !integer_zerop (arg1))
1664 return false;
1665
58f12ec1
KV
1666 /* And insert the popcount builtin and cast stmt before the cond_bb. */
1667 gsi = gsi_last_bb (cond_bb);
1668 if (cast)
1669 {
1670 gsi_from = gsi_for_stmt (cast);
1671 gsi_move_before (&gsi_from, &gsi);
1672 reset_flow_sensitive_info (gimple_get_lhs (cast));
1673 }
1674 gsi_from = gsi_for_stmt (popcount);
1675 gsi_move_before (&gsi_from, &gsi);
1676 reset_flow_sensitive_info (gimple_get_lhs (popcount));
1677
1678 /* Now update the PHI and remove unneeded bbs. */
1679 replace_phi_edge_with_variable (cond_bb, e2, phi, lhs);
1680 return true;
1681}
1682
cc52902d
AP
1683/* The function absolute_replacement does the main work of doing the absolute
1684 replacement. Return true if the replacement is done. Otherwise return
1685 false.
1686 bb is the basic block where the replacement is going to be done on. arg0
6c6cfbfd 1687 is argument 0 from the phi. Likewise for arg1. */
80c4ed35 1688
cc52902d 1689static bool
80c4ed35 1690abs_replacement (basic_block cond_bb, basic_block middle_bb,
e5206274 1691 edge e0 ATTRIBUTE_UNUSED, edge e1,
355fe088 1692 gimple *phi, tree arg0, tree arg1)
cc52902d
AP
1693{
1694 tree result;
538dd0b7 1695 gassign *new_stmt;
355fe088 1696 gimple *cond;
726a989a 1697 gimple_stmt_iterator gsi;
cc52902d 1698 edge true_edge, false_edge;
355fe088 1699 gimple *assign;
cc52902d 1700 edge e;
8eaa0f34 1701 tree rhs, lhs;
cc52902d
AP
1702 bool negate;
1703 enum tree_code cond_code;
1704
1705 /* If the type says honor signed zeros we cannot do this
471854f8 1706 optimization. */
3d3dbadd 1707 if (HONOR_SIGNED_ZEROS (arg1))
cc52902d
AP
1708 return false;
1709
cc52902d
AP
1710 /* OTHER_BLOCK must have only one executable statement which must have the
1711 form arg0 = -arg1 or arg1 = -arg0. */
cc52902d 1712
8eaa0f34 1713 assign = last_and_only_stmt (middle_bb);
cc52902d
AP
1714 /* If we did not find the proper negation assignment, then we can not
1715 optimize. */
1716 if (assign == NULL)
1717 return false;
b8698a0f 1718
8eaa0f34
ZD
1719 /* If we got here, then we have found the only executable statement
1720 in OTHER_BLOCK. If it is anything other than arg = -arg1 or
1721 arg1 = -arg0, then we can not optimize. */
726a989a 1722 if (gimple_code (assign) != GIMPLE_ASSIGN)
8eaa0f34
ZD
1723 return false;
1724
726a989a 1725 lhs = gimple_assign_lhs (assign);
8eaa0f34 1726
726a989a 1727 if (gimple_assign_rhs_code (assign) != NEGATE_EXPR)
8eaa0f34
ZD
1728 return false;
1729
726a989a 1730 rhs = gimple_assign_rhs1 (assign);
b8698a0f 1731
8eaa0f34
ZD
1732 /* The assignment has to be arg0 = -arg1 or arg1 = -arg0. */
1733 if (!(lhs == arg0 && rhs == arg1)
1734 && !(lhs == arg1 && rhs == arg0))
1735 return false;
cc52902d 1736
726a989a 1737 cond = last_stmt (cond_bb);
cc52902d
AP
1738 result = PHI_RESULT (phi);
1739
1740 /* Only relationals comparing arg[01] against zero are interesting. */
726a989a 1741 cond_code = gimple_cond_code (cond);
cc52902d
AP
1742 if (cond_code != GT_EXPR && cond_code != GE_EXPR
1743 && cond_code != LT_EXPR && cond_code != LE_EXPR)
1744 return false;
1745
471854f8 1746 /* Make sure the conditional is arg[01] OP y. */
726a989a 1747 if (gimple_cond_lhs (cond) != rhs)
cc52902d
AP
1748 return false;
1749
726a989a
RB
1750 if (FLOAT_TYPE_P (TREE_TYPE (gimple_cond_rhs (cond)))
1751 ? real_zerop (gimple_cond_rhs (cond))
1752 : integer_zerop (gimple_cond_rhs (cond)))
cc52902d
AP
1753 ;
1754 else
1755 return false;
1756
1757 /* We need to know which is the true edge and which is the false
1758 edge so that we know if have abs or negative abs. */
80c4ed35 1759 extract_true_false_edges_from_block (cond_bb, &true_edge, &false_edge);
cc52902d
AP
1760
1761 /* For GT_EXPR/GE_EXPR, if the true edge goes to OTHER_BLOCK, then we
1762 will need to negate the result. Similarly for LT_EXPR/LE_EXPR if
1763 the false edge goes to OTHER_BLOCK. */
1764 if (cond_code == GT_EXPR || cond_code == GE_EXPR)
1765 e = true_edge;
1766 else
1767 e = false_edge;
0385f644 1768
80c4ed35 1769 if (e->dest == middle_bb)
cc52902d
AP
1770 negate = true;
1771 else
1772 negate = false;
0385f644 1773
32894793
RB
1774 /* If the code negates only iff positive then make sure to not
1775 introduce undefined behavior when negating or computing the absolute.
1776 ??? We could use range info if present to check for arg1 == INT_MIN. */
1777 if (negate
1778 && (ANY_INTEGRAL_TYPE_P (TREE_TYPE (arg1))
1779 && ! TYPE_OVERFLOW_WRAPS (TREE_TYPE (arg1))))
1780 return false;
1781
80c4ed35 1782 result = duplicate_ssa_name (result, NULL);
0385f644 1783
cc52902d 1784 if (negate)
b731b390 1785 lhs = make_ssa_name (TREE_TYPE (result));
cc52902d
AP
1786 else
1787 lhs = result;
1788
471854f8 1789 /* Build the modify expression with abs expression. */
0d0e4a03 1790 new_stmt = gimple_build_assign (lhs, ABS_EXPR, rhs);
cc52902d 1791
726a989a
RB
1792 gsi = gsi_last_bb (cond_bb);
1793 gsi_insert_before (&gsi, new_stmt, GSI_NEW_STMT);
cc52902d
AP
1794
1795 if (negate)
1796 {
726a989a 1797 /* Get the right GSI. We want to insert after the recently
cc52902d
AP
1798 added ABS_EXPR statement (which we know is the first statement
1799 in the block. */
0d0e4a03 1800 new_stmt = gimple_build_assign (result, NEGATE_EXPR, lhs);
cc52902d 1801
726a989a 1802 gsi_insert_after (&gsi, new_stmt, GSI_NEW_STMT);
cc52902d 1803 }
0385f644 1804
e5206274 1805 replace_phi_edge_with_variable (cond_bb, e1, phi, result);
cc52902d
AP
1806
1807 /* Note that we optimized this PHI. */
1808 return true;
1809}
1810
a5828d1e
MM
1811/* Auxiliary functions to determine the set of memory accesses which
1812 can't trap because they are preceded by accesses to the same memory
70f34814 1813 portion. We do that for MEM_REFs, so we only need to track
a5828d1e
MM
1814 the SSA_NAME of the pointer indirectly referenced. The algorithm
1815 simply is a walk over all instructions in dominator order. When
70f34814 1816 we see an MEM_REF we determine if we've already seen a same
a5828d1e 1817 ref anywhere up to the root of the dominator tree. If we do the
e08f02f0 1818 current access can't trap. If we don't see any dominating access
a5828d1e 1819 the current access might trap, but might also make later accesses
e08f02f0
MM
1820 non-trapping, so we remember it. We need to be careful with loads
1821 or stores, for instance a load might not trap, while a store would,
1822 so if we see a dominating read access this doesn't mean that a later
1823 write access would not trap. Hence we also need to differentiate the
1824 type of access(es) seen.
1825
1826 ??? We currently are very conservative and assume that a load might
1827 trap even if a store doesn't (write-only memory). This probably is
1828 overly conservative. */
a5828d1e 1829
70f34814 1830/* A hash-table of SSA_NAMEs, and in which basic block an MEM_REF
a5828d1e
MM
1831 through it was seen, which would constitute a no-trap region for
1832 same accesses. */
1833struct name_to_bb
1834{
69ef9a79 1835 unsigned int ssa_name_ver;
c1ca73d8 1836 unsigned int phase;
69ef9a79
JJ
1837 bool store;
1838 HOST_WIDE_INT offset, size;
a5828d1e
MM
1839 basic_block bb;
1840};
1841
4a8fb1a1
LC
1842/* Hashtable helpers. */
1843
95fbe13e 1844struct ssa_names_hasher : free_ptr_hash <name_to_bb>
4a8fb1a1 1845{
67f58944
TS
1846 static inline hashval_t hash (const name_to_bb *);
1847 static inline bool equal (const name_to_bb *, const name_to_bb *);
4a8fb1a1 1848};
a5828d1e 1849
c1ca73d8
MM
1850/* Used for quick clearing of the hash-table when we see calls.
1851 Hash entries with phase < nt_call_phase are invalid. */
1852static unsigned int nt_call_phase;
1853
69ef9a79 1854/* The hash function. */
4a8fb1a1
LC
1855
1856inline hashval_t
67f58944 1857ssa_names_hasher::hash (const name_to_bb *n)
a5828d1e 1858{
69ef9a79
JJ
1859 return n->ssa_name_ver ^ (((hashval_t) n->store) << 31)
1860 ^ (n->offset << 6) ^ (n->size << 3);
a5828d1e
MM
1861}
1862
69ef9a79 1863/* The equality function of *P1 and *P2. */
a5828d1e 1864
4a8fb1a1 1865inline bool
67f58944 1866ssa_names_hasher::equal (const name_to_bb *n1, const name_to_bb *n2)
4a8fb1a1 1867{
69ef9a79
JJ
1868 return n1->ssa_name_ver == n2->ssa_name_ver
1869 && n1->store == n2->store
1870 && n1->offset == n2->offset
1871 && n1->size == n2->size;
a5828d1e
MM
1872}
1873
c203e8a7
TS
1874class nontrapping_dom_walker : public dom_walker
1875{
1876public:
6e2830c3 1877 nontrapping_dom_walker (cdi_direction direction, hash_set<tree> *ps)
c203e8a7
TS
1878 : dom_walker (direction), m_nontrapping (ps), m_seen_ssa_names (128) {}
1879
3daacdcd 1880 virtual edge before_dom_children (basic_block);
c203e8a7
TS
1881 virtual void after_dom_children (basic_block);
1882
1883private:
1884
1885 /* We see the expression EXP in basic block BB. If it's an interesting
1886 expression (an MEM_REF through an SSA_NAME) possibly insert the
1887 expression into the set NONTRAP or the hash table of seen expressions.
1888 STORE is true if this expression is on the LHS, otherwise it's on
1889 the RHS. */
1890 void add_or_mark_expr (basic_block, tree, bool);
1891
6e2830c3 1892 hash_set<tree> *m_nontrapping;
c203e8a7
TS
1893
1894 /* The hash table for remembering what we've seen. */
1895 hash_table<ssa_names_hasher> m_seen_ssa_names;
1896};
1897
1898/* Called by walk_dominator_tree, when entering the block BB. */
3daacdcd 1899edge
c203e8a7
TS
1900nontrapping_dom_walker::before_dom_children (basic_block bb)
1901{
1902 edge e;
1903 edge_iterator ei;
1904 gimple_stmt_iterator gsi;
1905
1906 /* If we haven't seen all our predecessors, clear the hash-table. */
1907 FOR_EACH_EDGE (e, ei, bb->preds)
1908 if ((((size_t)e->src->aux) & 2) == 0)
1909 {
1910 nt_call_phase++;
1911 break;
1912 }
1913
1914 /* Mark this BB as being on the path to dominator root and as visited. */
1915 bb->aux = (void*)(1 | 2);
1916
1917 /* And walk the statements in order. */
1918 for (gsi = gsi_start_bb (bb); !gsi_end_p (gsi); gsi_next (&gsi))
1919 {
355fe088 1920 gimple *stmt = gsi_stmt (gsi);
c203e8a7 1921
c000cd7c
BS
1922 if ((gimple_code (stmt) == GIMPLE_ASM && gimple_vdef (stmt))
1923 || (is_gimple_call (stmt)
1924 && (!nonfreeing_call_p (stmt) || !nonbarrier_call_p (stmt))))
c203e8a7
TS
1925 nt_call_phase++;
1926 else if (gimple_assign_single_p (stmt) && !gimple_has_volatile_ops (stmt))
1927 {
1928 add_or_mark_expr (bb, gimple_assign_lhs (stmt), true);
1929 add_or_mark_expr (bb, gimple_assign_rhs1 (stmt), false);
1930 }
1931 }
3daacdcd 1932 return NULL;
c203e8a7
TS
1933}
1934
1935/* Called by walk_dominator_tree, when basic block BB is exited. */
1936void
1937nontrapping_dom_walker::after_dom_children (basic_block bb)
1938{
1939 /* This BB isn't on the path to dominator root anymore. */
1940 bb->aux = (void*)2;
1941}
4a8fb1a1 1942
fa10beec 1943/* We see the expression EXP in basic block BB. If it's an interesting
70f34814 1944 expression (an MEM_REF through an SSA_NAME) possibly insert the
e08f02f0
MM
1945 expression into the set NONTRAP or the hash table of seen expressions.
1946 STORE is true if this expression is on the LHS, otherwise it's on
1947 the RHS. */
c203e8a7
TS
1948void
1949nontrapping_dom_walker::add_or_mark_expr (basic_block bb, tree exp, bool store)
a5828d1e 1950{
69ef9a79
JJ
1951 HOST_WIDE_INT size;
1952
70f34814 1953 if (TREE_CODE (exp) == MEM_REF
69ef9a79 1954 && TREE_CODE (TREE_OPERAND (exp, 0)) == SSA_NAME
9541ffee 1955 && tree_fits_shwi_p (TREE_OPERAND (exp, 1))
69ef9a79 1956 && (size = int_size_in_bytes (TREE_TYPE (exp))) > 0)
a5828d1e
MM
1957 {
1958 tree name = TREE_OPERAND (exp, 0);
1959 struct name_to_bb map;
4a8fb1a1 1960 name_to_bb **slot;
e08f02f0 1961 struct name_to_bb *n2bb;
a5828d1e
MM
1962 basic_block found_bb = 0;
1963
70f34814 1964 /* Try to find the last seen MEM_REF through the same
a5828d1e 1965 SSA_NAME, which can trap. */
69ef9a79 1966 map.ssa_name_ver = SSA_NAME_VERSION (name);
c1ca73d8 1967 map.phase = 0;
a5828d1e 1968 map.bb = 0;
e08f02f0 1969 map.store = store;
9439e9a1 1970 map.offset = tree_to_shwi (TREE_OPERAND (exp, 1));
69ef9a79
JJ
1971 map.size = size;
1972
c203e8a7 1973 slot = m_seen_ssa_names.find_slot (&map, INSERT);
4a8fb1a1 1974 n2bb = *slot;
c1ca73d8 1975 if (n2bb && n2bb->phase >= nt_call_phase)
e08f02f0 1976 found_bb = n2bb->bb;
a5828d1e 1977
70f34814 1978 /* If we've found a trapping MEM_REF, _and_ it dominates EXP
a5828d1e
MM
1979 (it's in a basic block on the path from us to the dominator root)
1980 then we can't trap. */
c1ca73d8 1981 if (found_bb && (((size_t)found_bb->aux) & 1) == 1)
a5828d1e 1982 {
6e2830c3 1983 m_nontrapping->add (exp);
a5828d1e
MM
1984 }
1985 else
1986 {
1987 /* EXP might trap, so insert it into the hash table. */
e08f02f0 1988 if (n2bb)
a5828d1e 1989 {
c1ca73d8 1990 n2bb->phase = nt_call_phase;
e08f02f0 1991 n2bb->bb = bb;
a5828d1e
MM
1992 }
1993 else
1994 {
e08f02f0 1995 n2bb = XNEW (struct name_to_bb);
69ef9a79 1996 n2bb->ssa_name_ver = SSA_NAME_VERSION (name);
c1ca73d8 1997 n2bb->phase = nt_call_phase;
e08f02f0
MM
1998 n2bb->bb = bb;
1999 n2bb->store = store;
69ef9a79
JJ
2000 n2bb->offset = map.offset;
2001 n2bb->size = size;
e08f02f0 2002 *slot = n2bb;
a5828d1e
MM
2003 }
2004 }
2005 }
2006}
2007
a5828d1e
MM
2008/* This is the entry point of gathering non trapping memory accesses.
2009 It will do a dominator walk over the whole function, and it will
2010 make use of the bb->aux pointers. It returns a set of trees
70f34814 2011 (the MEM_REFs itself) which can't trap. */
6e2830c3 2012static hash_set<tree> *
a5828d1e
MM
2013get_non_trapping (void)
2014{
c1ca73d8 2015 nt_call_phase = 0;
6e2830c3 2016 hash_set<tree> *nontrap = new hash_set<tree>;
a5828d1e
MM
2017 /* We're going to do a dominator walk, so ensure that we have
2018 dominance information. */
2019 calculate_dominance_info (CDI_DOMINATORS);
2020
4d9192b5
TS
2021 nontrapping_dom_walker (CDI_DOMINATORS, nontrap)
2022 .walk (cfun->cfg->x_entry_block_ptr);
2023
c1ca73d8 2024 clear_aux_for_blocks ();
a5828d1e
MM
2025 return nontrap;
2026}
2027
2028/* Do the main work of conditional store replacement. We already know
2029 that the recognized pattern looks like so:
2030
2031 split:
2032 if (cond) goto MIDDLE_BB; else goto JOIN_BB (edge E1)
2033 MIDDLE_BB:
2034 something
2035 fallthrough (edge E0)
2036 JOIN_BB:
2037 some more
2038
2039 We check that MIDDLE_BB contains only one store, that that store
2040 doesn't trap (not via NOTRAP, but via checking if an access to the same
2041 memory location dominates us) and that the store has a "simple" RHS. */
2042
2043static bool
2044cond_store_replacement (basic_block middle_bb, basic_block join_bb,
6e2830c3 2045 edge e0, edge e1, hash_set<tree> *nontrap)
a5828d1e 2046{
355fe088 2047 gimple *assign = last_and_only_stmt (middle_bb);
83d5977e 2048 tree lhs, rhs, name, name2;
538dd0b7
DM
2049 gphi *newphi;
2050 gassign *new_stmt;
726a989a 2051 gimple_stmt_iterator gsi;
620e594b 2052 location_t locus;
a5828d1e
MM
2053
2054 /* Check if middle_bb contains of only one store. */
2055 if (!assign
d7fa6ee2
JJ
2056 || !gimple_assign_single_p (assign)
2057 || gimple_has_volatile_ops (assign))
a5828d1e
MM
2058 return false;
2059
f5045c96 2060 locus = gimple_location (assign);
726a989a
RB
2061 lhs = gimple_assign_lhs (assign);
2062 rhs = gimple_assign_rhs1 (assign);
70f34814 2063 if (TREE_CODE (lhs) != MEM_REF
23782cc3 2064 || TREE_CODE (TREE_OPERAND (lhs, 0)) != SSA_NAME
742d143c 2065 || !is_gimple_reg_type (TREE_TYPE (lhs)))
a5828d1e 2066 return false;
23782cc3 2067
a5828d1e
MM
2068 /* Prove that we can move the store down. We could also check
2069 TREE_THIS_NOTRAP here, but in that case we also could move stores,
2070 whose value is not available readily, which we want to avoid. */
6e2830c3 2071 if (!nontrap->contains (lhs))
a5828d1e
MM
2072 return false;
2073
2074 /* Now we've checked the constraints, so do the transformation:
2075 1) Remove the single store. */
726a989a 2076 gsi = gsi_for_stmt (assign);
742d143c 2077 unlink_stmt_vdef (assign);
726a989a 2078 gsi_remove (&gsi, true);
23782cc3 2079 release_defs (assign);
a5828d1e 2080
da76b253
RB
2081 /* Make both store and load use alias-set zero as we have to
2082 deal with the case of the store being a conditional change
2083 of the dynamic type. */
2084 lhs = unshare_expr (lhs);
2085 tree *basep = &lhs;
2086 while (handled_component_p (*basep))
2087 basep = &TREE_OPERAND (*basep, 0);
2088 if (TREE_CODE (*basep) == MEM_REF
2089 || TREE_CODE (*basep) == TARGET_MEM_REF)
2090 TREE_OPERAND (*basep, 1)
2091 = fold_convert (ptr_type_node, TREE_OPERAND (*basep, 1));
2092 else
2093 *basep = build2 (MEM_REF, TREE_TYPE (*basep),
2094 build_fold_addr_expr (*basep),
2095 build_zero_cst (ptr_type_node));
2096
83d5977e 2097 /* 2) Insert a load from the memory of the store to the temporary
a5828d1e 2098 on the edge which did not contain the store. */
83d5977e
RG
2099 name = make_temp_ssa_name (TREE_TYPE (lhs), NULL, "cstore");
2100 new_stmt = gimple_build_assign (name, lhs);
f5045c96 2101 gimple_set_location (new_stmt, locus);
726a989a 2102 gsi_insert_on_edge (e1, new_stmt);
a5828d1e 2103
83d5977e 2104 /* 3) Create a PHI node at the join block, with one argument
a5828d1e
MM
2105 holding the old RHS, and the other holding the temporary
2106 where we stored the old memory contents. */
83d5977e
RG
2107 name2 = make_temp_ssa_name (TREE_TYPE (lhs), NULL, "cstore");
2108 newphi = create_phi_node (name2, join_bb);
9e227d60
DC
2109 add_phi_arg (newphi, rhs, e0, locus);
2110 add_phi_arg (newphi, name, e1, locus);
a5828d1e
MM
2111
2112 lhs = unshare_expr (lhs);
726a989a 2113 new_stmt = gimple_build_assign (lhs, PHI_RESULT (newphi));
a5828d1e 2114
83d5977e 2115 /* 4) Insert that PHI node. */
726a989a
RB
2116 gsi = gsi_after_labels (join_bb);
2117 if (gsi_end_p (gsi))
a5828d1e 2118 {
726a989a
RB
2119 gsi = gsi_last_bb (join_bb);
2120 gsi_insert_after (&gsi, new_stmt, GSI_NEW_STMT);
a5828d1e
MM
2121 }
2122 else
726a989a 2123 gsi_insert_before (&gsi, new_stmt, GSI_NEW_STMT);
a5828d1e
MM
2124
2125 return true;
2126}
6de9cd9a 2127
bfe068c3 2128/* Do the main work of conditional store replacement. */
23782cc3
JJ
2129
2130static bool
bfe068c3 2131cond_if_else_store_replacement_1 (basic_block then_bb, basic_block else_bb,
355fe088
TS
2132 basic_block join_bb, gimple *then_assign,
2133 gimple *else_assign)
23782cc3 2134{
83d5977e 2135 tree lhs_base, lhs, then_rhs, else_rhs, name;
620e594b 2136 location_t then_locus, else_locus;
23782cc3 2137 gimple_stmt_iterator gsi;
538dd0b7
DM
2138 gphi *newphi;
2139 gassign *new_stmt;
23782cc3 2140
23782cc3
JJ
2141 if (then_assign == NULL
2142 || !gimple_assign_single_p (then_assign)
47598145 2143 || gimple_clobber_p (then_assign)
d7fa6ee2 2144 || gimple_has_volatile_ops (then_assign)
23782cc3 2145 || else_assign == NULL
47598145 2146 || !gimple_assign_single_p (else_assign)
d7fa6ee2
JJ
2147 || gimple_clobber_p (else_assign)
2148 || gimple_has_volatile_ops (else_assign))
23782cc3
JJ
2149 return false;
2150
2151 lhs = gimple_assign_lhs (then_assign);
2152 if (!is_gimple_reg_type (TREE_TYPE (lhs))
2153 || !operand_equal_p (lhs, gimple_assign_lhs (else_assign), 0))
2154 return false;
2155
2156 lhs_base = get_base_address (lhs);
2157 if (lhs_base == NULL_TREE
2158 || (!DECL_P (lhs_base) && TREE_CODE (lhs_base) != MEM_REF))
2159 return false;
2160
2161 then_rhs = gimple_assign_rhs1 (then_assign);
2162 else_rhs = gimple_assign_rhs1 (else_assign);
2163 then_locus = gimple_location (then_assign);
2164 else_locus = gimple_location (else_assign);
2165
2166 /* Now we've checked the constraints, so do the transformation:
2167 1) Remove the stores. */
2168 gsi = gsi_for_stmt (then_assign);
2169 unlink_stmt_vdef (then_assign);
2170 gsi_remove (&gsi, true);
2171 release_defs (then_assign);
2172
2173 gsi = gsi_for_stmt (else_assign);
2174 unlink_stmt_vdef (else_assign);
2175 gsi_remove (&gsi, true);
2176 release_defs (else_assign);
2177
83d5977e 2178 /* 2) Create a PHI node at the join block, with one argument
23782cc3
JJ
2179 holding the old RHS, and the other holding the temporary
2180 where we stored the old memory contents. */
83d5977e
RG
2181 name = make_temp_ssa_name (TREE_TYPE (lhs), NULL, "cstore");
2182 newphi = create_phi_node (name, join_bb);
9e227d60
DC
2183 add_phi_arg (newphi, then_rhs, EDGE_SUCC (then_bb, 0), then_locus);
2184 add_phi_arg (newphi, else_rhs, EDGE_SUCC (else_bb, 0), else_locus);
23782cc3
JJ
2185
2186 new_stmt = gimple_build_assign (lhs, PHI_RESULT (newphi));
2187
83d5977e 2188 /* 3) Insert that PHI node. */
23782cc3
JJ
2189 gsi = gsi_after_labels (join_bb);
2190 if (gsi_end_p (gsi))
2191 {
2192 gsi = gsi_last_bb (join_bb);
2193 gsi_insert_after (&gsi, new_stmt, GSI_NEW_STMT);
2194 }
2195 else
2196 gsi_insert_before (&gsi, new_stmt, GSI_NEW_STMT);
2197
2198 return true;
2199}
2200
68d93a19
RB
2201/* Return the single store in BB with VDEF or NULL if there are
2202 other stores in the BB or loads following the store. */
2203
2204static gimple *
2205single_trailing_store_in_bb (basic_block bb, tree vdef)
2206{
2207 if (SSA_NAME_IS_DEFAULT_DEF (vdef))
2208 return NULL;
2209 gimple *store = SSA_NAME_DEF_STMT (vdef);
2210 if (gimple_bb (store) != bb
2211 || gimple_code (store) == GIMPLE_PHI)
2212 return NULL;
2213
2214 /* Verify there is no other store in this BB. */
2215 if (!SSA_NAME_IS_DEFAULT_DEF (gimple_vuse (store))
2216 && gimple_bb (SSA_NAME_DEF_STMT (gimple_vuse (store))) == bb
2217 && gimple_code (SSA_NAME_DEF_STMT (gimple_vuse (store))) != GIMPLE_PHI)
2218 return NULL;
2219
2220 /* Verify there is no load or store after the store. */
2221 use_operand_p use_p;
2222 imm_use_iterator imm_iter;
2223 FOR_EACH_IMM_USE_FAST (use_p, imm_iter, gimple_vdef (store))
2224 if (USE_STMT (use_p) != store
2225 && gimple_bb (USE_STMT (use_p)) == bb)
2226 return NULL;
2227
2228 return store;
2229}
2230
bfe068c3
IR
2231/* Conditional store replacement. We already know
2232 that the recognized pattern looks like so:
2233
2234 split:
2235 if (cond) goto THEN_BB; else goto ELSE_BB (edge E1)
2236 THEN_BB:
2237 ...
2238 X = Y;
2239 ...
2240 goto JOIN_BB;
2241 ELSE_BB:
2242 ...
2243 X = Z;
2244 ...
2245 fallthrough (edge E0)
2246 JOIN_BB:
2247 some more
2248
2249 We check that it is safe to sink the store to JOIN_BB by verifying that
2250 there are no read-after-write or write-after-write dependencies in
2251 THEN_BB and ELSE_BB. */
2252
2253static bool
2254cond_if_else_store_replacement (basic_block then_bb, basic_block else_bb,
2255 basic_block join_bb)
2256{
9771b263
DN
2257 vec<data_reference_p> then_datarefs, else_datarefs;
2258 vec<ddr_p> then_ddrs, else_ddrs;
355fe088 2259 gimple *then_store, *else_store;
bfe068c3
IR
2260 bool found, ok = false, res;
2261 struct data_dependence_relation *ddr;
2262 data_reference_p then_dr, else_dr;
2263 int i, j;
2264 tree then_lhs, else_lhs;
bfe068c3
IR
2265 basic_block blocks[3];
2266
68d93a19
RB
2267 /* Handle the case with single store in THEN_BB and ELSE_BB. That is
2268 cheap enough to always handle as it allows us to elide dependence
2269 checking. */
2270 gphi *vphi = NULL;
2271 for (gphi_iterator si = gsi_start_phis (join_bb); !gsi_end_p (si);
2272 gsi_next (&si))
2273 if (virtual_operand_p (gimple_phi_result (si.phi ())))
2274 {
2275 vphi = si.phi ();
2276 break;
2277 }
2278 if (!vphi)
bfe068c3 2279 return false;
68d93a19
RB
2280 tree then_vdef = PHI_ARG_DEF_FROM_EDGE (vphi, single_succ_edge (then_bb));
2281 tree else_vdef = PHI_ARG_DEF_FROM_EDGE (vphi, single_succ_edge (else_bb));
2282 gimple *then_assign = single_trailing_store_in_bb (then_bb, then_vdef);
2283 if (then_assign)
2284 {
2285 gimple *else_assign = single_trailing_store_in_bb (else_bb, else_vdef);
2286 if (else_assign)
2287 return cond_if_else_store_replacement_1 (then_bb, else_bb, join_bb,
2288 then_assign, else_assign);
2289 }
bfe068c3 2290
68d93a19
RB
2291 if (MAX_STORES_TO_SINK == 0)
2292 return false;
bfe068c3
IR
2293
2294 /* Find data references. */
9771b263
DN
2295 then_datarefs.create (1);
2296 else_datarefs.create (1);
bfe068c3
IR
2297 if ((find_data_references_in_bb (NULL, then_bb, &then_datarefs)
2298 == chrec_dont_know)
9771b263 2299 || !then_datarefs.length ()
bfe068c3 2300 || (find_data_references_in_bb (NULL, else_bb, &else_datarefs)
5ce9450f 2301 == chrec_dont_know)
9771b263 2302 || !else_datarefs.length ())
bfe068c3
IR
2303 {
2304 free_data_refs (then_datarefs);
2305 free_data_refs (else_datarefs);
2306 return false;
2307 }
2308
2309 /* Find pairs of stores with equal LHS. */
355fe088 2310 auto_vec<gimple *, 1> then_stores, else_stores;
9771b263 2311 FOR_EACH_VEC_ELT (then_datarefs, i, then_dr)
bfe068c3
IR
2312 {
2313 if (DR_IS_READ (then_dr))
2314 continue;
2315
2316 then_store = DR_STMT (then_dr);
59daeef4 2317 then_lhs = gimple_get_lhs (then_store);
5ce9450f
JJ
2318 if (then_lhs == NULL_TREE)
2319 continue;
bfe068c3
IR
2320 found = false;
2321
9771b263 2322 FOR_EACH_VEC_ELT (else_datarefs, j, else_dr)
bfe068c3
IR
2323 {
2324 if (DR_IS_READ (else_dr))
2325 continue;
2326
2327 else_store = DR_STMT (else_dr);
59daeef4 2328 else_lhs = gimple_get_lhs (else_store);
5ce9450f
JJ
2329 if (else_lhs == NULL_TREE)
2330 continue;
bfe068c3
IR
2331
2332 if (operand_equal_p (then_lhs, else_lhs, 0))
2333 {
2334 found = true;
2335 break;
2336 }
2337 }
2338
2339 if (!found)
2340 continue;
2341
9771b263
DN
2342 then_stores.safe_push (then_store);
2343 else_stores.safe_push (else_store);
bfe068c3
IR
2344 }
2345
2346 /* No pairs of stores found. */
9771b263
DN
2347 if (!then_stores.length ()
2348 || then_stores.length () > (unsigned) MAX_STORES_TO_SINK)
bfe068c3
IR
2349 {
2350 free_data_refs (then_datarefs);
2351 free_data_refs (else_datarefs);
bfe068c3
IR
2352 return false;
2353 }
2354
2355 /* Compute and check data dependencies in both basic blocks. */
9771b263
DN
2356 then_ddrs.create (1);
2357 else_ddrs.create (1);
2358 if (!compute_all_dependences (then_datarefs, &then_ddrs,
6e1aa848 2359 vNULL, false)
9771b263 2360 || !compute_all_dependences (else_datarefs, &else_ddrs,
6e1aa848 2361 vNULL, false))
795e8869
JJ
2362 {
2363 free_dependence_relations (then_ddrs);
2364 free_dependence_relations (else_ddrs);
2365 free_data_refs (then_datarefs);
2366 free_data_refs (else_datarefs);
795e8869
JJ
2367 return false;
2368 }
bfe068c3
IR
2369 blocks[0] = then_bb;
2370 blocks[1] = else_bb;
2371 blocks[2] = join_bb;
2372 renumber_gimple_stmt_uids_in_blocks (blocks, 3);
2373
2374 /* Check that there are no read-after-write or write-after-write dependencies
2375 in THEN_BB. */
9771b263 2376 FOR_EACH_VEC_ELT (then_ddrs, i, ddr)
bfe068c3
IR
2377 {
2378 struct data_reference *dra = DDR_A (ddr);
2379 struct data_reference *drb = DDR_B (ddr);
2380
2381 if (DDR_ARE_DEPENDENT (ddr) != chrec_known
2382 && ((DR_IS_READ (dra) && DR_IS_WRITE (drb)
2383 && gimple_uid (DR_STMT (dra)) > gimple_uid (DR_STMT (drb)))
2384 || (DR_IS_READ (drb) && DR_IS_WRITE (dra)
2385 && gimple_uid (DR_STMT (drb)) > gimple_uid (DR_STMT (dra)))
2386 || (DR_IS_WRITE (dra) && DR_IS_WRITE (drb))))
2387 {
2388 free_dependence_relations (then_ddrs);
2389 free_dependence_relations (else_ddrs);
dbaa912c
RG
2390 free_data_refs (then_datarefs);
2391 free_data_refs (else_datarefs);
bfe068c3
IR
2392 return false;
2393 }
2394 }
2395
2396 /* Check that there are no read-after-write or write-after-write dependencies
2397 in ELSE_BB. */
9771b263 2398 FOR_EACH_VEC_ELT (else_ddrs, i, ddr)
bfe068c3
IR
2399 {
2400 struct data_reference *dra = DDR_A (ddr);
2401 struct data_reference *drb = DDR_B (ddr);
2402
2403 if (DDR_ARE_DEPENDENT (ddr) != chrec_known
2404 && ((DR_IS_READ (dra) && DR_IS_WRITE (drb)
2405 && gimple_uid (DR_STMT (dra)) > gimple_uid (DR_STMT (drb)))
2406 || (DR_IS_READ (drb) && DR_IS_WRITE (dra)
2407 && gimple_uid (DR_STMT (drb)) > gimple_uid (DR_STMT (dra)))
2408 || (DR_IS_WRITE (dra) && DR_IS_WRITE (drb))))
2409 {
2410 free_dependence_relations (then_ddrs);
2411 free_dependence_relations (else_ddrs);
dbaa912c
RG
2412 free_data_refs (then_datarefs);
2413 free_data_refs (else_datarefs);
bfe068c3
IR
2414 return false;
2415 }
2416 }
2417
2418 /* Sink stores with same LHS. */
9771b263 2419 FOR_EACH_VEC_ELT (then_stores, i, then_store)
bfe068c3 2420 {
9771b263 2421 else_store = else_stores[i];
bfe068c3
IR
2422 res = cond_if_else_store_replacement_1 (then_bb, else_bb, join_bb,
2423 then_store, else_store);
2424 ok = ok || res;
2425 }
2426
2427 free_dependence_relations (then_ddrs);
2428 free_dependence_relations (else_ddrs);
dbaa912c
RG
2429 free_data_refs (then_datarefs);
2430 free_data_refs (else_datarefs);
bfe068c3
IR
2431
2432 return ok;
2433}
2434
372a6eb8
BS
2435/* Return TRUE if STMT has a VUSE whose corresponding VDEF is in BB. */
2436
2437static bool
355fe088 2438local_mem_dependence (gimple *stmt, basic_block bb)
372a6eb8
BS
2439{
2440 tree vuse = gimple_vuse (stmt);
355fe088 2441 gimple *def;
372a6eb8
BS
2442
2443 if (!vuse)
2444 return false;
2445
2446 def = SSA_NAME_DEF_STMT (vuse);
2447 return (def && gimple_bb (def) == bb);
2448}
2449
2450/* Given a "diamond" control-flow pattern where BB0 tests a condition,
2451 BB1 and BB2 are "then" and "else" blocks dependent on this test,
c9ef86a1 2452 and BB3 rejoins control flow following BB1 and BB2, look for
372a6eb8
BS
2453 opportunities to hoist loads as follows. If BB3 contains a PHI of
2454 two loads, one each occurring in BB1 and BB2, and the loads are
2455 provably of adjacent fields in the same structure, then move both
2456 loads into BB0. Of course this can only be done if there are no
2457 dependencies preventing such motion.
2458
2459 One of the hoisted loads will always be speculative, so the
2460 transformation is currently conservative:
2461
2462 - The fields must be strictly adjacent.
2463 - The two fields must occupy a single memory block that is
2464 guaranteed to not cross a page boundary.
2465
2466 The last is difficult to prove, as such memory blocks should be
2467 aligned on the minimum of the stack alignment boundary and the
2468 alignment guaranteed by heap allocation interfaces. Thus we rely
2469 on a parameter for the alignment value.
2470
2471 Provided a good value is used for the last case, the first
2472 restriction could possibly be relaxed. */
2473
2474static void
2475hoist_adjacent_loads (basic_block bb0, basic_block bb1,
2476 basic_block bb2, basic_block bb3)
2477{
2478 int param_align = PARAM_VALUE (PARAM_L1_CACHE_LINE_SIZE);
2479 unsigned param_align_bits = (unsigned) (param_align * BITS_PER_UNIT);
538dd0b7 2480 gphi_iterator gsi;
372a6eb8
BS
2481
2482 /* Walk the phis in bb3 looking for an opportunity. We are looking
2483 for phis of two SSA names, one each of which is defined in bb1 and
2484 bb2. */
2485 for (gsi = gsi_start_phis (bb3); !gsi_end_p (gsi); gsi_next (&gsi))
2486 {
538dd0b7 2487 gphi *phi_stmt = gsi.phi ();
355fe088 2488 gimple *def1, *def2;
fab27f52 2489 tree arg1, arg2, ref1, ref2, field1, field2;
372a6eb8
BS
2490 tree tree_offset1, tree_offset2, tree_size2, next;
2491 int offset1, offset2, size2;
2492 unsigned align1;
2493 gimple_stmt_iterator gsi2;
2494 basic_block bb_for_def1, bb_for_def2;
2495
ea057359
RG
2496 if (gimple_phi_num_args (phi_stmt) != 2
2497 || virtual_operand_p (gimple_phi_result (phi_stmt)))
372a6eb8
BS
2498 continue;
2499
2500 arg1 = gimple_phi_arg_def (phi_stmt, 0);
2501 arg2 = gimple_phi_arg_def (phi_stmt, 1);
c9ef86a1 2502
372a6eb8
BS
2503 if (TREE_CODE (arg1) != SSA_NAME
2504 || TREE_CODE (arg2) != SSA_NAME
2505 || SSA_NAME_IS_DEFAULT_DEF (arg1)
ea057359 2506 || SSA_NAME_IS_DEFAULT_DEF (arg2))
372a6eb8
BS
2507 continue;
2508
2509 def1 = SSA_NAME_DEF_STMT (arg1);
2510 def2 = SSA_NAME_DEF_STMT (arg2);
2511
2512 if ((gimple_bb (def1) != bb1 || gimple_bb (def2) != bb2)
2513 && (gimple_bb (def2) != bb1 || gimple_bb (def1) != bb2))
2514 continue;
2515
2516 /* Check the mode of the arguments to be sure a conditional move
2517 can be generated for it. */
0a5f2683
BS
2518 if (optab_handler (movcc_optab, TYPE_MODE (TREE_TYPE (arg1)))
2519 == CODE_FOR_nothing)
372a6eb8
BS
2520 continue;
2521
2522 /* Both statements must be assignments whose RHS is a COMPONENT_REF. */
2523 if (!gimple_assign_single_p (def1)
d7fa6ee2
JJ
2524 || !gimple_assign_single_p (def2)
2525 || gimple_has_volatile_ops (def1)
2526 || gimple_has_volatile_ops (def2))
372a6eb8
BS
2527 continue;
2528
2529 ref1 = gimple_assign_rhs1 (def1);
2530 ref2 = gimple_assign_rhs1 (def2);
2531
2532 if (TREE_CODE (ref1) != COMPONENT_REF
2533 || TREE_CODE (ref2) != COMPONENT_REF)
2534 continue;
2535
2536 /* The zeroth operand of the two component references must be
2537 identical. It is not sufficient to compare get_base_address of
2538 the two references, because this could allow for different
2539 elements of the same array in the two trees. It is not safe to
2540 assume that the existence of one array element implies the
2541 existence of a different one. */
2542 if (!operand_equal_p (TREE_OPERAND (ref1, 0), TREE_OPERAND (ref2, 0), 0))
2543 continue;
2544
2545 field1 = TREE_OPERAND (ref1, 1);
2546 field2 = TREE_OPERAND (ref2, 1);
2547
2548 /* Check for field adjacency, and ensure field1 comes first. */
2549 for (next = DECL_CHAIN (field1);
2550 next && TREE_CODE (next) != FIELD_DECL;
2551 next = DECL_CHAIN (next))
2552 ;
2553
2554 if (next != field2)
2555 {
2556 for (next = DECL_CHAIN (field2);
2557 next && TREE_CODE (next) != FIELD_DECL;
2558 next = DECL_CHAIN (next))
2559 ;
2560
2561 if (next != field1)
2562 continue;
2563
fab27f52
MM
2564 std::swap (field1, field2);
2565 std::swap (def1, def2);
372a6eb8
BS
2566 }
2567
9b10be32
BS
2568 bb_for_def1 = gimple_bb (def1);
2569 bb_for_def2 = gimple_bb (def2);
2570
372a6eb8
BS
2571 /* Check for proper alignment of the first field. */
2572 tree_offset1 = bit_position (field1);
2573 tree_offset2 = bit_position (field2);
2574 tree_size2 = DECL_SIZE (field2);
2575
cc269bb6
RS
2576 if (!tree_fits_uhwi_p (tree_offset1)
2577 || !tree_fits_uhwi_p (tree_offset2)
2578 || !tree_fits_uhwi_p (tree_size2))
372a6eb8
BS
2579 continue;
2580
eb1ce453
KZ
2581 offset1 = tree_to_uhwi (tree_offset1);
2582 offset2 = tree_to_uhwi (tree_offset2);
2583 size2 = tree_to_uhwi (tree_size2);
372a6eb8
BS
2584 align1 = DECL_ALIGN (field1) % param_align_bits;
2585
2586 if (offset1 % BITS_PER_UNIT != 0)
2587 continue;
2588
2589 /* For profitability, the two field references should fit within
2590 a single cache line. */
2591 if (align1 + offset2 - offset1 + size2 > param_align_bits)
2592 continue;
2593
2594 /* The two expressions cannot be dependent upon vdefs defined
2595 in bb1/bb2. */
2596 if (local_mem_dependence (def1, bb_for_def1)
2597 || local_mem_dependence (def2, bb_for_def2))
2598 continue;
2599
2600 /* The conditions are satisfied; hoist the loads from bb1 and bb2 into
2601 bb0. We hoist the first one first so that a cache miss is handled
2602 efficiently regardless of hardware cache-fill policy. */
2603 gsi2 = gsi_for_stmt (def1);
2604 gsi_move_to_bb_end (&gsi2, bb0);
2605 gsi2 = gsi_for_stmt (def2);
2606 gsi_move_to_bb_end (&gsi2, bb0);
2607
2608 if (dump_file && (dump_flags & TDF_DETAILS))
2609 {
2610 fprintf (dump_file,
2611 "\nHoisting adjacent loads from %d and %d into %d: \n",
2612 bb_for_def1->index, bb_for_def2->index, bb0->index);
2613 print_gimple_stmt (dump_file, def1, 0, TDF_VOPS|TDF_MEMSYMS);
2614 print_gimple_stmt (dump_file, def2, 0, TDF_VOPS|TDF_MEMSYMS);
2615 }
2616 }
2617}
2618
2619/* Determine whether we should attempt to hoist adjacent loads out of
2620 diamond patterns in pass_phiopt. Always hoist loads if
2621 -fhoist-adjacent-loads is specified and the target machine has
7ef58a1a 2622 both a conditional move instruction and a defined cache line size. */
372a6eb8
BS
2623
2624static bool
2625gate_hoist_loads (void)
2626{
7ef58a1a
BS
2627 return (flag_hoist_adjacent_loads == 1
2628 && PARAM_VALUE (PARAM_L1_CACHE_LINE_SIZE)
2629 && HAVE_conditional_move);
372a6eb8
BS
2630}
2631
be55bfe6
TS
2632/* This pass tries to replaces an if-then-else block with an
2633 assignment. We have four kinds of transformations. Some of these
2634 transformations are also performed by the ifcvt RTL optimizer.
2635
2636 Conditional Replacement
2637 -----------------------
2638
2639 This transformation, implemented in conditional_replacement,
2640 replaces
2641
2642 bb0:
2643 if (cond) goto bb2; else goto bb1;
2644 bb1:
2645 bb2:
2646 x = PHI <0 (bb1), 1 (bb0), ...>;
2647
2648 with
2649
2650 bb0:
2651 x' = cond;
2652 goto bb2;
2653 bb2:
2654 x = PHI <x' (bb0), ...>;
2655
2656 We remove bb1 as it becomes unreachable. This occurs often due to
2657 gimplification of conditionals.
2658
2659 Value Replacement
2660 -----------------
2661
2662 This transformation, implemented in value_replacement, replaces
2663
2664 bb0:
2665 if (a != b) goto bb2; else goto bb1;
2666 bb1:
2667 bb2:
2668 x = PHI <a (bb1), b (bb0), ...>;
2669
2670 with
2671
2672 bb0:
2673 bb2:
2674 x = PHI <b (bb0), ...>;
2675
2676 This opportunity can sometimes occur as a result of other
2677 optimizations.
2678
2679
2680 Another case caught by value replacement looks like this:
2681
2682 bb0:
2683 t1 = a == CONST;
2684 t2 = b > c;
2685 t3 = t1 & t2;
2686 if (t3 != 0) goto bb1; else goto bb2;
2687 bb1:
2688 bb2:
2689 x = PHI (CONST, a)
2690
2691 Gets replaced with:
2692 bb0:
2693 bb2:
2694 t1 = a == CONST;
2695 t2 = b > c;
2696 t3 = t1 & t2;
2697 x = a;
2698
2699 ABS Replacement
2700 ---------------
2701
2702 This transformation, implemented in abs_replacement, replaces
2703
2704 bb0:
2705 if (a >= 0) goto bb2; else goto bb1;
2706 bb1:
2707 x = -a;
2708 bb2:
2709 x = PHI <x (bb1), a (bb0), ...>;
2710
2711 with
2712
2713 bb0:
2714 x' = ABS_EXPR< a >;
2715 bb2:
2716 x = PHI <x' (bb0), ...>;
2717
2718 MIN/MAX Replacement
2719 -------------------
2720
2721 This transformation, minmax_replacement replaces
2722
2723 bb0:
2724 if (a <= b) goto bb2; else goto bb1;
2725 bb1:
2726 bb2:
2727 x = PHI <b (bb1), a (bb0), ...>;
2728
2729 with
2730
2731 bb0:
2732 x' = MIN_EXPR (a, b)
2733 bb2:
2734 x = PHI <x' (bb0), ...>;
2735
2736 A similar transformation is done for MAX_EXPR.
2737
2738
2739 This pass also performs a fifth transformation of a slightly different
2740 flavor.
2741
98441735
KV
2742 Factor conversion in COND_EXPR
2743 ------------------------------
2744
2745 This transformation factors the conversion out of COND_EXPR with
2746 factor_out_conditional_conversion.
2747
2748 For example:
2749 if (a <= CST) goto <bb 3>; else goto <bb 4>;
2750 <bb 3>:
2751 tmp = (int) a;
2752 <bb 4>:
2753 tmp = PHI <tmp, CST>
2754
2755 Into:
2756 if (a <= CST) goto <bb 3>; else goto <bb 4>;
2757 <bb 3>:
2758 <bb 4>:
2759 a = PHI <a, CST>
2760 tmp = (int) a;
2761
be55bfe6
TS
2762 Adjacent Load Hoisting
2763 ----------------------
2764
2765 This transformation replaces
2766
2767 bb0:
2768 if (...) goto bb2; else goto bb1;
2769 bb1:
2770 x1 = (<expr>).field1;
2771 goto bb3;
2772 bb2:
2773 x2 = (<expr>).field2;
2774 bb3:
2775 # x = PHI <x1, x2>;
2776
2777 with
2778
2779 bb0:
2780 x1 = (<expr>).field1;
2781 x2 = (<expr>).field2;
2782 if (...) goto bb2; else goto bb1;
2783 bb1:
2784 goto bb3;
2785 bb2:
2786 bb3:
2787 # x = PHI <x1, x2>;
2788
2789 The purpose of this transformation is to enable generation of conditional
2790 move instructions such as Intel CMOVE or PowerPC ISEL. Because one of
2791 the loads is speculative, the transformation is restricted to very
2792 specific cases to avoid introducing a page fault. We are looking for
2793 the common idiom:
2794
2795 if (...)
2796 x = y->left;
2797 else
2798 x = y->right;
2799
2800 where left and right are typically adjacent pointers in a tree structure. */
0385f644 2801
27a4cd48
DM
2802namespace {
2803
2804const pass_data pass_data_phiopt =
6de9cd9a 2805{
27a4cd48
DM
2806 GIMPLE_PASS, /* type */
2807 "phiopt", /* name */
2808 OPTGROUP_NONE, /* optinfo_flags */
27a4cd48
DM
2809 TV_TREE_PHIOPT, /* tv_id */
2810 ( PROP_cfg | PROP_ssa ), /* properties_required */
2811 0, /* properties_provided */
2812 0, /* properties_destroyed */
2813 0, /* todo_flags_start */
3bea341f 2814 0, /* todo_flags_finish */
6de9cd9a 2815};
a5828d1e 2816
27a4cd48
DM
2817class pass_phiopt : public gimple_opt_pass
2818{
2819public:
c3284718 2820 pass_phiopt (gcc::context *ctxt)
1cab645d 2821 : gimple_opt_pass (pass_data_phiopt, ctxt), early_p (false)
27a4cd48
DM
2822 {}
2823
2824 /* opt_pass methods: */
65d3284b 2825 opt_pass * clone () { return new pass_phiopt (m_ctxt); }
1cab645d
RB
2826 void set_pass_param (unsigned n, bool param)
2827 {
2828 gcc_assert (n == 0);
2829 early_p = param;
2830 }
68f6df73 2831 virtual bool gate (function *) { return flag_ssa_phiopt; }
be55bfe6
TS
2832 virtual unsigned int execute (function *)
2833 {
1cab645d
RB
2834 return tree_ssa_phiopt_worker (false,
2835 !early_p ? gate_hoist_loads () : false,
2836 early_p);
be55bfe6 2837 }
27a4cd48 2838
1cab645d
RB
2839private:
2840 bool early_p;
27a4cd48
DM
2841}; // class pass_phiopt
2842
2843} // anon namespace
2844
2845gimple_opt_pass *
2846make_pass_phiopt (gcc::context *ctxt)
2847{
2848 return new pass_phiopt (ctxt);
2849}
2850
27a4cd48
DM
2851namespace {
2852
2853const pass_data pass_data_cselim =
a5828d1e 2854{
27a4cd48
DM
2855 GIMPLE_PASS, /* type */
2856 "cselim", /* name */
2857 OPTGROUP_NONE, /* optinfo_flags */
27a4cd48
DM
2858 TV_TREE_PHIOPT, /* tv_id */
2859 ( PROP_cfg | PROP_ssa ), /* properties_required */
2860 0, /* properties_provided */
2861 0, /* properties_destroyed */
2862 0, /* todo_flags_start */
3bea341f 2863 0, /* todo_flags_finish */
a5828d1e 2864};
27a4cd48
DM
2865
2866class pass_cselim : public gimple_opt_pass
2867{
2868public:
c3284718
RS
2869 pass_cselim (gcc::context *ctxt)
2870 : gimple_opt_pass (pass_data_cselim, ctxt)
27a4cd48
DM
2871 {}
2872
2873 /* opt_pass methods: */
1a3d085c 2874 virtual bool gate (function *) { return flag_tree_cselim; }
be55bfe6 2875 virtual unsigned int execute (function *) { return tree_ssa_cs_elim (); }
27a4cd48
DM
2876
2877}; // class pass_cselim
2878
2879} // anon namespace
2880
2881gimple_opt_pass *
2882make_pass_cselim (gcc::context *ctxt)
2883{
2884 return new pass_cselim (ctxt);
2885}