Import GCC-8 to a new vendor branch
[dragonfly.git] / contrib / gcc-8.0 / gcc / tree-ssa-reassoc.c
1 /* Reassociation for trees.
2    Copyright (C) 2005-2018 Free Software Foundation, Inc.
3    Contributed by Daniel Berlin <dan@dberlin.org>
4
5 This file is part of GCC.
6
7 GCC is free software; you can redistribute it and/or modify
8 it under the terms of the GNU General Public License as published by
9 the Free Software Foundation; either version 3, or (at your option)
10 any later version.
11
12 GCC is distributed in the hope that it will be useful,
13 but WITHOUT ANY WARRANTY; without even the implied warranty of
14 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
15 GNU General Public License for more details.
16
17 You should have received a copy of the GNU General Public License
18 along with GCC; see the file COPYING3.  If not see
19 <http://www.gnu.org/licenses/>.  */
20
21 #include "config.h"
22 #include "system.h"
23 #include "coretypes.h"
24 #include "backend.h"
25 #include "target.h"
26 #include "rtl.h"
27 #include "tree.h"
28 #include "gimple.h"
29 #include "cfghooks.h"
30 #include "alloc-pool.h"
31 #include "tree-pass.h"
32 #include "memmodel.h"
33 #include "tm_p.h"
34 #include "ssa.h"
35 #include "optabs-tree.h"
36 #include "gimple-pretty-print.h"
37 #include "diagnostic-core.h"
38 #include "fold-const.h"
39 #include "stor-layout.h"
40 #include "cfganal.h"
41 #include "gimple-fold.h"
42 #include "tree-eh.h"
43 #include "gimple-iterator.h"
44 #include "gimplify-me.h"
45 #include "tree-cfg.h"
46 #include "tree-ssa-loop.h"
47 #include "flags.h"
48 #include "tree-ssa.h"
49 #include "langhooks.h"
50 #include "cfgloop.h"
51 #include "params.h"
52 #include "builtins.h"
53 #include "gimplify.h"
54 #include "case-cfn-macros.h"
55
56 /*  This is a simple global reassociation pass.  It is, in part, based
57     on the LLVM pass of the same name (They do some things more/less
58     than we do, in different orders, etc).
59
60     It consists of five steps:
61
62     1. Breaking up subtract operations into addition + negate, where
63     it would promote the reassociation of adds.
64
65     2. Left linearization of the expression trees, so that (A+B)+(C+D)
66     becomes (((A+B)+C)+D), which is easier for us to rewrite later.
67     During linearization, we place the operands of the binary
68     expressions into a vector of operand_entry_*
69
70     3. Optimization of the operand lists, eliminating things like a +
71     -a, a & a, etc.
72
73     3a. Combine repeated factors with the same occurrence counts
74     into a __builtin_powi call that will later be optimized into
75     an optimal number of multiplies.
76
77     4. Rewrite the expression trees we linearized and optimized so
78     they are in proper rank order.
79
80     5. Repropagate negates, as nothing else will clean it up ATM.
81
82     A bit of theory on #4, since nobody seems to write anything down
83     about why it makes sense to do it the way they do it:
84
85     We could do this much nicer theoretically, but don't (for reasons
86     explained after how to do it theoretically nice :P).
87
88     In order to promote the most redundancy elimination, you want
89     binary expressions whose operands are the same rank (or
90     preferably, the same value) exposed to the redundancy eliminator,
91     for possible elimination.
92
93     So the way to do this if we really cared, is to build the new op
94     tree from the leaves to the roots, merging as you go, and putting the
95     new op on the end of the worklist, until you are left with one
96     thing on the worklist.
97
98     IE if you have to rewrite the following set of operands (listed with
99     rank in parentheses), with opcode PLUS_EXPR:
100
101     a (1),  b (1),  c (1),  d (2), e (2)
102
103
104     We start with our merge worklist empty, and the ops list with all of
105     those on it.
106
107     You want to first merge all leaves of the same rank, as much as
108     possible.
109
110     So first build a binary op of
111
112     mergetmp = a + b, and put "mergetmp" on the merge worklist.
113
114     Because there is no three operand form of PLUS_EXPR, c is not going to
115     be exposed to redundancy elimination as a rank 1 operand.
116
117     So you might as well throw it on the merge worklist (you could also
118     consider it to now be a rank two operand, and merge it with d and e,
119     but in this case, you then have evicted e from a binary op. So at
120     least in this situation, you can't win.)
121
122     Then build a binary op of d + e
123     mergetmp2 = d + e
124
125     and put mergetmp2 on the merge worklist.
126
127     so merge worklist = {mergetmp, c, mergetmp2}
128
129     Continue building binary ops of these operations until you have only
130     one operation left on the worklist.
131
132     So we have
133
134     build binary op
135     mergetmp3 = mergetmp + c
136
137     worklist = {mergetmp2, mergetmp3}
138
139     mergetmp4 = mergetmp2 + mergetmp3
140
141     worklist = {mergetmp4}
142
143     because we have one operation left, we can now just set the original
144     statement equal to the result of that operation.
145
146     This will at least expose a + b  and d + e to redundancy elimination
147     as binary operations.
148
149     For extra points, you can reuse the old statements to build the
150     mergetmps, since you shouldn't run out.
151
152     So why don't we do this?
153
154     Because it's expensive, and rarely will help.  Most trees we are
155     reassociating have 3 or less ops.  If they have 2 ops, they already
156     will be written into a nice single binary op.  If you have 3 ops, a
157     single simple check suffices to tell you whether the first two are of the
158     same rank.  If so, you know to order it
159
160     mergetmp = op1 + op2
161     newstmt = mergetmp + op3
162
163     instead of
164     mergetmp = op2 + op3
165     newstmt = mergetmp + op1
166
167     If all three are of the same rank, you can't expose them all in a
168     single binary operator anyway, so the above is *still* the best you
169     can do.
170
171     Thus, this is what we do.  When we have three ops left, we check to see
172     what order to put them in, and call it a day.  As a nod to vector sum
173     reduction, we check if any of the ops are really a phi node that is a
174     destructive update for the associating op, and keep the destructive
175     update together for vector sum reduction recognition.  */
176
177 /* Enable insertion of __builtin_powi calls during execute_reassoc.  See
178    point 3a in the pass header comment.  */
179 static bool reassoc_insert_powi_p;
180
181 /* Statistics */
182 static struct
183 {
184   int linearized;
185   int constants_eliminated;
186   int ops_eliminated;
187   int rewritten;
188   int pows_encountered;
189   int pows_created;
190 } reassociate_stats;
191
192 /* Operator, rank pair.  */
193 struct operand_entry
194 {
195   unsigned int rank;
196   unsigned int id;
197   tree op;
198   unsigned int count;
199   gimple *stmt_to_insert;
200 };
201
202 static object_allocator<operand_entry> operand_entry_pool
203   ("operand entry pool");
204
205 /* This is used to assign a unique ID to each struct operand_entry
206    so that qsort results are identical on different hosts.  */
207 static unsigned int next_operand_entry_id;
208
209 /* Starting rank number for a given basic block, so that we can rank
210    operations using unmovable instructions in that BB based on the bb
211    depth.  */
212 static long *bb_rank;
213
214 /* Operand->rank hashtable.  */
215 static hash_map<tree, long> *operand_rank;
216
217 /* Vector of SSA_NAMEs on which after reassociate_bb is done with
218    all basic blocks the CFG should be adjusted - basic blocks
219    split right after that SSA_NAME's definition statement and before
220    the only use, which must be a bit ior.  */
221 static vec<tree> reassoc_branch_fixups;
222
223 /* Forward decls.  */
224 static long get_rank (tree);
225 static bool reassoc_stmt_dominates_stmt_p (gimple *, gimple *);
226
227 /* Wrapper around gsi_remove, which adjusts gimple_uid of debug stmts
228    possibly added by gsi_remove.  */
229
230 bool
231 reassoc_remove_stmt (gimple_stmt_iterator *gsi)
232 {
233   gimple *stmt = gsi_stmt (*gsi);
234
235   if (!MAY_HAVE_DEBUG_BIND_STMTS || gimple_code (stmt) == GIMPLE_PHI)
236     return gsi_remove (gsi, true);
237
238   gimple_stmt_iterator prev = *gsi;
239   gsi_prev (&prev);
240   unsigned uid = gimple_uid (stmt);
241   basic_block bb = gimple_bb (stmt);
242   bool ret = gsi_remove (gsi, true);
243   if (!gsi_end_p (prev))
244     gsi_next (&prev);
245   else
246     prev = gsi_start_bb (bb);
247   gimple *end_stmt = gsi_stmt (*gsi);
248   while ((stmt = gsi_stmt (prev)) != end_stmt)
249     {
250       gcc_assert (stmt && is_gimple_debug (stmt) && gimple_uid (stmt) == 0);
251       gimple_set_uid (stmt, uid);
252       gsi_next (&prev);
253     }
254   return ret;
255 }
256
257 /* Bias amount for loop-carried phis.  We want this to be larger than
258    the depth of any reassociation tree we can see, but not larger than
259    the rank difference between two blocks.  */
260 #define PHI_LOOP_BIAS (1 << 15)
261
262 /* Rank assigned to a phi statement.  If STMT is a loop-carried phi of
263    an innermost loop, and the phi has only a single use which is inside
264    the loop, then the rank is the block rank of the loop latch plus an
265    extra bias for the loop-carried dependence.  This causes expressions
266    calculated into an accumulator variable to be independent for each
267    iteration of the loop.  If STMT is some other phi, the rank is the
268    block rank of its containing block.  */
269 static long
270 phi_rank (gimple *stmt)
271 {
272   basic_block bb = gimple_bb (stmt);
273   struct loop *father = bb->loop_father;
274   tree res;
275   unsigned i;
276   use_operand_p use;
277   gimple *use_stmt;
278
279   /* We only care about real loops (those with a latch).  */
280   if (!father->latch)
281     return bb_rank[bb->index];
282
283   /* Interesting phis must be in headers of innermost loops.  */
284   if (bb != father->header
285       || father->inner)
286     return bb_rank[bb->index];
287
288   /* Ignore virtual SSA_NAMEs.  */
289   res = gimple_phi_result (stmt);
290   if (virtual_operand_p (res))
291     return bb_rank[bb->index];
292
293   /* The phi definition must have a single use, and that use must be
294      within the loop.  Otherwise this isn't an accumulator pattern.  */
295   if (!single_imm_use (res, &use, &use_stmt)
296       || gimple_bb (use_stmt)->loop_father != father)
297     return bb_rank[bb->index];
298
299   /* Look for phi arguments from within the loop.  If found, bias this phi.  */
300   for (i = 0; i < gimple_phi_num_args (stmt); i++)
301     {
302       tree arg = gimple_phi_arg_def (stmt, i);
303       if (TREE_CODE (arg) == SSA_NAME
304           && !SSA_NAME_IS_DEFAULT_DEF (arg))
305         {
306           gimple *def_stmt = SSA_NAME_DEF_STMT (arg);
307           if (gimple_bb (def_stmt)->loop_father == father)
308             return bb_rank[father->latch->index] + PHI_LOOP_BIAS;
309         }
310     }
311
312   /* Must be an uninteresting phi.  */
313   return bb_rank[bb->index];
314 }
315
316 /* If EXP is an SSA_NAME defined by a PHI statement that represents a
317    loop-carried dependence of an innermost loop, return TRUE; else
318    return FALSE.  */
319 static bool
320 loop_carried_phi (tree exp)
321 {
322   gimple *phi_stmt;
323   long block_rank;
324
325   if (TREE_CODE (exp) != SSA_NAME
326       || SSA_NAME_IS_DEFAULT_DEF (exp))
327     return false;
328
329   phi_stmt = SSA_NAME_DEF_STMT (exp);
330
331   if (gimple_code (SSA_NAME_DEF_STMT (exp)) != GIMPLE_PHI)
332     return false;
333
334   /* Non-loop-carried phis have block rank.  Loop-carried phis have
335      an additional bias added in.  If this phi doesn't have block rank,
336      it's biased and should not be propagated.  */
337   block_rank = bb_rank[gimple_bb (phi_stmt)->index];
338
339   if (phi_rank (phi_stmt) != block_rank)
340     return true;
341
342   return false;
343 }
344
345 /* Return the maximum of RANK and the rank that should be propagated
346    from expression OP.  For most operands, this is just the rank of OP.
347    For loop-carried phis, the value is zero to avoid undoing the bias
348    in favor of the phi.  */
349 static long
350 propagate_rank (long rank, tree op)
351 {
352   long op_rank;
353
354   if (loop_carried_phi (op))
355     return rank;
356
357   op_rank = get_rank (op);
358
359   return MAX (rank, op_rank);
360 }
361
362 /* Look up the operand rank structure for expression E.  */
363
364 static inline long
365 find_operand_rank (tree e)
366 {
367   long *slot = operand_rank->get (e);
368   return slot ? *slot : -1;
369 }
370
371 /* Insert {E,RANK} into the operand rank hashtable.  */
372
373 static inline void
374 insert_operand_rank (tree e, long rank)
375 {
376   gcc_assert (rank > 0);
377   gcc_assert (!operand_rank->put (e, rank));
378 }
379
380 /* Given an expression E, return the rank of the expression.  */
381
382 static long
383 get_rank (tree e)
384 {
385   /* SSA_NAME's have the rank of the expression they are the result
386      of.
387      For globals and uninitialized values, the rank is 0.
388      For function arguments, use the pre-setup rank.
389      For PHI nodes, stores, asm statements, etc, we use the rank of
390      the BB.
391      For simple operations, the rank is the maximum rank of any of
392      its operands, or the bb_rank, whichever is less.
393      I make no claims that this is optimal, however, it gives good
394      results.  */
395
396   /* We make an exception to the normal ranking system to break
397      dependences of accumulator variables in loops.  Suppose we
398      have a simple one-block loop containing:
399
400        x_1 = phi(x_0, x_2)
401        b = a + x_1
402        c = b + d
403        x_2 = c + e
404
405      As shown, each iteration of the calculation into x is fully
406      dependent upon the iteration before it.  We would prefer to
407      see this in the form:
408
409        x_1 = phi(x_0, x_2)
410        b = a + d
411        c = b + e
412        x_2 = c + x_1
413
414      If the loop is unrolled, the calculations of b and c from
415      different iterations can be interleaved.
416
417      To obtain this result during reassociation, we bias the rank
418      of the phi definition x_1 upward, when it is recognized as an
419      accumulator pattern.  The artificial rank causes it to be 
420      added last, providing the desired independence.  */
421
422   if (TREE_CODE (e) == SSA_NAME)
423     {
424       ssa_op_iter iter;
425       gimple *stmt;
426       long rank;
427       tree op;
428
429       if (SSA_NAME_IS_DEFAULT_DEF (e))
430         return find_operand_rank (e);
431
432       stmt = SSA_NAME_DEF_STMT (e);
433       if (gimple_code (stmt) == GIMPLE_PHI)
434         return phi_rank (stmt);
435
436       if (!is_gimple_assign (stmt))
437         return bb_rank[gimple_bb (stmt)->index];
438
439       /* If we already have a rank for this expression, use that.  */
440       rank = find_operand_rank (e);
441       if (rank != -1)
442         return rank;
443
444       /* Otherwise, find the maximum rank for the operands.  As an
445          exception, remove the bias from loop-carried phis when propagating
446          the rank so that dependent operations are not also biased.  */
447       /* Simply walk over all SSA uses - this takes advatage of the
448          fact that non-SSA operands are is_gimple_min_invariant and
449          thus have rank 0.  */
450       rank = 0;
451       FOR_EACH_SSA_TREE_OPERAND (op, stmt, iter, SSA_OP_USE)
452         rank = propagate_rank (rank, op);
453
454       if (dump_file && (dump_flags & TDF_DETAILS))
455         {
456           fprintf (dump_file, "Rank for ");
457           print_generic_expr (dump_file, e);
458           fprintf (dump_file, " is %ld\n", (rank + 1));
459         }
460
461       /* Note the rank in the hashtable so we don't recompute it.  */
462       insert_operand_rank (e, (rank + 1));
463       return (rank + 1);
464     }
465
466   /* Constants, globals, etc., are rank 0 */
467   return 0;
468 }
469
470
471 /* We want integer ones to end up last no matter what, since they are
472    the ones we can do the most with.  */
473 #define INTEGER_CONST_TYPE 1 << 4
474 #define FLOAT_ONE_CONST_TYPE 1 << 3
475 #define FLOAT_CONST_TYPE 1 << 2
476 #define OTHER_CONST_TYPE 1 << 1
477
478 /* Classify an invariant tree into integer, float, or other, so that
479    we can sort them to be near other constants of the same type.  */
480 static inline int
481 constant_type (tree t)
482 {
483   if (INTEGRAL_TYPE_P (TREE_TYPE (t)))
484     return INTEGER_CONST_TYPE;
485   else if (SCALAR_FLOAT_TYPE_P (TREE_TYPE (t)))
486     {
487       /* Sort -1.0 and 1.0 constants last, while in some cases
488          const_binop can't optimize some inexact operations, multiplication
489          by -1.0 or 1.0 can be always merged with others.  */
490       if (real_onep (t) || real_minus_onep (t))
491         return FLOAT_ONE_CONST_TYPE;
492       return FLOAT_CONST_TYPE;
493     }
494   else
495     return OTHER_CONST_TYPE;
496 }
497
498 /* qsort comparison function to sort operand entries PA and PB by rank
499    so that the sorted array is ordered by rank in decreasing order.  */
500 static int
501 sort_by_operand_rank (const void *pa, const void *pb)
502 {
503   const operand_entry *oea = *(const operand_entry *const *)pa;
504   const operand_entry *oeb = *(const operand_entry *const *)pb;
505
506   if (oeb->rank != oea->rank)
507     return oeb->rank > oea->rank ? 1 : -1;
508
509   /* It's nicer for optimize_expression if constants that are likely
510      to fold when added/multiplied/whatever are put next to each
511      other.  Since all constants have rank 0, order them by type.  */
512   if (oea->rank == 0)
513     {
514       if (constant_type (oeb->op) != constant_type (oea->op))
515         return constant_type (oea->op) - constant_type (oeb->op);
516       else
517         /* To make sorting result stable, we use unique IDs to determine
518            order.  */
519         return oeb->id > oea->id ? 1 : -1;
520     }
521
522   if (TREE_CODE (oea->op) != SSA_NAME)
523     {
524       if (TREE_CODE (oeb->op) != SSA_NAME)
525         return oeb->id > oea->id ? 1 : -1;
526       else
527         return 1;
528     }
529   else if (TREE_CODE (oeb->op) != SSA_NAME)
530     return -1;
531
532   /* Lastly, make sure the versions that are the same go next to each
533      other.  */
534   if (SSA_NAME_VERSION (oeb->op) != SSA_NAME_VERSION (oea->op))
535     {
536       /* As SSA_NAME_VERSION is assigned pretty randomly, because we reuse
537          versions of removed SSA_NAMEs, so if possible, prefer to sort
538          based on basic block and gimple_uid of the SSA_NAME_DEF_STMT.
539          See PR60418.  */
540       gimple *stmta = SSA_NAME_DEF_STMT (oea->op);
541       gimple *stmtb = SSA_NAME_DEF_STMT (oeb->op);
542       basic_block bba = gimple_bb (stmta);
543       basic_block bbb = gimple_bb (stmtb);
544       if (bbb != bba)
545         {
546           /* One of the SSA_NAMEs can be defined in oeN->stmt_to_insert
547              but the other might not.  */
548           if (!bba)
549             return 1;
550           if (!bbb)
551             return -1;
552           /* If neither is, compare bb_rank.  */
553           if (bb_rank[bbb->index] != bb_rank[bba->index])
554             return (bb_rank[bbb->index] >> 16) - (bb_rank[bba->index] >> 16);
555         }
556
557       bool da = reassoc_stmt_dominates_stmt_p (stmta, stmtb);
558       bool db = reassoc_stmt_dominates_stmt_p (stmtb, stmta);
559       if (da != db)
560         return da ? 1 : -1;
561
562       return SSA_NAME_VERSION (oeb->op) > SSA_NAME_VERSION (oea->op) ? 1 : -1;
563     }
564
565   return oeb->id > oea->id ? 1 : -1;
566 }
567
568 /* Add an operand entry to *OPS for the tree operand OP.  */
569
570 static void
571 add_to_ops_vec (vec<operand_entry *> *ops, tree op, gimple *stmt_to_insert = NULL)
572 {
573   operand_entry *oe = operand_entry_pool.allocate ();
574
575   oe->op = op;
576   oe->rank = get_rank (op);
577   oe->id = next_operand_entry_id++;
578   oe->count = 1;
579   oe->stmt_to_insert = stmt_to_insert;
580   ops->safe_push (oe);
581 }
582
583 /* Add an operand entry to *OPS for the tree operand OP with repeat
584    count REPEAT.  */
585
586 static void
587 add_repeat_to_ops_vec (vec<operand_entry *> *ops, tree op,
588                        HOST_WIDE_INT repeat)
589 {
590   operand_entry *oe = operand_entry_pool.allocate ();
591
592   oe->op = op;
593   oe->rank = get_rank (op);
594   oe->id = next_operand_entry_id++;
595   oe->count = repeat;
596   oe->stmt_to_insert = NULL;
597   ops->safe_push (oe);
598
599   reassociate_stats.pows_encountered++;
600 }
601
602 /* Return true if STMT is reassociable operation containing a binary
603    operation with tree code CODE, and is inside LOOP.  */
604
605 static bool
606 is_reassociable_op (gimple *stmt, enum tree_code code, struct loop *loop)
607 {
608   basic_block bb = gimple_bb (stmt);
609
610   if (gimple_bb (stmt) == NULL)
611     return false;
612
613   if (!flow_bb_inside_loop_p (loop, bb))
614     return false;
615
616   if (is_gimple_assign (stmt)
617       && gimple_assign_rhs_code (stmt) == code
618       && has_single_use (gimple_assign_lhs (stmt)))
619     {
620       tree rhs1 = gimple_assign_rhs1 (stmt);
621       tree rhs2 = gimple_assign_rhs1 (stmt);
622       if (TREE_CODE (rhs1) == SSA_NAME
623           && SSA_NAME_OCCURS_IN_ABNORMAL_PHI (rhs1))
624         return false;
625       if (rhs2
626           && TREE_CODE (rhs2) == SSA_NAME
627           && SSA_NAME_OCCURS_IN_ABNORMAL_PHI (rhs2))
628         return false;
629       return true;
630     }
631
632   return false;
633 }
634
635
636 /* Return true if STMT is a nop-conversion.  */
637
638 static bool
639 gimple_nop_conversion_p (gimple *stmt)
640 {
641   if (gassign *ass = dyn_cast <gassign *> (stmt))
642     {
643       if (CONVERT_EXPR_CODE_P (gimple_assign_rhs_code (ass))
644           && tree_nop_conversion_p (TREE_TYPE (gimple_assign_lhs (ass)),
645                                     TREE_TYPE (gimple_assign_rhs1 (ass))))
646         return true;
647     }
648   return false;
649 }
650
651 /* Given NAME, if NAME is defined by a unary operation OPCODE, return the
652    operand of the negate operation.  Otherwise, return NULL.  */
653
654 static tree
655 get_unary_op (tree name, enum tree_code opcode)
656 {
657   gimple *stmt = SSA_NAME_DEF_STMT (name);
658
659   /* Look through nop conversions (sign changes).  */
660   if (gimple_nop_conversion_p (stmt)
661       && TREE_CODE (gimple_assign_rhs1 (stmt)) == SSA_NAME)
662     stmt = SSA_NAME_DEF_STMT (gimple_assign_rhs1 (stmt));
663
664   if (!is_gimple_assign (stmt))
665     return NULL_TREE;
666
667   if (gimple_assign_rhs_code (stmt) == opcode)
668     return gimple_assign_rhs1 (stmt);
669   return NULL_TREE;
670 }
671
672 /* Return true if OP1 and OP2 have the same value if casted to either type.  */
673
674 static bool
675 ops_equal_values_p (tree op1, tree op2)
676 {
677   if (op1 == op2)
678     return true;
679
680   tree orig_op1 = op1;
681   if (TREE_CODE (op1) == SSA_NAME)
682     {
683       gimple *stmt = SSA_NAME_DEF_STMT (op1);
684       if (gimple_nop_conversion_p (stmt))
685         {
686           op1 = gimple_assign_rhs1 (stmt);
687           if (op1 == op2)
688             return true;
689         }
690     }
691
692   if (TREE_CODE (op2) == SSA_NAME)
693     {
694       gimple *stmt = SSA_NAME_DEF_STMT (op2);
695       if (gimple_nop_conversion_p (stmt))
696         {
697           op2 = gimple_assign_rhs1 (stmt);
698           if (op1 == op2
699               || orig_op1 == op2)
700             return true;
701         }
702     }
703
704   return false;
705 }
706
707
708 /* If CURR and LAST are a pair of ops that OPCODE allows us to
709    eliminate through equivalences, do so, remove them from OPS, and
710    return true.  Otherwise, return false.  */
711
712 static bool
713 eliminate_duplicate_pair (enum tree_code opcode,
714                           vec<operand_entry *> *ops,
715                           bool *all_done,
716                           unsigned int i,
717                           operand_entry *curr,
718                           operand_entry *last)
719 {
720
721   /* If we have two of the same op, and the opcode is & |, min, or max,
722      we can eliminate one of them.
723      If we have two of the same op, and the opcode is ^, we can
724      eliminate both of them.  */
725
726   if (last && last->op == curr->op)
727     {
728       switch (opcode)
729         {
730         case MAX_EXPR:
731         case MIN_EXPR:
732         case BIT_IOR_EXPR:
733         case BIT_AND_EXPR:
734           if (dump_file && (dump_flags & TDF_DETAILS))
735             {
736               fprintf (dump_file, "Equivalence: ");
737               print_generic_expr (dump_file, curr->op);
738               fprintf (dump_file, " [&|minmax] ");
739               print_generic_expr (dump_file, last->op);
740               fprintf (dump_file, " -> ");
741               print_generic_stmt (dump_file, last->op);
742             }
743
744           ops->ordered_remove (i);
745           reassociate_stats.ops_eliminated ++;
746
747           return true;
748
749         case BIT_XOR_EXPR:
750           if (dump_file && (dump_flags & TDF_DETAILS))
751             {
752               fprintf (dump_file, "Equivalence: ");
753               print_generic_expr (dump_file, curr->op);
754               fprintf (dump_file, " ^ ");
755               print_generic_expr (dump_file, last->op);
756               fprintf (dump_file, " -> nothing\n");
757             }
758
759           reassociate_stats.ops_eliminated += 2;
760
761           if (ops->length () == 2)
762             {
763               ops->truncate (0);
764               add_to_ops_vec (ops, build_zero_cst (TREE_TYPE (last->op)));
765               *all_done = true;
766             }
767           else
768             {
769               ops->ordered_remove (i-1);
770               ops->ordered_remove (i-1);
771             }
772
773           return true;
774
775         default:
776           break;
777         }
778     }
779   return false;
780 }
781
782 static vec<tree> plus_negates;
783
784 /* If OPCODE is PLUS_EXPR, CURR->OP is a negate expression or a bitwise not
785    expression, look in OPS for a corresponding positive operation to cancel
786    it out.  If we find one, remove the other from OPS, replace
787    OPS[CURRINDEX] with 0 or -1, respectively, and return true.  Otherwise,
788    return false. */
789
790 static bool
791 eliminate_plus_minus_pair (enum tree_code opcode,
792                            vec<operand_entry *> *ops,
793                            unsigned int currindex,
794                            operand_entry *curr)
795 {
796   tree negateop;
797   tree notop;
798   unsigned int i;
799   operand_entry *oe;
800
801   if (opcode != PLUS_EXPR || TREE_CODE (curr->op) != SSA_NAME)
802     return false;
803
804   negateop = get_unary_op (curr->op, NEGATE_EXPR);
805   notop = get_unary_op (curr->op, BIT_NOT_EXPR);
806   if (negateop == NULL_TREE && notop == NULL_TREE)
807     return false;
808
809   /* Any non-negated version will have a rank that is one less than
810      the current rank.  So once we hit those ranks, if we don't find
811      one, we can stop.  */
812
813   for (i = currindex + 1;
814        ops->iterate (i, &oe)
815        && oe->rank >= curr->rank - 1 ;
816        i++)
817     {
818       if (negateop
819           && ops_equal_values_p (oe->op, negateop))
820         {
821           if (dump_file && (dump_flags & TDF_DETAILS))
822             {
823               fprintf (dump_file, "Equivalence: ");
824               print_generic_expr (dump_file, negateop);
825               fprintf (dump_file, " + -");
826               print_generic_expr (dump_file, oe->op);
827               fprintf (dump_file, " -> 0\n");
828             }
829
830           ops->ordered_remove (i);
831           add_to_ops_vec (ops, build_zero_cst (TREE_TYPE (oe->op)));
832           ops->ordered_remove (currindex);
833           reassociate_stats.ops_eliminated ++;
834
835           return true;
836         }
837       else if (notop
838                && ops_equal_values_p (oe->op, notop))
839         {
840           tree op_type = TREE_TYPE (oe->op);
841
842           if (dump_file && (dump_flags & TDF_DETAILS))
843             {
844               fprintf (dump_file, "Equivalence: ");
845               print_generic_expr (dump_file, notop);
846               fprintf (dump_file, " + ~");
847               print_generic_expr (dump_file, oe->op);
848               fprintf (dump_file, " -> -1\n");
849             }
850
851           ops->ordered_remove (i);
852           add_to_ops_vec (ops, build_all_ones_cst (op_type));
853           ops->ordered_remove (currindex);
854           reassociate_stats.ops_eliminated ++;
855
856           return true;
857         }
858     }
859
860   /* If CURR->OP is a negate expr without nop conversion in a plus expr: 
861      save it for later inspection in repropagate_negates().  */
862   if (negateop != NULL_TREE
863       && gimple_assign_rhs_code (SSA_NAME_DEF_STMT (curr->op)) == NEGATE_EXPR)
864     plus_negates.safe_push (curr->op);
865
866   return false;
867 }
868
869 /* If OPCODE is BIT_IOR_EXPR, BIT_AND_EXPR, and, CURR->OP is really a
870    bitwise not expression, look in OPS for a corresponding operand to
871    cancel it out.  If we find one, remove the other from OPS, replace
872    OPS[CURRINDEX] with 0, and return true.  Otherwise, return
873    false. */
874
875 static bool
876 eliminate_not_pairs (enum tree_code opcode,
877                      vec<operand_entry *> *ops,
878                      unsigned int currindex,
879                      operand_entry *curr)
880 {
881   tree notop;
882   unsigned int i;
883   operand_entry *oe;
884
885   if ((opcode != BIT_IOR_EXPR && opcode != BIT_AND_EXPR)
886       || TREE_CODE (curr->op) != SSA_NAME)
887     return false;
888
889   notop = get_unary_op (curr->op, BIT_NOT_EXPR);
890   if (notop == NULL_TREE)
891     return false;
892
893   /* Any non-not version will have a rank that is one less than
894      the current rank.  So once we hit those ranks, if we don't find
895      one, we can stop.  */
896
897   for (i = currindex + 1;
898        ops->iterate (i, &oe)
899        && oe->rank >= curr->rank - 1;
900        i++)
901     {
902       if (oe->op == notop)
903         {
904           if (dump_file && (dump_flags & TDF_DETAILS))
905             {
906               fprintf (dump_file, "Equivalence: ");
907               print_generic_expr (dump_file, notop);
908               if (opcode == BIT_AND_EXPR)
909                 fprintf (dump_file, " & ~");
910               else if (opcode == BIT_IOR_EXPR)
911                 fprintf (dump_file, " | ~");
912               print_generic_expr (dump_file, oe->op);
913               if (opcode == BIT_AND_EXPR)
914                 fprintf (dump_file, " -> 0\n");
915               else if (opcode == BIT_IOR_EXPR)
916                 fprintf (dump_file, " -> -1\n");
917             }
918
919           if (opcode == BIT_AND_EXPR)
920             oe->op = build_zero_cst (TREE_TYPE (oe->op));
921           else if (opcode == BIT_IOR_EXPR)
922             oe->op = build_all_ones_cst (TREE_TYPE (oe->op));
923
924           reassociate_stats.ops_eliminated += ops->length () - 1;
925           ops->truncate (0);
926           ops->quick_push (oe);
927           return true;
928         }
929     }
930
931   return false;
932 }
933
934 /* Use constant value that may be present in OPS to try to eliminate
935    operands.  Note that this function is only really used when we've
936    eliminated ops for other reasons, or merged constants.  Across
937    single statements, fold already does all of this, plus more.  There
938    is little point in duplicating logic, so I've only included the
939    identities that I could ever construct testcases to trigger.  */
940
941 static void
942 eliminate_using_constants (enum tree_code opcode,
943                            vec<operand_entry *> *ops)
944 {
945   operand_entry *oelast = ops->last ();
946   tree type = TREE_TYPE (oelast->op);
947
948   if (oelast->rank == 0
949       && (ANY_INTEGRAL_TYPE_P (type) || FLOAT_TYPE_P (type)))
950     {
951       switch (opcode)
952         {
953         case BIT_AND_EXPR:
954           if (integer_zerop (oelast->op))
955             {
956               if (ops->length () != 1)
957                 {
958                   if (dump_file && (dump_flags & TDF_DETAILS))
959                     fprintf (dump_file, "Found & 0, removing all other ops\n");
960
961                   reassociate_stats.ops_eliminated += ops->length () - 1;
962
963                   ops->truncate (0);
964                   ops->quick_push (oelast);
965                   return;
966                 }
967             }
968           else if (integer_all_onesp (oelast->op))
969             {
970               if (ops->length () != 1)
971                 {
972                   if (dump_file && (dump_flags & TDF_DETAILS))
973                     fprintf (dump_file, "Found & -1, removing\n");
974                   ops->pop ();
975                   reassociate_stats.ops_eliminated++;
976                 }
977             }
978           break;
979         case BIT_IOR_EXPR:
980           if (integer_all_onesp (oelast->op))
981             {
982               if (ops->length () != 1)
983                 {
984                   if (dump_file && (dump_flags & TDF_DETAILS))
985                     fprintf (dump_file, "Found | -1, removing all other ops\n");
986
987                   reassociate_stats.ops_eliminated += ops->length () - 1;
988
989                   ops->truncate (0);
990                   ops->quick_push (oelast);
991                   return;
992                 }
993             }
994           else if (integer_zerop (oelast->op))
995             {
996               if (ops->length () != 1)
997                 {
998                   if (dump_file && (dump_flags & TDF_DETAILS))
999                     fprintf (dump_file, "Found | 0, removing\n");
1000                   ops->pop ();
1001                   reassociate_stats.ops_eliminated++;
1002                 }
1003             }
1004           break;
1005         case MULT_EXPR:
1006           if (integer_zerop (oelast->op)
1007               || (FLOAT_TYPE_P (type)
1008                   && !HONOR_NANS (type)
1009                   && !HONOR_SIGNED_ZEROS (type)
1010                   && real_zerop (oelast->op)))
1011             {
1012               if (ops->length () != 1)
1013                 {
1014                   if (dump_file && (dump_flags & TDF_DETAILS))
1015                     fprintf (dump_file, "Found * 0, removing all other ops\n");
1016
1017                   reassociate_stats.ops_eliminated += ops->length () - 1;
1018                   ops->truncate (1);
1019                   ops->quick_push (oelast);
1020                   return;
1021                 }
1022             }
1023           else if (integer_onep (oelast->op)
1024                    || (FLOAT_TYPE_P (type)
1025                        && !HONOR_SNANS (type)
1026                        && real_onep (oelast->op)))
1027             {
1028               if (ops->length () != 1)
1029                 {
1030                   if (dump_file && (dump_flags & TDF_DETAILS))
1031                     fprintf (dump_file, "Found * 1, removing\n");
1032                   ops->pop ();
1033                   reassociate_stats.ops_eliminated++;
1034                   return;
1035                 }
1036             }
1037           break;
1038         case BIT_XOR_EXPR:
1039         case PLUS_EXPR:
1040         case MINUS_EXPR:
1041           if (integer_zerop (oelast->op)
1042               || (FLOAT_TYPE_P (type)
1043                   && (opcode == PLUS_EXPR || opcode == MINUS_EXPR)
1044                   && fold_real_zero_addition_p (type, oelast->op,
1045                                                 opcode == MINUS_EXPR)))
1046             {
1047               if (ops->length () != 1)
1048                 {
1049                   if (dump_file && (dump_flags & TDF_DETAILS))
1050                     fprintf (dump_file, "Found [|^+] 0, removing\n");
1051                   ops->pop ();
1052                   reassociate_stats.ops_eliminated++;
1053                   return;
1054                 }
1055             }
1056           break;
1057         default:
1058           break;
1059         }
1060     }
1061 }
1062
1063
1064 static void linearize_expr_tree (vec<operand_entry *> *, gimple *,
1065                                  bool, bool);
1066
1067 /* Structure for tracking and counting operands.  */
1068 struct oecount {
1069   unsigned int cnt;
1070   unsigned int id;
1071   enum tree_code oecode;
1072   tree op;
1073 };
1074
1075
1076 /* The heap for the oecount hashtable and the sorted list of operands.  */
1077 static vec<oecount> cvec;
1078
1079
1080 /* Oecount hashtable helpers.  */
1081
1082 struct oecount_hasher : int_hash <int, 0, 1>
1083 {
1084   static inline hashval_t hash (int);
1085   static inline bool equal (int, int);
1086 };
1087
1088 /* Hash function for oecount.  */
1089
1090 inline hashval_t
1091 oecount_hasher::hash (int p)
1092 {
1093   const oecount *c = &cvec[p - 42];
1094   return htab_hash_pointer (c->op) ^ (hashval_t)c->oecode;
1095 }
1096
1097 /* Comparison function for oecount.  */
1098
1099 inline bool
1100 oecount_hasher::equal (int p1, int p2)
1101 {
1102   const oecount *c1 = &cvec[p1 - 42];
1103   const oecount *c2 = &cvec[p2 - 42];
1104   return c1->oecode == c2->oecode && c1->op == c2->op;
1105 }
1106
1107 /* Comparison function for qsort sorting oecount elements by count.  */
1108
1109 static int
1110 oecount_cmp (const void *p1, const void *p2)
1111 {
1112   const oecount *c1 = (const oecount *)p1;
1113   const oecount *c2 = (const oecount *)p2;
1114   if (c1->cnt != c2->cnt)
1115     return c1->cnt > c2->cnt ? 1 : -1;
1116   else
1117     /* If counts are identical, use unique IDs to stabilize qsort.  */
1118     return c1->id > c2->id ? 1 : -1;
1119 }
1120
1121 /* Return TRUE iff STMT represents a builtin call that raises OP
1122    to some exponent.  */
1123
1124 static bool
1125 stmt_is_power_of_op (gimple *stmt, tree op)
1126 {
1127   if (!is_gimple_call (stmt))
1128     return false;
1129
1130   switch (gimple_call_combined_fn (stmt))
1131     {
1132     CASE_CFN_POW:
1133     CASE_CFN_POWI:
1134       return (operand_equal_p (gimple_call_arg (stmt, 0), op, 0));
1135       
1136     default:
1137       return false;
1138     }
1139 }
1140
1141 /* Given STMT which is a __builtin_pow* call, decrement its exponent
1142    in place and return the result.  Assumes that stmt_is_power_of_op
1143    was previously called for STMT and returned TRUE.  */
1144
1145 static HOST_WIDE_INT
1146 decrement_power (gimple *stmt)
1147 {
1148   REAL_VALUE_TYPE c, cint;
1149   HOST_WIDE_INT power;
1150   tree arg1;
1151
1152   switch (gimple_call_combined_fn (stmt))
1153     {
1154     CASE_CFN_POW:
1155       arg1 = gimple_call_arg (stmt, 1);
1156       c = TREE_REAL_CST (arg1);
1157       power = real_to_integer (&c) - 1;
1158       real_from_integer (&cint, VOIDmode, power, SIGNED);
1159       gimple_call_set_arg (stmt, 1, build_real (TREE_TYPE (arg1), cint));
1160       return power;
1161
1162     CASE_CFN_POWI:
1163       arg1 = gimple_call_arg (stmt, 1);
1164       power = TREE_INT_CST_LOW (arg1) - 1;
1165       gimple_call_set_arg (stmt, 1, build_int_cst (TREE_TYPE (arg1), power));
1166       return power;
1167
1168     default:
1169       gcc_unreachable ();
1170     }
1171 }
1172
1173 /* Replace SSA defined by STMT and replace all its uses with new
1174    SSA.  Also return the new SSA.  */
1175
1176 static tree
1177 make_new_ssa_for_def (gimple *stmt, enum tree_code opcode, tree op)
1178 {
1179   gimple *use_stmt;
1180   use_operand_p use;
1181   imm_use_iterator iter;
1182   tree new_lhs, new_debug_lhs = NULL_TREE;
1183   tree lhs = gimple_get_lhs (stmt);
1184
1185   new_lhs = make_ssa_name (TREE_TYPE (lhs));
1186   gimple_set_lhs (stmt, new_lhs);
1187
1188   /* Also need to update GIMPLE_DEBUGs.  */
1189   FOR_EACH_IMM_USE_STMT (use_stmt, iter, lhs)
1190     {
1191       tree repl = new_lhs;
1192       if (is_gimple_debug (use_stmt))
1193         {
1194           if (new_debug_lhs == NULL_TREE)
1195             {
1196               new_debug_lhs = make_node (DEBUG_EXPR_DECL);
1197               gdebug *def_temp
1198                 = gimple_build_debug_bind (new_debug_lhs,
1199                                            build2 (opcode, TREE_TYPE (lhs),
1200                                                    new_lhs, op),
1201                                            stmt);
1202               DECL_ARTIFICIAL (new_debug_lhs) = 1;
1203               TREE_TYPE (new_debug_lhs) = TREE_TYPE (lhs);
1204               SET_DECL_MODE (new_debug_lhs, TYPE_MODE (TREE_TYPE (lhs)));
1205               gimple_set_uid (def_temp, gimple_uid (stmt));
1206               gimple_stmt_iterator gsi = gsi_for_stmt (stmt);
1207               gsi_insert_after (&gsi, def_temp, GSI_SAME_STMT);
1208             }
1209           repl = new_debug_lhs;
1210         }
1211       FOR_EACH_IMM_USE_ON_STMT (use, iter)
1212         SET_USE (use, repl);
1213       update_stmt (use_stmt);
1214     }
1215   return new_lhs;
1216 }
1217
1218 /* Replace all SSAs defined in STMTS_TO_FIX and replace its
1219    uses with new SSAs.  Also do this for the stmt that defines DEF
1220    if *DEF is not OP.  */
1221
1222 static void
1223 make_new_ssa_for_all_defs (tree *def, enum tree_code opcode, tree op,
1224                            vec<gimple *> &stmts_to_fix)
1225 {
1226   unsigned i;
1227   gimple *stmt;
1228
1229   if (*def != op
1230       && TREE_CODE (*def) == SSA_NAME
1231       && (stmt = SSA_NAME_DEF_STMT (*def))
1232       && gimple_code (stmt) != GIMPLE_NOP)
1233     *def = make_new_ssa_for_def (stmt, opcode, op);
1234
1235   FOR_EACH_VEC_ELT (stmts_to_fix, i, stmt)
1236     make_new_ssa_for_def (stmt, opcode, op);
1237 }
1238
1239 /* Find the single immediate use of STMT's LHS, and replace it
1240    with OP.  Remove STMT.  If STMT's LHS is the same as *DEF,
1241    replace *DEF with OP as well.  */
1242
1243 static void
1244 propagate_op_to_single_use (tree op, gimple *stmt, tree *def)
1245 {
1246   tree lhs;
1247   gimple *use_stmt;
1248   use_operand_p use;
1249   gimple_stmt_iterator gsi;
1250
1251   if (is_gimple_call (stmt))
1252     lhs = gimple_call_lhs (stmt);
1253   else
1254     lhs = gimple_assign_lhs (stmt);
1255
1256   gcc_assert (has_single_use (lhs));
1257   single_imm_use (lhs, &use, &use_stmt);
1258   if (lhs == *def)
1259     *def = op;
1260   SET_USE (use, op);
1261   if (TREE_CODE (op) != SSA_NAME)
1262     update_stmt (use_stmt);
1263   gsi = gsi_for_stmt (stmt);
1264   unlink_stmt_vdef (stmt);
1265   reassoc_remove_stmt (&gsi);
1266   release_defs (stmt);
1267 }
1268
1269 /* Walks the linear chain with result *DEF searching for an operation
1270    with operand OP and code OPCODE removing that from the chain.  *DEF
1271    is updated if there is only one operand but no operation left.  */
1272
1273 static void
1274 zero_one_operation (tree *def, enum tree_code opcode, tree op)
1275 {
1276   tree orig_def = *def;
1277   gimple *stmt = SSA_NAME_DEF_STMT (*def);
1278   /* PR72835 - Record the stmt chain that has to be updated such that
1279      we dont use the same LHS when the values computed are different.  */
1280   auto_vec<gimple *, 64> stmts_to_fix;
1281
1282   do
1283     {
1284       tree name;
1285
1286       if (opcode == MULT_EXPR)
1287         {
1288           if (stmt_is_power_of_op (stmt, op))
1289             {
1290               if (decrement_power (stmt) == 1)
1291                 {
1292                   if (stmts_to_fix.length () > 0)
1293                     stmts_to_fix.pop ();
1294                   propagate_op_to_single_use (op, stmt, def);
1295                 }
1296               break;
1297             }
1298           else if (gimple_assign_rhs_code (stmt) == NEGATE_EXPR)
1299             {
1300               if (gimple_assign_rhs1 (stmt) == op)
1301                 {
1302                   tree cst = build_minus_one_cst (TREE_TYPE (op));
1303                   if (stmts_to_fix.length () > 0)
1304                     stmts_to_fix.pop ();
1305                   propagate_op_to_single_use (cst, stmt, def);
1306                   break;
1307                 }
1308               else if (integer_minus_onep (op)
1309                        || real_minus_onep (op))
1310                 {
1311                   gimple_assign_set_rhs_code
1312                     (stmt, TREE_CODE (gimple_assign_rhs1 (stmt)));
1313                   break;
1314                 }
1315             }
1316         }
1317
1318       name = gimple_assign_rhs1 (stmt);
1319
1320       /* If this is the operation we look for and one of the operands
1321          is ours simply propagate the other operand into the stmts
1322          single use.  */
1323       if (gimple_assign_rhs_code (stmt) == opcode
1324           && (name == op
1325               || gimple_assign_rhs2 (stmt) == op))
1326         {
1327           if (name == op)
1328             name = gimple_assign_rhs2 (stmt);
1329           if (stmts_to_fix.length () > 0)
1330             stmts_to_fix.pop ();
1331           propagate_op_to_single_use (name, stmt, def);
1332           break;
1333         }
1334
1335       /* We might have a multiply of two __builtin_pow* calls, and
1336          the operand might be hiding in the rightmost one.  Likewise
1337          this can happen for a negate.  */
1338       if (opcode == MULT_EXPR
1339           && gimple_assign_rhs_code (stmt) == opcode
1340           && TREE_CODE (gimple_assign_rhs2 (stmt)) == SSA_NAME
1341           && has_single_use (gimple_assign_rhs2 (stmt)))
1342         {
1343           gimple *stmt2 = SSA_NAME_DEF_STMT (gimple_assign_rhs2 (stmt));
1344           if (stmt_is_power_of_op (stmt2, op))
1345             {
1346               if (decrement_power (stmt2) == 1)
1347                 propagate_op_to_single_use (op, stmt2, def);
1348               else
1349                 stmts_to_fix.safe_push (stmt2);
1350               break;
1351             }
1352           else if (is_gimple_assign (stmt2)
1353                    && gimple_assign_rhs_code (stmt2) == NEGATE_EXPR)
1354             {
1355               if (gimple_assign_rhs1 (stmt2) == op)
1356                 {
1357                   tree cst = build_minus_one_cst (TREE_TYPE (op));
1358                   propagate_op_to_single_use (cst, stmt2, def);
1359                   break;
1360                 }
1361               else if (integer_minus_onep (op)
1362                        || real_minus_onep (op))
1363                 {
1364                   stmts_to_fix.safe_push (stmt2);
1365                   gimple_assign_set_rhs_code
1366                     (stmt2, TREE_CODE (gimple_assign_rhs1 (stmt2)));
1367                   break;
1368                 }
1369             }
1370         }
1371
1372       /* Continue walking the chain.  */
1373       gcc_assert (name != op
1374                   && TREE_CODE (name) == SSA_NAME);
1375       stmt = SSA_NAME_DEF_STMT (name);
1376       stmts_to_fix.safe_push (stmt);
1377     }
1378   while (1);
1379
1380   if (stmts_to_fix.length () > 0 || *def == orig_def)
1381     make_new_ssa_for_all_defs (def, opcode, op, stmts_to_fix);
1382 }
1383
1384 /* Returns true if statement S1 dominates statement S2.  Like
1385    stmt_dominates_stmt_p, but uses stmt UIDs to optimize.  */
1386
1387 static bool
1388 reassoc_stmt_dominates_stmt_p (gimple *s1, gimple *s2)
1389 {
1390   basic_block bb1 = gimple_bb (s1), bb2 = gimple_bb (s2);
1391
1392   /* If bb1 is NULL, it should be a GIMPLE_NOP def stmt of an (D)
1393      SSA_NAME.  Assume it lives at the beginning of function and
1394      thus dominates everything.  */
1395   if (!bb1 || s1 == s2)
1396     return true;
1397
1398   /* If bb2 is NULL, it doesn't dominate any stmt with a bb.  */
1399   if (!bb2)
1400     return false;
1401
1402   if (bb1 == bb2)
1403     {
1404       /* PHIs in the same basic block are assumed to be
1405          executed all in parallel, if only one stmt is a PHI,
1406          it dominates the other stmt in the same basic block.  */
1407       if (gimple_code (s1) == GIMPLE_PHI)
1408         return true;
1409
1410       if (gimple_code (s2) == GIMPLE_PHI)
1411         return false;
1412
1413       gcc_assert (gimple_uid (s1) && gimple_uid (s2));
1414
1415       if (gimple_uid (s1) < gimple_uid (s2))
1416         return true;
1417
1418       if (gimple_uid (s1) > gimple_uid (s2))
1419         return false;
1420
1421       gimple_stmt_iterator gsi = gsi_for_stmt (s1);
1422       unsigned int uid = gimple_uid (s1);
1423       for (gsi_next (&gsi); !gsi_end_p (gsi); gsi_next (&gsi))
1424         {
1425           gimple *s = gsi_stmt (gsi);
1426           if (gimple_uid (s) != uid)
1427             break;
1428           if (s == s2)
1429             return true;
1430         }
1431
1432       return false;
1433     }
1434
1435   return dominated_by_p (CDI_DOMINATORS, bb2, bb1);
1436 }
1437
1438 /* Insert STMT after INSERT_POINT.  */
1439
1440 static void
1441 insert_stmt_after (gimple *stmt, gimple *insert_point)
1442 {
1443   gimple_stmt_iterator gsi;
1444   basic_block bb;
1445
1446   if (gimple_code (insert_point) == GIMPLE_PHI)
1447     bb = gimple_bb (insert_point);
1448   else if (!stmt_ends_bb_p (insert_point))
1449     {
1450       gsi = gsi_for_stmt (insert_point);
1451       gimple_set_uid (stmt, gimple_uid (insert_point));
1452       gsi_insert_after (&gsi, stmt, GSI_NEW_STMT);
1453       return;
1454     }
1455   else
1456     /* We assume INSERT_POINT is a SSA_NAME_DEF_STMT of some SSA_NAME,
1457        thus if it must end a basic block, it should be a call that can
1458        throw, or some assignment that can throw.  If it throws, the LHS
1459        of it will not be initialized though, so only valid places using
1460        the SSA_NAME should be dominated by the fallthru edge.  */
1461     bb = find_fallthru_edge (gimple_bb (insert_point)->succs)->dest;
1462   gsi = gsi_after_labels (bb);
1463   if (gsi_end_p (gsi))
1464     {
1465       gimple_stmt_iterator gsi2 = gsi_last_bb (bb);
1466       gimple_set_uid (stmt,
1467                       gsi_end_p (gsi2) ? 1 : gimple_uid (gsi_stmt (gsi2)));
1468     }
1469   else
1470     gimple_set_uid (stmt, gimple_uid (gsi_stmt (gsi)));
1471   gsi_insert_before (&gsi, stmt, GSI_SAME_STMT);
1472 }
1473
1474 /* Builds one statement performing OP1 OPCODE OP2 using TMPVAR for
1475    the result.  Places the statement after the definition of either
1476    OP1 or OP2.  Returns the new statement.  */
1477
1478 static gimple *
1479 build_and_add_sum (tree type, tree op1, tree op2, enum tree_code opcode)
1480 {
1481   gimple *op1def = NULL, *op2def = NULL;
1482   gimple_stmt_iterator gsi;
1483   tree op;
1484   gassign *sum;
1485
1486   /* Create the addition statement.  */
1487   op = make_ssa_name (type);
1488   sum = gimple_build_assign (op, opcode, op1, op2);
1489
1490   /* Find an insertion place and insert.  */
1491   if (TREE_CODE (op1) == SSA_NAME)
1492     op1def = SSA_NAME_DEF_STMT (op1);
1493   if (TREE_CODE (op2) == SSA_NAME)
1494     op2def = SSA_NAME_DEF_STMT (op2);
1495   if ((!op1def || gimple_nop_p (op1def))
1496       && (!op2def || gimple_nop_p (op2def)))
1497     {
1498       gsi = gsi_after_labels (single_succ (ENTRY_BLOCK_PTR_FOR_FN (cfun)));
1499       if (gsi_end_p (gsi))
1500         {
1501           gimple_stmt_iterator gsi2
1502             = gsi_last_bb (single_succ (ENTRY_BLOCK_PTR_FOR_FN (cfun)));
1503           gimple_set_uid (sum,
1504                           gsi_end_p (gsi2) ? 1 : gimple_uid (gsi_stmt (gsi2)));
1505         }
1506       else
1507         gimple_set_uid (sum, gimple_uid (gsi_stmt (gsi)));
1508       gsi_insert_before (&gsi, sum, GSI_NEW_STMT);
1509     }
1510   else
1511     {
1512       gimple *insert_point;
1513       if ((!op1def || gimple_nop_p (op1def))
1514            || (op2def && !gimple_nop_p (op2def)
1515                && reassoc_stmt_dominates_stmt_p (op1def, op2def)))
1516         insert_point = op2def;
1517       else
1518         insert_point = op1def;
1519       insert_stmt_after (sum, insert_point);
1520     }
1521   update_stmt (sum);
1522
1523   return sum;
1524 }
1525
1526 /* Perform un-distribution of divisions and multiplications.
1527    A * X + B * X is transformed into (A + B) * X and A / X + B / X
1528    to (A + B) / X for real X.
1529
1530    The algorithm is organized as follows.
1531
1532     - First we walk the addition chain *OPS looking for summands that
1533       are defined by a multiplication or a real division.  This results
1534       in the candidates bitmap with relevant indices into *OPS.
1535
1536     - Second we build the chains of multiplications or divisions for
1537       these candidates, counting the number of occurrences of (operand, code)
1538       pairs in all of the candidates chains.
1539
1540     - Third we sort the (operand, code) pairs by number of occurrence and
1541       process them starting with the pair with the most uses.
1542
1543       * For each such pair we walk the candidates again to build a
1544         second candidate bitmap noting all multiplication/division chains
1545         that have at least one occurrence of (operand, code).
1546
1547       * We build an alternate addition chain only covering these
1548         candidates with one (operand, code) operation removed from their
1549         multiplication/division chain.
1550
1551       * The first candidate gets replaced by the alternate addition chain
1552         multiplied/divided by the operand.
1553
1554       * All candidate chains get disabled for further processing and
1555         processing of (operand, code) pairs continues.
1556
1557   The alternate addition chains built are re-processed by the main
1558   reassociation algorithm which allows optimizing a * x * y + b * y * x
1559   to (a + b ) * x * y in one invocation of the reassociation pass.  */
1560
1561 static bool
1562 undistribute_ops_list (enum tree_code opcode,
1563                        vec<operand_entry *> *ops, struct loop *loop)
1564 {
1565   unsigned int length = ops->length ();
1566   operand_entry *oe1;
1567   unsigned i, j;
1568   unsigned nr_candidates, nr_candidates2;
1569   sbitmap_iterator sbi0;
1570   vec<operand_entry *> *subops;
1571   bool changed = false;
1572   unsigned int next_oecount_id = 0;
1573
1574   if (length <= 1
1575       || opcode != PLUS_EXPR)
1576     return false;
1577
1578   /* Build a list of candidates to process.  */
1579   auto_sbitmap candidates (length);
1580   bitmap_clear (candidates);
1581   nr_candidates = 0;
1582   FOR_EACH_VEC_ELT (*ops, i, oe1)
1583     {
1584       enum tree_code dcode;
1585       gimple *oe1def;
1586
1587       if (TREE_CODE (oe1->op) != SSA_NAME)
1588         continue;
1589       oe1def = SSA_NAME_DEF_STMT (oe1->op);
1590       if (!is_gimple_assign (oe1def))
1591         continue;
1592       dcode = gimple_assign_rhs_code (oe1def);
1593       if ((dcode != MULT_EXPR
1594            && dcode != RDIV_EXPR)
1595           || !is_reassociable_op (oe1def, dcode, loop))
1596         continue;
1597
1598       bitmap_set_bit (candidates, i);
1599       nr_candidates++;
1600     }
1601
1602   if (nr_candidates < 2)
1603     return false;
1604
1605   if (dump_file && (dump_flags & TDF_DETAILS))
1606     {
1607       fprintf (dump_file, "searching for un-distribute opportunities ");
1608       print_generic_expr (dump_file,
1609         (*ops)[bitmap_first_set_bit (candidates)]->op, 0);
1610       fprintf (dump_file, " %d\n", nr_candidates);
1611     }
1612
1613   /* Build linearized sub-operand lists and the counting table.  */
1614   cvec.create (0);
1615
1616   hash_table<oecount_hasher> ctable (15);
1617
1618   /* ??? Macro arguments cannot have multi-argument template types in
1619      them.  This typedef is needed to workaround that limitation.  */
1620   typedef vec<operand_entry *> vec_operand_entry_t_heap;
1621   subops = XCNEWVEC (vec_operand_entry_t_heap, ops->length ());
1622   EXECUTE_IF_SET_IN_BITMAP (candidates, 0, i, sbi0)
1623     {
1624       gimple *oedef;
1625       enum tree_code oecode;
1626       unsigned j;
1627
1628       oedef = SSA_NAME_DEF_STMT ((*ops)[i]->op);
1629       oecode = gimple_assign_rhs_code (oedef);
1630       linearize_expr_tree (&subops[i], oedef,
1631                            associative_tree_code (oecode), false);
1632
1633       FOR_EACH_VEC_ELT (subops[i], j, oe1)
1634         {
1635           oecount c;
1636           int *slot;
1637           int idx;
1638           c.oecode = oecode;
1639           c.cnt = 1;
1640           c.id = next_oecount_id++;
1641           c.op = oe1->op;
1642           cvec.safe_push (c);
1643           idx = cvec.length () + 41;
1644           slot = ctable.find_slot (idx, INSERT);
1645           if (!*slot)
1646             {
1647               *slot = idx;
1648             }
1649           else
1650             {
1651               cvec.pop ();
1652               cvec[*slot - 42].cnt++;
1653             }
1654         }
1655     }
1656
1657   /* Sort the counting table.  */
1658   cvec.qsort (oecount_cmp);
1659
1660   if (dump_file && (dump_flags & TDF_DETAILS))
1661     {
1662       oecount *c;
1663       fprintf (dump_file, "Candidates:\n");
1664       FOR_EACH_VEC_ELT (cvec, j, c)
1665         {
1666           fprintf (dump_file, "  %u %s: ", c->cnt,
1667                    c->oecode == MULT_EXPR
1668                    ? "*" : c->oecode == RDIV_EXPR ? "/" : "?");
1669           print_generic_expr (dump_file, c->op);
1670           fprintf (dump_file, "\n");
1671         }
1672     }
1673
1674   /* Process the (operand, code) pairs in order of most occurrence.  */
1675   auto_sbitmap candidates2 (length);
1676   while (!cvec.is_empty ())
1677     {
1678       oecount *c = &cvec.last ();
1679       if (c->cnt < 2)
1680         break;
1681
1682       /* Now collect the operands in the outer chain that contain
1683          the common operand in their inner chain.  */
1684       bitmap_clear (candidates2);
1685       nr_candidates2 = 0;
1686       EXECUTE_IF_SET_IN_BITMAP (candidates, 0, i, sbi0)
1687         {
1688           gimple *oedef;
1689           enum tree_code oecode;
1690           unsigned j;
1691           tree op = (*ops)[i]->op;
1692
1693           /* If we undistributed in this chain already this may be
1694              a constant.  */
1695           if (TREE_CODE (op) != SSA_NAME)
1696             continue;
1697
1698           oedef = SSA_NAME_DEF_STMT (op);
1699           oecode = gimple_assign_rhs_code (oedef);
1700           if (oecode != c->oecode)
1701             continue;
1702
1703           FOR_EACH_VEC_ELT (subops[i], j, oe1)
1704             {
1705               if (oe1->op == c->op)
1706                 {
1707                   bitmap_set_bit (candidates2, i);
1708                   ++nr_candidates2;
1709                   break;
1710                 }
1711             }
1712         }
1713
1714       if (nr_candidates2 >= 2)
1715         {
1716           operand_entry *oe1, *oe2;
1717           gimple *prod;
1718           int first = bitmap_first_set_bit (candidates2);
1719
1720           /* Build the new addition chain.  */
1721           oe1 = (*ops)[first];
1722           if (dump_file && (dump_flags & TDF_DETAILS))
1723             {
1724               fprintf (dump_file, "Building (");
1725               print_generic_expr (dump_file, oe1->op);
1726             }
1727           zero_one_operation (&oe1->op, c->oecode, c->op);
1728           EXECUTE_IF_SET_IN_BITMAP (candidates2, first+1, i, sbi0)
1729             {
1730               gimple *sum;
1731               oe2 = (*ops)[i];
1732               if (dump_file && (dump_flags & TDF_DETAILS))
1733                 {
1734                   fprintf (dump_file, " + ");
1735                   print_generic_expr (dump_file, oe2->op);
1736                 }
1737               zero_one_operation (&oe2->op, c->oecode, c->op);
1738               sum = build_and_add_sum (TREE_TYPE (oe1->op),
1739                                        oe1->op, oe2->op, opcode);
1740               oe2->op = build_zero_cst (TREE_TYPE (oe2->op));
1741               oe2->rank = 0;
1742               oe1->op = gimple_get_lhs (sum);
1743             }
1744
1745           /* Apply the multiplication/division.  */
1746           prod = build_and_add_sum (TREE_TYPE (oe1->op),
1747                                     oe1->op, c->op, c->oecode);
1748           if (dump_file && (dump_flags & TDF_DETAILS))
1749             {
1750               fprintf (dump_file, ") %s ", c->oecode == MULT_EXPR ? "*" : "/");
1751               print_generic_expr (dump_file, c->op);
1752               fprintf (dump_file, "\n");
1753             }
1754
1755           /* Record it in the addition chain and disable further
1756              undistribution with this op.  */
1757           oe1->op = gimple_assign_lhs (prod);
1758           oe1->rank = get_rank (oe1->op);
1759           subops[first].release ();
1760
1761           changed = true;
1762         }
1763
1764       cvec.pop ();
1765     }
1766
1767   for (i = 0; i < ops->length (); ++i)
1768     subops[i].release ();
1769   free (subops);
1770   cvec.release ();
1771
1772   return changed;
1773 }
1774
1775 /* If OPCODE is BIT_IOR_EXPR or BIT_AND_EXPR and CURR is a comparison
1776    expression, examine the other OPS to see if any of them are comparisons
1777    of the same values, which we may be able to combine or eliminate.
1778    For example, we can rewrite (a < b) | (a == b) as (a <= b).  */
1779
1780 static bool
1781 eliminate_redundant_comparison (enum tree_code opcode,
1782                                 vec<operand_entry *> *ops,
1783                                 unsigned int currindex,
1784                                 operand_entry *curr)
1785 {
1786   tree op1, op2;
1787   enum tree_code lcode, rcode;
1788   gimple *def1, *def2;
1789   int i;
1790   operand_entry *oe;
1791
1792   if (opcode != BIT_IOR_EXPR && opcode != BIT_AND_EXPR)
1793     return false;
1794
1795   /* Check that CURR is a comparison.  */
1796   if (TREE_CODE (curr->op) != SSA_NAME)
1797     return false;
1798   def1 = SSA_NAME_DEF_STMT (curr->op);
1799   if (!is_gimple_assign (def1))
1800     return false;
1801   lcode = gimple_assign_rhs_code (def1);
1802   if (TREE_CODE_CLASS (lcode) != tcc_comparison)
1803     return false;
1804   op1 = gimple_assign_rhs1 (def1);
1805   op2 = gimple_assign_rhs2 (def1);
1806
1807   /* Now look for a similar comparison in the remaining OPS.  */
1808   for (i = currindex + 1; ops->iterate (i, &oe); i++)
1809     {
1810       tree t;
1811
1812       if (TREE_CODE (oe->op) != SSA_NAME)
1813         continue;
1814       def2 = SSA_NAME_DEF_STMT (oe->op);
1815       if (!is_gimple_assign (def2))
1816         continue;
1817       rcode = gimple_assign_rhs_code (def2);
1818       if (TREE_CODE_CLASS (rcode) != tcc_comparison)
1819         continue;
1820
1821       /* If we got here, we have a match.  See if we can combine the
1822          two comparisons.  */
1823       if (opcode == BIT_IOR_EXPR)
1824         t = maybe_fold_or_comparisons (lcode, op1, op2,
1825                                        rcode, gimple_assign_rhs1 (def2),
1826                                        gimple_assign_rhs2 (def2));
1827       else
1828         t = maybe_fold_and_comparisons (lcode, op1, op2,
1829                                         rcode, gimple_assign_rhs1 (def2),
1830                                         gimple_assign_rhs2 (def2));
1831       if (!t)
1832         continue;
1833
1834       /* maybe_fold_and_comparisons and maybe_fold_or_comparisons
1835          always give us a boolean_type_node value back.  If the original
1836          BIT_AND_EXPR or BIT_IOR_EXPR was of a wider integer type,
1837          we need to convert.  */
1838       if (!useless_type_conversion_p (TREE_TYPE (curr->op), TREE_TYPE (t)))
1839         t = fold_convert (TREE_TYPE (curr->op), t);
1840
1841       if (TREE_CODE (t) != INTEGER_CST
1842           && !operand_equal_p (t, curr->op, 0))
1843         {
1844           enum tree_code subcode;
1845           tree newop1, newop2;
1846           if (!COMPARISON_CLASS_P (t))
1847             continue;
1848           extract_ops_from_tree (t, &subcode, &newop1, &newop2);
1849           STRIP_USELESS_TYPE_CONVERSION (newop1);
1850           STRIP_USELESS_TYPE_CONVERSION (newop2);
1851           if (!is_gimple_val (newop1) || !is_gimple_val (newop2))
1852             continue;
1853         }
1854
1855       if (dump_file && (dump_flags & TDF_DETAILS))
1856         {
1857           fprintf (dump_file, "Equivalence: ");
1858           print_generic_expr (dump_file, curr->op);
1859           fprintf (dump_file, " %s ", op_symbol_code (opcode));
1860           print_generic_expr (dump_file, oe->op);
1861           fprintf (dump_file, " -> ");
1862           print_generic_expr (dump_file, t);
1863           fprintf (dump_file, "\n");
1864         }
1865
1866       /* Now we can delete oe, as it has been subsumed by the new combined
1867          expression t.  */
1868       ops->ordered_remove (i);
1869       reassociate_stats.ops_eliminated ++;
1870
1871       /* If t is the same as curr->op, we're done.  Otherwise we must
1872          replace curr->op with t.  Special case is if we got a constant
1873          back, in which case we add it to the end instead of in place of
1874          the current entry.  */
1875       if (TREE_CODE (t) == INTEGER_CST)
1876         {
1877           ops->ordered_remove (currindex);
1878           add_to_ops_vec (ops, t);
1879         }
1880       else if (!operand_equal_p (t, curr->op, 0))
1881         {
1882           gimple *sum;
1883           enum tree_code subcode;
1884           tree newop1;
1885           tree newop2;
1886           gcc_assert (COMPARISON_CLASS_P (t));
1887           extract_ops_from_tree (t, &subcode, &newop1, &newop2);
1888           STRIP_USELESS_TYPE_CONVERSION (newop1);
1889           STRIP_USELESS_TYPE_CONVERSION (newop2);
1890           gcc_checking_assert (is_gimple_val (newop1)
1891                                && is_gimple_val (newop2));
1892           sum = build_and_add_sum (TREE_TYPE (t), newop1, newop2, subcode);
1893           curr->op = gimple_get_lhs (sum);
1894         }
1895       return true;
1896     }
1897
1898   return false;
1899 }
1900
1901
1902 /* Transform repeated addition of same values into multiply with
1903    constant.  */
1904 static bool
1905 transform_add_to_multiply (vec<operand_entry *> *ops)
1906 {
1907   operand_entry *oe;
1908   tree op = NULL_TREE;
1909   int j;
1910   int i, start = -1, end = 0, count = 0;
1911   auto_vec<std::pair <int, int> > indxs;
1912   bool changed = false;
1913
1914   if (!INTEGRAL_TYPE_P (TREE_TYPE ((*ops)[0]->op))
1915       && (!SCALAR_FLOAT_TYPE_P (TREE_TYPE ((*ops)[0]->op))
1916           || !flag_unsafe_math_optimizations))
1917     return false;
1918
1919   /* Look for repeated operands.  */
1920   FOR_EACH_VEC_ELT (*ops, i, oe)
1921     {
1922       if (start == -1)
1923         {
1924           count = 1;
1925           op = oe->op;
1926           start = i;
1927         }
1928       else if (operand_equal_p (oe->op, op, 0))
1929         {
1930           count++;
1931           end = i;
1932         }
1933       else
1934         {
1935           if (count > 1)
1936             indxs.safe_push (std::make_pair (start, end));
1937           count = 1;
1938           op = oe->op;
1939           start = i;
1940         }
1941     }
1942
1943   if (count > 1)
1944     indxs.safe_push (std::make_pair (start, end));
1945
1946   for (j = indxs.length () - 1; j >= 0; --j)
1947     {
1948       /* Convert repeated operand addition to multiplication.  */
1949       start = indxs[j].first;
1950       end = indxs[j].second;
1951       op = (*ops)[start]->op;
1952       count = end - start + 1;
1953       for (i = end; i >= start; --i)
1954         ops->unordered_remove (i);
1955       tree tmp = make_ssa_name (TREE_TYPE (op));
1956       tree cst = build_int_cst (integer_type_node, count);
1957       gassign *mul_stmt
1958         = gimple_build_assign (tmp, MULT_EXPR,
1959                                op, fold_convert (TREE_TYPE (op), cst));
1960       gimple_set_visited (mul_stmt, true);
1961       add_to_ops_vec (ops, tmp, mul_stmt);
1962       changed = true;
1963     }
1964
1965   return changed;
1966 }
1967
1968
1969 /* Perform various identities and other optimizations on the list of
1970    operand entries, stored in OPS.  The tree code for the binary
1971    operation between all the operands is OPCODE.  */
1972
1973 static void
1974 optimize_ops_list (enum tree_code opcode,
1975                    vec<operand_entry *> *ops)
1976 {
1977   unsigned int length = ops->length ();
1978   unsigned int i;
1979   operand_entry *oe;
1980   operand_entry *oelast = NULL;
1981   bool iterate = false;
1982
1983   if (length == 1)
1984     return;
1985
1986   oelast = ops->last ();
1987
1988   /* If the last two are constants, pop the constants off, merge them
1989      and try the next two.  */
1990   if (oelast->rank == 0 && is_gimple_min_invariant (oelast->op))
1991     {
1992       operand_entry *oelm1 = (*ops)[length - 2];
1993
1994       if (oelm1->rank == 0
1995           && is_gimple_min_invariant (oelm1->op)
1996           && useless_type_conversion_p (TREE_TYPE (oelm1->op),
1997                                        TREE_TYPE (oelast->op)))
1998         {
1999           tree folded = fold_binary (opcode, TREE_TYPE (oelm1->op),
2000                                      oelm1->op, oelast->op);
2001
2002           if (folded && is_gimple_min_invariant (folded))
2003             {
2004               if (dump_file && (dump_flags & TDF_DETAILS))
2005                 fprintf (dump_file, "Merging constants\n");
2006
2007               ops->pop ();
2008               ops->pop ();
2009
2010               add_to_ops_vec (ops, folded);
2011               reassociate_stats.constants_eliminated++;
2012
2013               optimize_ops_list (opcode, ops);
2014               return;
2015             }
2016         }
2017     }
2018
2019   eliminate_using_constants (opcode, ops);
2020   oelast = NULL;
2021
2022   for (i = 0; ops->iterate (i, &oe);)
2023     {
2024       bool done = false;
2025
2026       if (eliminate_not_pairs (opcode, ops, i, oe))
2027         return;
2028       if (eliminate_duplicate_pair (opcode, ops, &done, i, oe, oelast)
2029           || (!done && eliminate_plus_minus_pair (opcode, ops, i, oe))
2030           || (!done && eliminate_redundant_comparison (opcode, ops, i, oe)))
2031         {
2032           if (done)
2033             return;
2034           iterate = true;
2035           oelast = NULL;
2036           continue;
2037         }
2038       oelast = oe;
2039       i++;
2040     }
2041
2042   length = ops->length ();
2043   oelast = ops->last ();
2044
2045   if (iterate)
2046     optimize_ops_list (opcode, ops);
2047 }
2048
2049 /* The following functions are subroutines to optimize_range_tests and allow
2050    it to try to change a logical combination of comparisons into a range
2051    test.
2052
2053    For example, both
2054         X == 2 || X == 5 || X == 3 || X == 4
2055    and
2056         X >= 2 && X <= 5
2057    are converted to
2058         (unsigned) (X - 2) <= 3
2059
2060    For more information see comments above fold_test_range in fold-const.c,
2061    this implementation is for GIMPLE.  */
2062
2063 struct range_entry
2064 {
2065   tree exp;
2066   tree low;
2067   tree high;
2068   bool in_p;
2069   bool strict_overflow_p;
2070   unsigned int idx, next;
2071 };
2072
2073 /* This is similar to make_range in fold-const.c, but on top of
2074    GIMPLE instead of trees.  If EXP is non-NULL, it should be
2075    an SSA_NAME and STMT argument is ignored, otherwise STMT
2076    argument should be a GIMPLE_COND.  */
2077
2078 static void
2079 init_range_entry (struct range_entry *r, tree exp, gimple *stmt)
2080 {
2081   int in_p;
2082   tree low, high;
2083   bool is_bool, strict_overflow_p;
2084
2085   r->exp = NULL_TREE;
2086   r->in_p = false;
2087   r->strict_overflow_p = false;
2088   r->low = NULL_TREE;
2089   r->high = NULL_TREE;
2090   if (exp != NULL_TREE
2091       && (TREE_CODE (exp) != SSA_NAME || !INTEGRAL_TYPE_P (TREE_TYPE (exp))))
2092     return;
2093
2094   /* Start with simply saying "EXP != 0" and then look at the code of EXP
2095      and see if we can refine the range.  Some of the cases below may not
2096      happen, but it doesn't seem worth worrying about this.  We "continue"
2097      the outer loop when we've changed something; otherwise we "break"
2098      the switch, which will "break" the while.  */
2099   low = exp ? build_int_cst (TREE_TYPE (exp), 0) : boolean_false_node;
2100   high = low;
2101   in_p = 0;
2102   strict_overflow_p = false;
2103   is_bool = false;
2104   if (exp == NULL_TREE)
2105     is_bool = true;
2106   else if (TYPE_PRECISION (TREE_TYPE (exp)) == 1)
2107     {
2108       if (TYPE_UNSIGNED (TREE_TYPE (exp)))
2109         is_bool = true;
2110       else
2111         return;
2112     }
2113   else if (TREE_CODE (TREE_TYPE (exp)) == BOOLEAN_TYPE)
2114     is_bool = true;
2115
2116   while (1)
2117     {
2118       enum tree_code code;
2119       tree arg0, arg1, exp_type;
2120       tree nexp;
2121       location_t loc;
2122
2123       if (exp != NULL_TREE)
2124         {
2125           if (TREE_CODE (exp) != SSA_NAME
2126               || SSA_NAME_OCCURS_IN_ABNORMAL_PHI (exp))
2127             break;
2128
2129           stmt = SSA_NAME_DEF_STMT (exp);
2130           if (!is_gimple_assign (stmt))
2131             break;
2132
2133           code = gimple_assign_rhs_code (stmt);
2134           arg0 = gimple_assign_rhs1 (stmt);
2135           arg1 = gimple_assign_rhs2 (stmt);
2136           exp_type = TREE_TYPE (exp);
2137         }
2138       else
2139         {
2140           code = gimple_cond_code (stmt);
2141           arg0 = gimple_cond_lhs (stmt);
2142           arg1 = gimple_cond_rhs (stmt);
2143           exp_type = boolean_type_node;
2144         }
2145
2146       if (TREE_CODE (arg0) != SSA_NAME)
2147         break;
2148       loc = gimple_location (stmt);
2149       switch (code)
2150         {
2151         case BIT_NOT_EXPR:
2152           if (TREE_CODE (TREE_TYPE (exp)) == BOOLEAN_TYPE
2153               /* Ensure the range is either +[-,0], +[0,0],
2154                  -[-,0], -[0,0] or +[1,-], +[1,1], -[1,-] or
2155                  -[1,1].  If it is e.g. +[-,-] or -[-,-]
2156                  or similar expression of unconditional true or
2157                  false, it should not be negated.  */
2158               && ((high && integer_zerop (high))
2159                   || (low && integer_onep (low))))
2160             {
2161               in_p = !in_p;
2162               exp = arg0;
2163               continue;
2164             }
2165           break;
2166         case SSA_NAME:
2167           exp = arg0;
2168           continue;
2169         CASE_CONVERT:
2170           if (is_bool)
2171             goto do_default;
2172           if (TYPE_PRECISION (TREE_TYPE (arg0)) == 1)
2173             {
2174               if (TYPE_UNSIGNED (TREE_TYPE (arg0)))
2175                 is_bool = true;
2176               else
2177                 return;
2178             }
2179           else if (TREE_CODE (TREE_TYPE (arg0)) == BOOLEAN_TYPE)
2180             is_bool = true;
2181           goto do_default;
2182         case EQ_EXPR:
2183         case NE_EXPR:
2184         case LT_EXPR:
2185         case LE_EXPR:
2186         case GE_EXPR:
2187         case GT_EXPR:
2188           is_bool = true;
2189           /* FALLTHRU */
2190         default:
2191           if (!is_bool)
2192             return;
2193         do_default:
2194           nexp = make_range_step (loc, code, arg0, arg1, exp_type,
2195                                   &low, &high, &in_p,
2196                                   &strict_overflow_p);
2197           if (nexp != NULL_TREE)
2198             {
2199               exp = nexp;
2200               gcc_assert (TREE_CODE (exp) == SSA_NAME);
2201               continue;
2202             }
2203           break;
2204         }
2205       break;
2206     }
2207   if (is_bool)
2208     {
2209       r->exp = exp;
2210       r->in_p = in_p;
2211       r->low = low;
2212       r->high = high;
2213       r->strict_overflow_p = strict_overflow_p;
2214     }
2215 }
2216
2217 /* Comparison function for qsort.  Sort entries
2218    without SSA_NAME exp first, then with SSA_NAMEs sorted
2219    by increasing SSA_NAME_VERSION, and for the same SSA_NAMEs
2220    by increasing ->low and if ->low is the same, by increasing
2221    ->high.  ->low == NULL_TREE means minimum, ->high == NULL_TREE
2222    maximum.  */
2223
2224 static int
2225 range_entry_cmp (const void *a, const void *b)
2226 {
2227   const struct range_entry *p = (const struct range_entry *) a;
2228   const struct range_entry *q = (const struct range_entry *) b;
2229
2230   if (p->exp != NULL_TREE && TREE_CODE (p->exp) == SSA_NAME)
2231     {
2232       if (q->exp != NULL_TREE && TREE_CODE (q->exp) == SSA_NAME)
2233         {
2234           /* Group range_entries for the same SSA_NAME together.  */
2235           if (SSA_NAME_VERSION (p->exp) < SSA_NAME_VERSION (q->exp))
2236             return -1;
2237           else if (SSA_NAME_VERSION (p->exp) > SSA_NAME_VERSION (q->exp))
2238             return 1;
2239           /* If ->low is different, NULL low goes first, then by
2240              ascending low.  */
2241           if (p->low != NULL_TREE)
2242             {
2243               if (q->low != NULL_TREE)
2244                 {
2245                   tree tem = fold_binary (LT_EXPR, boolean_type_node,
2246                                           p->low, q->low);
2247                   if (tem && integer_onep (tem))
2248                     return -1;
2249                   tem = fold_binary (GT_EXPR, boolean_type_node,
2250                                      p->low, q->low);
2251                   if (tem && integer_onep (tem))
2252                     return 1;
2253                 }
2254               else
2255                 return 1;
2256             }
2257           else if (q->low != NULL_TREE)
2258             return -1;
2259           /* If ->high is different, NULL high goes last, before that by
2260              ascending high.  */
2261           if (p->high != NULL_TREE)
2262             {
2263               if (q->high != NULL_TREE)
2264                 {
2265                   tree tem = fold_binary (LT_EXPR, boolean_type_node,
2266                                           p->high, q->high);
2267                   if (tem && integer_onep (tem))
2268                     return -1;
2269                   tem = fold_binary (GT_EXPR, boolean_type_node,
2270                                      p->high, q->high);
2271                   if (tem && integer_onep (tem))
2272                     return 1;
2273                 }
2274               else
2275                 return -1;
2276             }
2277           else if (q->high != NULL_TREE)
2278             return 1;
2279           /* If both ranges are the same, sort below by ascending idx.  */
2280         }
2281       else
2282         return 1;
2283     }
2284   else if (q->exp != NULL_TREE && TREE_CODE (q->exp) == SSA_NAME)
2285     return -1;
2286
2287   if (p->idx < q->idx)
2288     return -1;
2289   else
2290     {
2291       gcc_checking_assert (p->idx > q->idx);
2292       return 1;
2293     }
2294 }
2295
2296 /* Helper function for update_range_test.  Force EXPR into an SSA_NAME,
2297    insert needed statements BEFORE or after GSI.  */
2298
2299 static tree
2300 force_into_ssa_name (gimple_stmt_iterator *gsi, tree expr, bool before)
2301 {
2302   enum gsi_iterator_update m = before ? GSI_SAME_STMT : GSI_CONTINUE_LINKING;
2303   tree ret = force_gimple_operand_gsi (gsi, expr, true, NULL_TREE, before, m);
2304   if (TREE_CODE (ret) != SSA_NAME)
2305     {
2306       gimple *g = gimple_build_assign (make_ssa_name (TREE_TYPE (ret)), ret);
2307       if (before)
2308         gsi_insert_before (gsi, g, GSI_SAME_STMT);
2309       else
2310         gsi_insert_after (gsi, g, GSI_CONTINUE_LINKING);
2311       ret = gimple_assign_lhs (g);
2312     }
2313   return ret;
2314 }
2315
2316 /* Helper routine of optimize_range_test.
2317    [EXP, IN_P, LOW, HIGH, STRICT_OVERFLOW_P] is a merged range for
2318    RANGE and OTHERRANGE through OTHERRANGE + COUNT - 1 ranges,
2319    OPCODE and OPS are arguments of optimize_range_tests.  If OTHERRANGE
2320    is NULL, OTHERRANGEP should not be and then OTHERRANGEP points to
2321    an array of COUNT pointers to other ranges.  Return
2322    true if the range merge has been successful.
2323    If OPCODE is ERROR_MARK, this is called from within
2324    maybe_optimize_range_tests and is performing inter-bb range optimization.
2325    In that case, whether an op is BIT_AND_EXPR or BIT_IOR_EXPR is found in
2326    oe->rank.  */
2327
2328 static bool
2329 update_range_test (struct range_entry *range, struct range_entry *otherrange,
2330                    struct range_entry **otherrangep,
2331                    unsigned int count, enum tree_code opcode,
2332                    vec<operand_entry *> *ops, tree exp, gimple_seq seq,
2333                    bool in_p, tree low, tree high, bool strict_overflow_p)
2334 {
2335   operand_entry *oe = (*ops)[range->idx];
2336   tree op = oe->op;
2337   gimple *stmt = op ? SSA_NAME_DEF_STMT (op)
2338                     : last_stmt (BASIC_BLOCK_FOR_FN (cfun, oe->id));
2339   location_t loc = gimple_location (stmt);
2340   tree optype = op ? TREE_TYPE (op) : boolean_type_node;
2341   tree tem = build_range_check (loc, optype, unshare_expr (exp),
2342                                 in_p, low, high);
2343   enum warn_strict_overflow_code wc = WARN_STRICT_OVERFLOW_COMPARISON;
2344   gimple_stmt_iterator gsi;
2345   unsigned int i, uid;
2346
2347   if (tem == NULL_TREE)
2348     return false;
2349
2350   /* If op is default def SSA_NAME, there is no place to insert the
2351      new comparison.  Give up, unless we can use OP itself as the
2352      range test.  */
2353   if (op && SSA_NAME_IS_DEFAULT_DEF (op))
2354     {
2355       if (op == range->exp
2356           && ((TYPE_PRECISION (optype) == 1 && TYPE_UNSIGNED (optype))
2357               || TREE_CODE (optype) == BOOLEAN_TYPE)
2358           && (op == tem
2359               || (TREE_CODE (tem) == EQ_EXPR
2360                   && TREE_OPERAND (tem, 0) == op
2361                   && integer_onep (TREE_OPERAND (tem, 1))))
2362           && opcode != BIT_IOR_EXPR
2363           && (opcode != ERROR_MARK || oe->rank != BIT_IOR_EXPR))
2364         {
2365           stmt = NULL;
2366           tem = op;
2367         }
2368       else
2369         return false;
2370     }
2371
2372   if (strict_overflow_p && issue_strict_overflow_warning (wc))
2373     warning_at (loc, OPT_Wstrict_overflow,
2374                 "assuming signed overflow does not occur "
2375                 "when simplifying range test");
2376
2377   if (dump_file && (dump_flags & TDF_DETAILS))
2378     {
2379       struct range_entry *r;
2380       fprintf (dump_file, "Optimizing range tests ");
2381       print_generic_expr (dump_file, range->exp);
2382       fprintf (dump_file, " %c[", range->in_p ? '+' : '-');
2383       print_generic_expr (dump_file, range->low);
2384       fprintf (dump_file, ", ");
2385       print_generic_expr (dump_file, range->high);
2386       fprintf (dump_file, "]");
2387       for (i = 0; i < count; i++)
2388         {
2389           if (otherrange)
2390             r = otherrange + i;
2391           else
2392             r = otherrangep[i];
2393           if (r->exp
2394               && r->exp != range->exp
2395               && TREE_CODE (r->exp) == SSA_NAME)
2396             {
2397               fprintf (dump_file, " and ");
2398               print_generic_expr (dump_file, r->exp);
2399             }
2400           else
2401             fprintf (dump_file, " and");
2402           fprintf (dump_file, " %c[", r->in_p ? '+' : '-');
2403           print_generic_expr (dump_file, r->low);
2404           fprintf (dump_file, ", ");
2405           print_generic_expr (dump_file, r->high);
2406           fprintf (dump_file, "]");
2407         }
2408       fprintf (dump_file, "\n into ");
2409       print_generic_expr (dump_file, tem);
2410       fprintf (dump_file, "\n");
2411     }
2412
2413   if (opcode == BIT_IOR_EXPR
2414       || (opcode == ERROR_MARK && oe->rank == BIT_IOR_EXPR))
2415     tem = invert_truthvalue_loc (loc, tem);
2416
2417   tem = fold_convert_loc (loc, optype, tem);
2418   if (stmt)
2419     {
2420       gsi = gsi_for_stmt (stmt);
2421       uid = gimple_uid (stmt);
2422     }
2423   else
2424     {
2425       gsi = gsi_none ();
2426       uid = 0;
2427     }
2428   if (stmt == NULL)
2429     gcc_checking_assert (tem == op);
2430   /* In rare cases range->exp can be equal to lhs of stmt.
2431      In that case we have to insert after the stmt rather then before
2432      it.  If stmt is a PHI, insert it at the start of the basic block.  */
2433   else if (op != range->exp)
2434     {
2435       gsi_insert_seq_before (&gsi, seq, GSI_SAME_STMT);
2436       tem = force_into_ssa_name (&gsi, tem, true);
2437       gsi_prev (&gsi);
2438     }
2439   else if (gimple_code (stmt) != GIMPLE_PHI)
2440     {
2441       gsi_insert_seq_after (&gsi, seq, GSI_CONTINUE_LINKING);
2442       tem = force_into_ssa_name (&gsi, tem, false);
2443     }
2444   else
2445     {
2446       gsi = gsi_after_labels (gimple_bb (stmt));
2447       if (!gsi_end_p (gsi))
2448         uid = gimple_uid (gsi_stmt (gsi));
2449       else
2450         {
2451           gsi = gsi_start_bb (gimple_bb (stmt));
2452           uid = 1;
2453           while (!gsi_end_p (gsi))
2454             {
2455               uid = gimple_uid (gsi_stmt (gsi));
2456               gsi_next (&gsi);
2457             }
2458         }
2459       gsi_insert_seq_before (&gsi, seq, GSI_SAME_STMT);
2460       tem = force_into_ssa_name (&gsi, tem, true);
2461       if (gsi_end_p (gsi))
2462         gsi = gsi_last_bb (gimple_bb (stmt));
2463       else
2464         gsi_prev (&gsi);
2465     }
2466   for (; !gsi_end_p (gsi); gsi_prev (&gsi))
2467     if (gimple_uid (gsi_stmt (gsi)))
2468       break;
2469     else
2470       gimple_set_uid (gsi_stmt (gsi), uid);
2471
2472   oe->op = tem;
2473   range->exp = exp;
2474   range->low = low;
2475   range->high = high;
2476   range->in_p = in_p;
2477   range->strict_overflow_p = false;
2478
2479   for (i = 0; i < count; i++)
2480     {
2481       if (otherrange)
2482         range = otherrange + i;
2483       else
2484         range = otherrangep[i];
2485       oe = (*ops)[range->idx];
2486       /* Now change all the other range test immediate uses, so that
2487          those tests will be optimized away.  */
2488       if (opcode == ERROR_MARK)
2489         {
2490           if (oe->op)
2491             oe->op = build_int_cst (TREE_TYPE (oe->op),
2492                                     oe->rank == BIT_IOR_EXPR ? 0 : 1);
2493           else
2494             oe->op = (oe->rank == BIT_IOR_EXPR
2495                       ? boolean_false_node : boolean_true_node);
2496         }
2497       else
2498         oe->op = error_mark_node;
2499       range->exp = NULL_TREE;
2500       range->low = NULL_TREE;
2501       range->high = NULL_TREE;
2502     }
2503   return true;
2504 }
2505
2506 /* Optimize X == CST1 || X == CST2
2507    if popcount (CST1 ^ CST2) == 1 into
2508    (X & ~(CST1 ^ CST2)) == (CST1 & ~(CST1 ^ CST2)).
2509    Similarly for ranges.  E.g.
2510    X != 2 && X != 3 && X != 10 && X != 11
2511    will be transformed by the previous optimization into
2512    !((X - 2U) <= 1U || (X - 10U) <= 1U)
2513    and this loop can transform that into
2514    !(((X & ~8) - 2U) <= 1U).  */
2515
2516 static bool
2517 optimize_range_tests_xor (enum tree_code opcode, tree type,
2518                           tree lowi, tree lowj, tree highi, tree highj,
2519                           vec<operand_entry *> *ops,
2520                           struct range_entry *rangei,
2521                           struct range_entry *rangej)
2522 {
2523   tree lowxor, highxor, tem, exp;
2524   /* Check lowi ^ lowj == highi ^ highj and
2525      popcount (lowi ^ lowj) == 1.  */
2526   lowxor = fold_binary (BIT_XOR_EXPR, type, lowi, lowj);
2527   if (lowxor == NULL_TREE || TREE_CODE (lowxor) != INTEGER_CST)
2528     return false;
2529   if (!integer_pow2p (lowxor))
2530     return false;
2531   highxor = fold_binary (BIT_XOR_EXPR, type, highi, highj);
2532   if (!tree_int_cst_equal (lowxor, highxor))
2533     return false;
2534
2535   tem = fold_build1 (BIT_NOT_EXPR, type, lowxor);
2536   exp = fold_build2 (BIT_AND_EXPR, type, rangei->exp, tem);
2537   lowj = fold_build2 (BIT_AND_EXPR, type, lowi, tem);
2538   highj = fold_build2 (BIT_AND_EXPR, type, highi, tem);
2539   if (update_range_test (rangei, rangej, NULL, 1, opcode, ops, exp,
2540                          NULL, rangei->in_p, lowj, highj,
2541                          rangei->strict_overflow_p
2542                          || rangej->strict_overflow_p))
2543     return true;
2544   return false;
2545 }
2546
2547 /* Optimize X == CST1 || X == CST2
2548    if popcount (CST2 - CST1) == 1 into
2549    ((X - CST1) & ~(CST2 - CST1)) == 0.
2550    Similarly for ranges.  E.g.
2551    X == 43 || X == 76 || X == 44 || X == 78 || X == 77 || X == 46
2552    || X == 75 || X == 45
2553    will be transformed by the previous optimization into
2554    (X - 43U) <= 3U || (X - 75U) <= 3U
2555    and this loop can transform that into
2556    ((X - 43U) & ~(75U - 43U)) <= 3U.  */
2557 static bool
2558 optimize_range_tests_diff (enum tree_code opcode, tree type,
2559                            tree lowi, tree lowj, tree highi, tree highj,
2560                            vec<operand_entry *> *ops,
2561                            struct range_entry *rangei,
2562                            struct range_entry *rangej)
2563 {
2564   tree tem1, tem2, mask;
2565   /* Check highi - lowi == highj - lowj.  */
2566   tem1 = fold_binary (MINUS_EXPR, type, highi, lowi);
2567   if (tem1 == NULL_TREE || TREE_CODE (tem1) != INTEGER_CST)
2568     return false;
2569   tem2 = fold_binary (MINUS_EXPR, type, highj, lowj);
2570   if (!tree_int_cst_equal (tem1, tem2))
2571     return false;
2572   /* Check popcount (lowj - lowi) == 1.  */
2573   tem1 = fold_binary (MINUS_EXPR, type, lowj, lowi);
2574   if (tem1 == NULL_TREE || TREE_CODE (tem1) != INTEGER_CST)
2575     return false;
2576   if (!integer_pow2p (tem1))
2577     return false;
2578
2579   type = unsigned_type_for (type);
2580   tem1 = fold_convert (type, tem1);
2581   tem2 = fold_convert (type, tem2);
2582   lowi = fold_convert (type, lowi);
2583   mask = fold_build1 (BIT_NOT_EXPR, type, tem1);
2584   tem1 = fold_build2 (MINUS_EXPR, type,
2585                       fold_convert (type, rangei->exp), lowi);
2586   tem1 = fold_build2 (BIT_AND_EXPR, type, tem1, mask);
2587   lowj = build_int_cst (type, 0);
2588   if (update_range_test (rangei, rangej, NULL, 1, opcode, ops, tem1,
2589                          NULL, rangei->in_p, lowj, tem2,
2590                          rangei->strict_overflow_p
2591                          || rangej->strict_overflow_p))
2592     return true;
2593   return false;
2594 }
2595
2596 /* It does some common checks for function optimize_range_tests_xor and
2597    optimize_range_tests_diff.
2598    If OPTIMIZE_XOR is TRUE, it calls optimize_range_tests_xor.
2599    Else it calls optimize_range_tests_diff.  */
2600
2601 static bool
2602 optimize_range_tests_1 (enum tree_code opcode, int first, int length,
2603                         bool optimize_xor, vec<operand_entry *> *ops,
2604                         struct range_entry *ranges)
2605 {
2606   int i, j;
2607   bool any_changes = false;
2608   for (i = first; i < length; i++)
2609     {
2610       tree lowi, highi, lowj, highj, type, tem;
2611
2612       if (ranges[i].exp == NULL_TREE || ranges[i].in_p)
2613         continue;
2614       type = TREE_TYPE (ranges[i].exp);
2615       if (!INTEGRAL_TYPE_P (type))
2616         continue;
2617       lowi = ranges[i].low;
2618       if (lowi == NULL_TREE)
2619         lowi = TYPE_MIN_VALUE (type);
2620       highi = ranges[i].high;
2621       if (highi == NULL_TREE)
2622         continue;
2623       for (j = i + 1; j < length && j < i + 64; j++)
2624         {
2625           bool changes;
2626           if (ranges[i].exp != ranges[j].exp || ranges[j].in_p)
2627             continue;
2628           lowj = ranges[j].low;
2629           if (lowj == NULL_TREE)
2630             continue;
2631           highj = ranges[j].high;
2632           if (highj == NULL_TREE)
2633             highj = TYPE_MAX_VALUE (type);
2634           /* Check lowj > highi.  */
2635           tem = fold_binary (GT_EXPR, boolean_type_node,
2636                              lowj, highi);
2637           if (tem == NULL_TREE || !integer_onep (tem))
2638             continue;
2639           if (optimize_xor)
2640             changes = optimize_range_tests_xor (opcode, type, lowi, lowj,
2641                                                 highi, highj, ops,
2642                                                 ranges + i, ranges + j);
2643           else
2644             changes = optimize_range_tests_diff (opcode, type, lowi, lowj,
2645                                                  highi, highj, ops,
2646                                                  ranges + i, ranges + j);
2647           if (changes)
2648             {
2649               any_changes = true;
2650               break;
2651             }
2652         }
2653     }
2654   return any_changes;
2655 }
2656
2657 /* Helper function of optimize_range_tests_to_bit_test.  Handle a single
2658    range, EXP, LOW, HIGH, compute bit mask of bits to test and return
2659    EXP on success, NULL otherwise.  */
2660
2661 static tree
2662 extract_bit_test_mask (tree exp, int prec, tree totallow, tree low, tree high,
2663                        wide_int *mask, tree *totallowp)
2664 {
2665   tree tem = int_const_binop (MINUS_EXPR, high, low);
2666   if (tem == NULL_TREE
2667       || TREE_CODE (tem) != INTEGER_CST
2668       || TREE_OVERFLOW (tem)
2669       || tree_int_cst_sgn (tem) == -1
2670       || compare_tree_int (tem, prec) != -1)
2671     return NULL_TREE;
2672
2673   unsigned HOST_WIDE_INT max = tree_to_uhwi (tem) + 1;
2674   *mask = wi::shifted_mask (0, max, false, prec);
2675   if (TREE_CODE (exp) == BIT_AND_EXPR
2676       && TREE_CODE (TREE_OPERAND (exp, 1)) == INTEGER_CST)
2677     {
2678       widest_int msk = wi::to_widest (TREE_OPERAND (exp, 1));
2679       msk = wi::zext (~msk, TYPE_PRECISION (TREE_TYPE (exp)));
2680       if (wi::popcount (msk) == 1
2681           && wi::ltu_p (msk, prec - max))
2682         {
2683           *mask |= wi::shifted_mask (msk.to_uhwi (), max, false, prec);
2684           max += msk.to_uhwi ();
2685           exp = TREE_OPERAND (exp, 0);
2686           if (integer_zerop (low)
2687               && TREE_CODE (exp) == PLUS_EXPR
2688               && TREE_CODE (TREE_OPERAND (exp, 1)) == INTEGER_CST)
2689             {
2690               tree ret = TREE_OPERAND (exp, 0);
2691               STRIP_NOPS (ret);
2692               widest_int bias
2693                 = wi::neg (wi::sext (wi::to_widest (TREE_OPERAND (exp, 1)),
2694                                      TYPE_PRECISION (TREE_TYPE (low))));
2695               tree tbias = wide_int_to_tree (TREE_TYPE (ret), bias);
2696               if (totallowp)
2697                 {
2698                   *totallowp = tbias;
2699                   return ret;
2700                 }
2701               else if (!tree_int_cst_lt (totallow, tbias))
2702                 return NULL_TREE;
2703               bias = wi::to_widest (tbias);
2704               bias -= wi::to_widest (totallow);
2705               if (bias >= 0 && bias < prec - max)
2706                 {
2707                   *mask = wi::lshift (*mask, bias);
2708                   return ret;
2709                 }
2710             }
2711         }
2712     }
2713   if (totallowp)
2714     return exp;
2715   if (!tree_int_cst_lt (totallow, low))
2716     return exp;
2717   tem = int_const_binop (MINUS_EXPR, low, totallow);
2718   if (tem == NULL_TREE
2719       || TREE_CODE (tem) != INTEGER_CST
2720       || TREE_OVERFLOW (tem)
2721       || compare_tree_int (tem, prec - max) == 1)
2722     return NULL_TREE;
2723
2724   *mask = wi::lshift (*mask, wi::to_widest (tem));
2725   return exp;
2726 }
2727
2728 /* Attempt to optimize small range tests using bit test.
2729    E.g.
2730    X != 43 && X != 76 && X != 44 && X != 78 && X != 49
2731    && X != 77 && X != 46 && X != 75 && X != 45 && X != 82
2732    has been by earlier optimizations optimized into:
2733    ((X - 43U) & ~32U) > 3U && X != 49 && X != 82
2734    As all the 43 through 82 range is less than 64 numbers,
2735    for 64-bit word targets optimize that into:
2736    (X - 43U) > 40U && ((1 << (X - 43U)) & 0x8F0000004FULL) == 0  */
2737
2738 static bool
2739 optimize_range_tests_to_bit_test (enum tree_code opcode, int first, int length,
2740                                   vec<operand_entry *> *ops,
2741                                   struct range_entry *ranges)
2742 {
2743   int i, j;
2744   bool any_changes = false;
2745   int prec = GET_MODE_BITSIZE (word_mode);
2746   auto_vec<struct range_entry *, 64> candidates;
2747
2748   for (i = first; i < length - 2; i++)
2749     {
2750       tree lowi, highi, lowj, highj, type;
2751
2752       if (ranges[i].exp == NULL_TREE || ranges[i].in_p)
2753         continue;
2754       type = TREE_TYPE (ranges[i].exp);
2755       if (!INTEGRAL_TYPE_P (type))
2756         continue;
2757       lowi = ranges[i].low;
2758       if (lowi == NULL_TREE)
2759         lowi = TYPE_MIN_VALUE (type);
2760       highi = ranges[i].high;
2761       if (highi == NULL_TREE)
2762         continue;
2763       wide_int mask;
2764       tree exp = extract_bit_test_mask (ranges[i].exp, prec, lowi, lowi,
2765                                         highi, &mask, &lowi);
2766       if (exp == NULL_TREE)
2767         continue;
2768       bool strict_overflow_p = ranges[i].strict_overflow_p;
2769       candidates.truncate (0);
2770       int end = MIN (i + 64, length);
2771       for (j = i + 1; j < end; j++)
2772         {
2773           tree exp2;
2774           if (ranges[j].exp == NULL_TREE || ranges[j].in_p)
2775             continue;
2776           if (ranges[j].exp == exp)
2777             ;
2778           else if (TREE_CODE (ranges[j].exp) == BIT_AND_EXPR)
2779             {
2780               exp2 = TREE_OPERAND (ranges[j].exp, 0);
2781               if (exp2 == exp)
2782                 ;
2783               else if (TREE_CODE (exp2) == PLUS_EXPR)
2784                 {
2785                   exp2 = TREE_OPERAND (exp2, 0);
2786                   STRIP_NOPS (exp2);
2787                   if (exp2 != exp)
2788                     continue;
2789                 }
2790               else
2791                 continue;
2792             }
2793           else
2794             continue;
2795           lowj = ranges[j].low;
2796           if (lowj == NULL_TREE)
2797             continue;
2798           highj = ranges[j].high;
2799           if (highj == NULL_TREE)
2800             highj = TYPE_MAX_VALUE (type);
2801           wide_int mask2;
2802           exp2 = extract_bit_test_mask (ranges[j].exp, prec, lowi, lowj,
2803                                         highj, &mask2, NULL);
2804           if (exp2 != exp)
2805             continue;
2806           mask |= mask2;
2807           strict_overflow_p |= ranges[j].strict_overflow_p;
2808           candidates.safe_push (&ranges[j]);
2809         }
2810
2811       /* If we need otherwise 3 or more comparisons, use a bit test.  */
2812       if (candidates.length () >= 2)
2813         {
2814           tree high = wide_int_to_tree (TREE_TYPE (lowi),
2815                                         wi::to_widest (lowi)
2816                                         + prec - 1 - wi::clz (mask));
2817           operand_entry *oe = (*ops)[ranges[i].idx];
2818           tree op = oe->op;
2819           gimple *stmt = op ? SSA_NAME_DEF_STMT (op)
2820                             : last_stmt (BASIC_BLOCK_FOR_FN (cfun, oe->id));
2821           location_t loc = gimple_location (stmt);
2822           tree optype = op ? TREE_TYPE (op) : boolean_type_node;
2823
2824           /* See if it isn't cheaper to pretend the minimum value of the
2825              range is 0, if maximum value is small enough.
2826              We can avoid then subtraction of the minimum value, but the
2827              mask constant could be perhaps more expensive.  */
2828           if (compare_tree_int (lowi, 0) > 0
2829               && compare_tree_int (high, prec) < 0)
2830             {
2831               int cost_diff;
2832               HOST_WIDE_INT m = tree_to_uhwi (lowi);
2833               rtx reg = gen_raw_REG (word_mode, 10000);
2834               bool speed_p = optimize_bb_for_speed_p (gimple_bb (stmt));
2835               cost_diff = set_rtx_cost (gen_rtx_PLUS (word_mode, reg,
2836                                                       GEN_INT (-m)), speed_p);
2837               rtx r = immed_wide_int_const (mask, word_mode);
2838               cost_diff += set_src_cost (gen_rtx_AND (word_mode, reg, r),
2839                                          word_mode, speed_p);
2840               r = immed_wide_int_const (wi::lshift (mask, m), word_mode);
2841               cost_diff -= set_src_cost (gen_rtx_AND (word_mode, reg, r),
2842                                          word_mode, speed_p);
2843               if (cost_diff > 0)
2844                 {
2845                   mask = wi::lshift (mask, m);
2846                   lowi = build_zero_cst (TREE_TYPE (lowi));
2847                 }
2848             }
2849
2850           tree tem = build_range_check (loc, optype, unshare_expr (exp),
2851                                         false, lowi, high);
2852           if (tem == NULL_TREE || is_gimple_val (tem))
2853             continue;
2854           tree etype = unsigned_type_for (TREE_TYPE (exp));
2855           exp = fold_build2_loc (loc, MINUS_EXPR, etype,
2856                                  fold_convert_loc (loc, etype, exp),
2857                                  fold_convert_loc (loc, etype, lowi));
2858           exp = fold_convert_loc (loc, integer_type_node, exp);
2859           tree word_type = lang_hooks.types.type_for_mode (word_mode, 1);
2860           exp = fold_build2_loc (loc, LSHIFT_EXPR, word_type,
2861                                  build_int_cst (word_type, 1), exp);
2862           exp = fold_build2_loc (loc, BIT_AND_EXPR, word_type, exp,
2863                                  wide_int_to_tree (word_type, mask));
2864           exp = fold_build2_loc (loc, EQ_EXPR, optype, exp,
2865                                  build_zero_cst (word_type));
2866           if (is_gimple_val (exp))
2867             continue;
2868
2869           /* The shift might have undefined behavior if TEM is true,
2870              but reassociate_bb isn't prepared to have basic blocks
2871              split when it is running.  So, temporarily emit a code
2872              with BIT_IOR_EXPR instead of &&, and fix it up in
2873              branch_fixup.  */
2874           gimple_seq seq;
2875           tem = force_gimple_operand (tem, &seq, true, NULL_TREE);
2876           gcc_assert (TREE_CODE (tem) == SSA_NAME);
2877           gimple_set_visited (SSA_NAME_DEF_STMT (tem), true);
2878           gimple_seq seq2;
2879           exp = force_gimple_operand (exp, &seq2, true, NULL_TREE);
2880           gimple_seq_add_seq_without_update (&seq, seq2);
2881           gcc_assert (TREE_CODE (exp) == SSA_NAME);
2882           gimple_set_visited (SSA_NAME_DEF_STMT (exp), true);
2883           gimple *g = gimple_build_assign (make_ssa_name (optype),
2884                                            BIT_IOR_EXPR, tem, exp);
2885           gimple_set_location (g, loc);
2886           gimple_seq_add_stmt_without_update (&seq, g);
2887           exp = gimple_assign_lhs (g);
2888           tree val = build_zero_cst (optype);
2889           if (update_range_test (&ranges[i], NULL, candidates.address (),
2890                                  candidates.length (), opcode, ops, exp,
2891                                  seq, false, val, val, strict_overflow_p))
2892             {
2893               any_changes = true;
2894               reassoc_branch_fixups.safe_push (tem);
2895             }
2896           else
2897             gimple_seq_discard (seq);
2898         }
2899     }
2900   return any_changes;
2901 }
2902
2903 /* Optimize x != 0 && y != 0 && z != 0 into (x | y | z) != 0
2904    and similarly x != -1 && y != -1 && y != -1 into (x & y & z) != -1.  */
2905
2906 static bool
2907 optimize_range_tests_cmp_bitwise (enum tree_code opcode, int first, int length,
2908                                   vec<operand_entry *> *ops,
2909                                   struct range_entry *ranges)
2910 {
2911   int i;
2912   unsigned int b;
2913   bool any_changes = false;
2914   auto_vec<int, 128> buckets;
2915   auto_vec<int, 32> chains;
2916   auto_vec<struct range_entry *, 32> candidates;
2917
2918   for (i = first; i < length; i++)
2919     {
2920       if (ranges[i].exp == NULL_TREE
2921           || TREE_CODE (ranges[i].exp) != SSA_NAME
2922           || !ranges[i].in_p
2923           || TYPE_PRECISION (TREE_TYPE (ranges[i].exp)) <= 1
2924           || TREE_CODE (TREE_TYPE (ranges[i].exp)) == BOOLEAN_TYPE
2925           || ranges[i].low == NULL_TREE
2926           || ranges[i].low != ranges[i].high)
2927         continue;
2928
2929       bool zero_p = integer_zerop (ranges[i].low);
2930       if (!zero_p && !integer_all_onesp (ranges[i].low))
2931         continue;
2932
2933       b = TYPE_PRECISION (TREE_TYPE (ranges[i].exp)) * 2 + !zero_p;
2934       if (buckets.length () <= b)
2935         buckets.safe_grow_cleared (b + 1);
2936       if (chains.length () <= (unsigned) i)
2937         chains.safe_grow (i + 1);
2938       chains[i] = buckets[b];
2939       buckets[b] = i + 1;
2940     }
2941
2942   FOR_EACH_VEC_ELT (buckets, b, i)
2943     if (i && chains[i - 1])
2944       {
2945         int j, k = i;
2946         for (j = chains[i - 1]; j; j = chains[j - 1])
2947           {
2948             gimple *gk = SSA_NAME_DEF_STMT (ranges[k - 1].exp);
2949             gimple *gj = SSA_NAME_DEF_STMT (ranges[j - 1].exp);
2950             if (reassoc_stmt_dominates_stmt_p (gk, gj))
2951               k = j;
2952           }
2953         tree type1 = TREE_TYPE (ranges[k - 1].exp);
2954         tree type2 = NULL_TREE;
2955         bool strict_overflow_p = false;
2956         candidates.truncate (0);
2957         for (j = i; j; j = chains[j - 1])
2958           {
2959             tree type = TREE_TYPE (ranges[j - 1].exp);
2960             strict_overflow_p |= ranges[j - 1].strict_overflow_p;
2961             if (j == k
2962                 || useless_type_conversion_p (type1, type))
2963               ;
2964             else if (type2 == NULL_TREE
2965                      || useless_type_conversion_p (type2, type))
2966               {
2967                 if (type2 == NULL_TREE)
2968                   type2 = type;
2969                 candidates.safe_push (&ranges[j - 1]);
2970               }
2971           }
2972         unsigned l = candidates.length ();
2973         for (j = i; j; j = chains[j - 1])
2974           {
2975             tree type = TREE_TYPE (ranges[j - 1].exp);
2976             if (j == k)
2977               continue;
2978             if (useless_type_conversion_p (type1, type))
2979               ;
2980             else if (type2 == NULL_TREE
2981                      || useless_type_conversion_p (type2, type))
2982               continue;
2983             candidates.safe_push (&ranges[j - 1]);
2984           }
2985         gimple_seq seq = NULL;
2986         tree op = NULL_TREE;
2987         unsigned int id;
2988         struct range_entry *r;
2989         candidates.safe_push (&ranges[k - 1]);
2990         FOR_EACH_VEC_ELT (candidates, id, r)
2991           {
2992             gimple *g;
2993             if (id == 0)
2994               {
2995                 op = r->exp;
2996                 continue;
2997               }
2998             if (id == l)
2999               {
3000                 g = gimple_build_assign (make_ssa_name (type1), NOP_EXPR, op);
3001                 gimple_seq_add_stmt_without_update (&seq, g);
3002                 op = gimple_assign_lhs (g);
3003               }
3004             tree type = TREE_TYPE (r->exp);
3005             tree exp = r->exp;
3006             if (id >= l && !useless_type_conversion_p (type1, type))
3007               {
3008                 g = gimple_build_assign (make_ssa_name (type1), NOP_EXPR, exp);
3009                 gimple_seq_add_stmt_without_update (&seq, g);
3010                 exp = gimple_assign_lhs (g);
3011               }
3012             g = gimple_build_assign (make_ssa_name (id >= l ? type1 : type2),
3013                                      (b & 1) ? BIT_AND_EXPR : BIT_IOR_EXPR,
3014                                      op, exp);
3015             gimple_seq_add_stmt_without_update (&seq, g);
3016             op = gimple_assign_lhs (g);
3017           }
3018         candidates.pop ();
3019         if (update_range_test (&ranges[k - 1], NULL, candidates.address (),
3020                                candidates.length (), opcode, ops, op,
3021                                seq, true, ranges[k - 1].low,
3022                                ranges[k - 1].low, strict_overflow_p))
3023           any_changes = true;
3024         else
3025           gimple_seq_discard (seq);
3026       }
3027
3028   return any_changes;
3029 }
3030
3031 /* Attempt to optimize for signed a and b where b is known to be >= 0:
3032    a >= 0 && a < b into (unsigned) a < (unsigned) b
3033    a >= 0 && a <= b into (unsigned) a <= (unsigned) b  */
3034
3035 static bool
3036 optimize_range_tests_var_bound (enum tree_code opcode, int first, int length,
3037                                 vec<operand_entry *> *ops,
3038                                 struct range_entry *ranges,
3039                                 basic_block first_bb)
3040 {
3041   int i;
3042   bool any_changes = false;
3043   hash_map<tree, int> *map = NULL;
3044
3045   for (i = first; i < length; i++)
3046     {
3047       if (ranges[i].exp == NULL_TREE
3048           || TREE_CODE (ranges[i].exp) != SSA_NAME
3049           || !ranges[i].in_p)
3050         continue;
3051
3052       tree type = TREE_TYPE (ranges[i].exp);
3053       if (!INTEGRAL_TYPE_P (type)
3054           || TYPE_UNSIGNED (type)
3055           || ranges[i].low == NULL_TREE
3056           || !integer_zerop (ranges[i].low)
3057           || ranges[i].high != NULL_TREE)
3058         continue;
3059       /* EXP >= 0 here.  */
3060       if (map == NULL)
3061         map = new hash_map <tree, int>;
3062       map->put (ranges[i].exp, i);
3063     }
3064
3065   if (map == NULL)
3066     return false;
3067
3068   for (i = 0; i < length; i++)
3069     {
3070       bool in_p = ranges[i].in_p;
3071       if (ranges[i].low == NULL_TREE
3072           || ranges[i].high == NULL_TREE)
3073         continue;
3074       if (!integer_zerop (ranges[i].low)
3075           || !integer_zerop (ranges[i].high))
3076         {
3077           if (ranges[i].exp
3078               && TYPE_PRECISION (TREE_TYPE (ranges[i].exp)) == 1
3079               && TYPE_UNSIGNED (TREE_TYPE (ranges[i].exp))
3080               && integer_onep (ranges[i].low)
3081               && integer_onep (ranges[i].high))
3082             in_p = !in_p;
3083           else
3084             continue;
3085         }
3086
3087       gimple *stmt;
3088       tree_code ccode;
3089       tree rhs1, rhs2;
3090       if (ranges[i].exp)
3091         {
3092           if (TREE_CODE (ranges[i].exp) != SSA_NAME)
3093             continue;
3094           stmt = SSA_NAME_DEF_STMT (ranges[i].exp);
3095           if (!is_gimple_assign (stmt))
3096             continue;
3097           ccode = gimple_assign_rhs_code (stmt);
3098           rhs1 = gimple_assign_rhs1 (stmt);
3099           rhs2 = gimple_assign_rhs2 (stmt);
3100         }
3101       else
3102         {
3103           operand_entry *oe = (*ops)[ranges[i].idx];
3104           stmt = last_stmt (BASIC_BLOCK_FOR_FN (cfun, oe->id));
3105           if (gimple_code (stmt) != GIMPLE_COND)
3106             continue;
3107           ccode = gimple_cond_code (stmt);
3108           rhs1 = gimple_cond_lhs (stmt);
3109           rhs2 = gimple_cond_rhs (stmt);
3110         }
3111
3112       if (TREE_CODE (rhs1) != SSA_NAME
3113           || rhs2 == NULL_TREE
3114           || TREE_CODE (rhs2) != SSA_NAME)
3115         continue;
3116
3117       switch (ccode)
3118         {
3119         case GT_EXPR:
3120         case GE_EXPR:
3121         case LT_EXPR:
3122         case LE_EXPR:
3123           break;
3124         default:
3125           continue;
3126         }
3127       if (in_p)
3128         ccode = invert_tree_comparison (ccode, false);
3129       switch (ccode)
3130         {
3131         case GT_EXPR:
3132         case GE_EXPR:
3133           std::swap (rhs1, rhs2);
3134           ccode = swap_tree_comparison (ccode);
3135           break;
3136         case LT_EXPR:
3137         case LE_EXPR:
3138           break;
3139         default:
3140           gcc_unreachable ();
3141         }
3142
3143       int *idx = map->get (rhs1);
3144       if (idx == NULL)
3145         continue;
3146
3147       /* maybe_optimize_range_tests allows statements without side-effects
3148          in the basic blocks as long as they are consumed in the same bb.
3149          Make sure rhs2's def stmt is not among them, otherwise we can't
3150          use safely get_nonzero_bits on it.  E.g. in:
3151           # RANGE [-83, 1] NONZERO 173
3152           # k_32 = PHI <k_47(13), k_12(9)>
3153          ...
3154           if (k_32 >= 0)
3155             goto <bb 5>; [26.46%]
3156           else
3157             goto <bb 9>; [73.54%]
3158
3159           <bb 5> [local count: 140323371]:
3160           # RANGE [0, 1] NONZERO 1
3161           _5 = (int) k_32;
3162           # RANGE [0, 4] NONZERO 4
3163           _21 = _5 << 2;
3164           # RANGE [0, 4] NONZERO 4
3165           iftmp.0_44 = (char) _21;
3166           if (k_32 < iftmp.0_44)
3167             goto <bb 6>; [84.48%]
3168           else
3169             goto <bb 9>; [15.52%]
3170          the ranges on _5/_21/iftmp.0_44 are flow sensitive, assume that
3171          k_32 >= 0.  If we'd optimize k_32 >= 0 to true and k_32 < iftmp.0_44
3172          to (unsigned) k_32 < (unsigned) iftmp.0_44, then we would execute
3173          those stmts even for negative k_32 and the value ranges would be no
3174          longer guaranteed and so the optimization would be invalid.  */
3175       if (opcode == ERROR_MARK)
3176         {
3177           gimple *g = SSA_NAME_DEF_STMT (rhs2);
3178           basic_block bb2 = gimple_bb (g);
3179           if (bb2
3180               && bb2 != first_bb
3181               && dominated_by_p (CDI_DOMINATORS, bb2, first_bb))
3182             {
3183               /* As an exception, handle a few common cases.  */
3184               if (gimple_assign_cast_p (g)
3185                   && INTEGRAL_TYPE_P (TREE_TYPE (gimple_assign_rhs1 (g)))
3186                   && TYPE_UNSIGNED (TREE_TYPE (gimple_assign_rhs1 (g)))
3187                   && (TYPE_PRECISION (TREE_TYPE (rhs2))
3188                       > TYPE_PRECISION (TREE_TYPE (gimple_assign_rhs1 (g)))))
3189                 /* Zero-extension is always ok.  */ ;
3190               else if (is_gimple_assign (g)
3191                        && gimple_assign_rhs_code (g) == BIT_AND_EXPR
3192                        && TREE_CODE (gimple_assign_rhs2 (g)) == INTEGER_CST
3193                        && !wi::neg_p (wi::to_wide (gimple_assign_rhs2 (g))))
3194                 /* Masking with INTEGER_CST with MSB clear is always ok
3195                    too.  */ ;
3196               else
3197                 continue;
3198             }
3199         }
3200
3201       wide_int nz = get_nonzero_bits (rhs2);
3202       if (wi::neg_p (nz))
3203         continue;
3204
3205       /* We have EXP < RHS2 or EXP <= RHS2 where EXP >= 0
3206          and RHS2 is known to be RHS2 >= 0.  */
3207       tree utype = unsigned_type_for (TREE_TYPE (rhs1));
3208
3209       enum warn_strict_overflow_code wc = WARN_STRICT_OVERFLOW_COMPARISON;
3210       if ((ranges[*idx].strict_overflow_p
3211            || ranges[i].strict_overflow_p)
3212           && issue_strict_overflow_warning (wc))
3213         warning_at (gimple_location (stmt), OPT_Wstrict_overflow,
3214                     "assuming signed overflow does not occur "
3215                     "when simplifying range test");
3216
3217       if (dump_file && (dump_flags & TDF_DETAILS))
3218         {
3219           struct range_entry *r = &ranges[*idx];
3220           fprintf (dump_file, "Optimizing range test ");
3221           print_generic_expr (dump_file, r->exp);
3222           fprintf (dump_file, " +[");
3223           print_generic_expr (dump_file, r->low);
3224           fprintf (dump_file, ", ");
3225           print_generic_expr (dump_file, r->high);
3226           fprintf (dump_file, "] and comparison ");
3227           print_generic_expr (dump_file, rhs1);
3228           fprintf (dump_file, " %s ", op_symbol_code (ccode));
3229           print_generic_expr (dump_file, rhs2);
3230           fprintf (dump_file, "\n into (");
3231           print_generic_expr (dump_file, utype);
3232           fprintf (dump_file, ") ");
3233           print_generic_expr (dump_file, rhs1);
3234           fprintf (dump_file, " %s (", op_symbol_code (ccode));
3235           print_generic_expr (dump_file, utype);
3236           fprintf (dump_file, ") ");
3237           print_generic_expr (dump_file, rhs2);
3238           fprintf (dump_file, "\n");
3239         }
3240
3241       operand_entry *oe = (*ops)[ranges[i].idx];
3242       ranges[i].in_p = 0;
3243       if (opcode == BIT_IOR_EXPR
3244           || (opcode == ERROR_MARK && oe->rank == BIT_IOR_EXPR))
3245         {
3246           ranges[i].in_p = 1;
3247           ccode = invert_tree_comparison (ccode, false);
3248         }
3249
3250       unsigned int uid = gimple_uid (stmt);
3251       gimple_stmt_iterator gsi = gsi_for_stmt (stmt);
3252       gimple *g = gimple_build_assign (make_ssa_name (utype), NOP_EXPR, rhs1);
3253       gimple_set_uid (g, uid);
3254       rhs1 = gimple_assign_lhs (g);
3255       gsi_insert_before (&gsi, g, GSI_SAME_STMT);
3256       g = gimple_build_assign (make_ssa_name (utype), NOP_EXPR, rhs2);
3257       gimple_set_uid (g, uid);
3258       rhs2 = gimple_assign_lhs (g);
3259       gsi_insert_before (&gsi, g, GSI_SAME_STMT);
3260       if (tree_swap_operands_p (rhs1, rhs2))
3261         {
3262           std::swap (rhs1, rhs2);
3263           ccode = swap_tree_comparison (ccode);
3264         }
3265       if (gimple_code (stmt) == GIMPLE_COND)
3266         {
3267           gcond *c = as_a <gcond *> (stmt);
3268           gimple_cond_set_code (c, ccode);
3269           gimple_cond_set_lhs (c, rhs1);
3270           gimple_cond_set_rhs (c, rhs2);
3271           update_stmt (stmt);
3272         }
3273       else
3274         {
3275           tree ctype = oe->op ? TREE_TYPE (oe->op) : boolean_type_node;
3276           if (!INTEGRAL_TYPE_P (ctype)
3277               || (TREE_CODE (ctype) != BOOLEAN_TYPE
3278                   && TYPE_PRECISION (ctype) != 1))
3279             ctype = boolean_type_node;
3280           g = gimple_build_assign (make_ssa_name (ctype), ccode, rhs1, rhs2);
3281           gimple_set_uid (g, uid);
3282           gsi_insert_before (&gsi, g, GSI_SAME_STMT);
3283           if (oe->op && ctype != TREE_TYPE (oe->op))
3284             {
3285               g = gimple_build_assign (make_ssa_name (TREE_TYPE (oe->op)),
3286                                        NOP_EXPR, gimple_assign_lhs (g));
3287               gimple_set_uid (g, uid);
3288               gsi_insert_before (&gsi, g, GSI_SAME_STMT);
3289             }
3290           ranges[i].exp = gimple_assign_lhs (g);
3291           oe->op = ranges[i].exp;
3292           ranges[i].low = build_zero_cst (TREE_TYPE (ranges[i].exp));
3293           ranges[i].high = ranges[i].low;
3294         }
3295       ranges[i].strict_overflow_p = false;
3296       oe = (*ops)[ranges[*idx].idx];
3297       /* Now change all the other range test immediate uses, so that
3298          those tests will be optimized away.  */
3299       if (opcode == ERROR_MARK)
3300         {
3301           if (oe->op)
3302             oe->op = build_int_cst (TREE_TYPE (oe->op),
3303                                     oe->rank == BIT_IOR_EXPR ? 0 : 1);
3304           else
3305             oe->op = (oe->rank == BIT_IOR_EXPR
3306                       ? boolean_false_node : boolean_true_node);
3307         }
3308       else
3309         oe->op = error_mark_node;
3310       ranges[*idx].exp = NULL_TREE;
3311       ranges[*idx].low = NULL_TREE;
3312       ranges[*idx].high = NULL_TREE;
3313       any_changes = true;
3314     }
3315
3316   delete map;
3317   return any_changes;
3318 }
3319
3320 /* Optimize range tests, similarly how fold_range_test optimizes
3321    it on trees.  The tree code for the binary
3322    operation between all the operands is OPCODE.
3323    If OPCODE is ERROR_MARK, optimize_range_tests is called from within
3324    maybe_optimize_range_tests for inter-bb range optimization.
3325    In that case if oe->op is NULL, oe->id is bb->index whose
3326    GIMPLE_COND is && or ||ed into the test, and oe->rank says
3327    the actual opcode.
3328    FIRST_BB is the first basic block if OPCODE is ERROR_MARK.  */
3329
3330 static bool
3331 optimize_range_tests (enum tree_code opcode,
3332                       vec<operand_entry *> *ops, basic_block first_bb)
3333 {
3334   unsigned int length = ops->length (), i, j, first;
3335   operand_entry *oe;
3336   struct range_entry *ranges;
3337   bool any_changes = false;
3338
3339   if (length == 1)
3340     return false;
3341
3342   ranges = XNEWVEC (struct range_entry, length);
3343   for (i = 0; i < length; i++)
3344     {
3345       oe = (*ops)[i];
3346       ranges[i].idx = i;
3347       init_range_entry (ranges + i, oe->op,
3348                         oe->op
3349                         ? NULL
3350                         : last_stmt (BASIC_BLOCK_FOR_FN (cfun, oe->id)));
3351       /* For | invert it now, we will invert it again before emitting
3352          the optimized expression.  */
3353       if (opcode == BIT_IOR_EXPR
3354           || (opcode == ERROR_MARK && oe->rank == BIT_IOR_EXPR))
3355         ranges[i].in_p = !ranges[i].in_p;
3356     }
3357
3358   qsort (ranges, length, sizeof (*ranges), range_entry_cmp);
3359   for (i = 0; i < length; i++)
3360     if (ranges[i].exp != NULL_TREE && TREE_CODE (ranges[i].exp) == SSA_NAME)
3361       break;
3362
3363   /* Try to merge ranges.  */
3364   for (first = i; i < length; i++)
3365     {
3366       tree low = ranges[i].low;
3367       tree high = ranges[i].high;
3368       int in_p = ranges[i].in_p;
3369       bool strict_overflow_p = ranges[i].strict_overflow_p;
3370       int update_fail_count = 0;
3371
3372       for (j = i + 1; j < length; j++)
3373         {
3374           if (ranges[i].exp != ranges[j].exp)
3375             break;
3376           if (!merge_ranges (&in_p, &low, &high, in_p, low, high,
3377                              ranges[j].in_p, ranges[j].low, ranges[j].high))
3378             break;
3379           strict_overflow_p |= ranges[j].strict_overflow_p;
3380         }
3381
3382       if (j == i + 1)
3383         continue;
3384
3385       if (update_range_test (ranges + i, ranges + i + 1, NULL, j - i - 1,
3386                              opcode, ops, ranges[i].exp, NULL, in_p,
3387                              low, high, strict_overflow_p))
3388         {
3389           i = j - 1;
3390           any_changes = true;
3391         }
3392       /* Avoid quadratic complexity if all merge_ranges calls would succeed,
3393          while update_range_test would fail.  */
3394       else if (update_fail_count == 64)
3395         i = j - 1;
3396       else
3397         ++update_fail_count;
3398     }
3399
3400   any_changes |= optimize_range_tests_1 (opcode, first, length, true,
3401                                          ops, ranges);
3402
3403   if (BRANCH_COST (optimize_function_for_speed_p (cfun), false) >= 2)
3404     any_changes |= optimize_range_tests_1 (opcode, first, length, false,
3405                                            ops, ranges);
3406   if (lshift_cheap_p (optimize_function_for_speed_p (cfun)))
3407     any_changes |= optimize_range_tests_to_bit_test (opcode, first, length,
3408                                                      ops, ranges);
3409   any_changes |= optimize_range_tests_cmp_bitwise (opcode, first, length,
3410                                                    ops, ranges);
3411   any_changes |= optimize_range_tests_var_bound (opcode, first, length, ops,
3412                                                  ranges, first_bb);
3413
3414   if (any_changes && opcode != ERROR_MARK)
3415     {
3416       j = 0;
3417       FOR_EACH_VEC_ELT (*ops, i, oe)
3418         {
3419           if (oe->op == error_mark_node)
3420             continue;
3421           else if (i != j)
3422             (*ops)[j] = oe;
3423           j++;
3424         }
3425       ops->truncate (j);
3426     }
3427
3428   XDELETEVEC (ranges);
3429   return any_changes;
3430 }
3431
3432 /* A subroutine of optimize_vec_cond_expr to extract and canonicalize
3433    the operands of the VEC_COND_EXPR.  Returns ERROR_MARK on failure,
3434    otherwise the comparison code.  */
3435
3436 static tree_code
3437 ovce_extract_ops (tree var, gassign **rets, bool *reti)
3438 {
3439   if (TREE_CODE (var) != SSA_NAME)
3440     return ERROR_MARK;
3441
3442   gassign *stmt = dyn_cast <gassign *> (SSA_NAME_DEF_STMT (var));
3443   if (stmt == NULL)
3444     return ERROR_MARK;
3445
3446   /* ??? If we start creating more COND_EXPR, we could perform
3447      this same optimization with them.  For now, simplify.  */
3448   if (gimple_assign_rhs_code (stmt) != VEC_COND_EXPR)
3449     return ERROR_MARK;
3450
3451   tree cond = gimple_assign_rhs1 (stmt);
3452   tree_code cmp = TREE_CODE (cond);
3453   if (TREE_CODE_CLASS (cmp) != tcc_comparison)
3454     return ERROR_MARK;
3455
3456   /* ??? For now, allow only canonical true and false result vectors.
3457      We could expand this to other constants should the need arise,
3458      but at the moment we don't create them.  */
3459   tree t = gimple_assign_rhs2 (stmt);
3460   tree f = gimple_assign_rhs3 (stmt);
3461   bool inv;
3462   if (integer_all_onesp (t))
3463     inv = false;
3464   else if (integer_all_onesp (f))
3465     {
3466       cmp = invert_tree_comparison (cmp, false);
3467       inv = true;
3468     }
3469   else
3470     return ERROR_MARK;
3471   if (!integer_zerop (f))
3472     return ERROR_MARK;
3473
3474   /* Success!  */
3475   if (rets)
3476     *rets = stmt;
3477   if (reti)
3478     *reti = inv;
3479   return cmp;
3480 }
3481
3482 /* Optimize the condition of VEC_COND_EXPRs which have been combined
3483    with OPCODE (either BIT_AND_EXPR or BIT_IOR_EXPR).  */
3484
3485 static bool
3486 optimize_vec_cond_expr (tree_code opcode, vec<operand_entry *> *ops)
3487 {
3488   unsigned int length = ops->length (), i, j;
3489   bool any_changes = false;
3490
3491   if (length == 1)
3492     return false;
3493
3494   for (i = 0; i < length; ++i)
3495     {
3496       tree elt0 = (*ops)[i]->op;
3497
3498       gassign *stmt0;
3499       bool invert;
3500       tree_code cmp0 = ovce_extract_ops (elt0, &stmt0, &invert);
3501       if (cmp0 == ERROR_MARK)
3502         continue;
3503
3504       for (j = i + 1; j < length; ++j)
3505         {
3506           tree &elt1 = (*ops)[j]->op;
3507
3508           gassign *stmt1;
3509           tree_code cmp1 = ovce_extract_ops (elt1, &stmt1, NULL);
3510           if (cmp1 == ERROR_MARK)
3511             continue;
3512
3513           tree cond0 = gimple_assign_rhs1 (stmt0);
3514           tree x0 = TREE_OPERAND (cond0, 0);
3515           tree y0 = TREE_OPERAND (cond0, 1);
3516
3517           tree cond1 = gimple_assign_rhs1 (stmt1);
3518           tree x1 = TREE_OPERAND (cond1, 0);
3519           tree y1 = TREE_OPERAND (cond1, 1);
3520
3521           tree comb;
3522           if (opcode == BIT_AND_EXPR)
3523             comb = maybe_fold_and_comparisons (cmp0, x0, y0, cmp1, x1, y1);
3524           else if (opcode == BIT_IOR_EXPR)
3525             comb = maybe_fold_or_comparisons (cmp0, x0, y0, cmp1, x1, y1);
3526           else
3527             gcc_unreachable ();
3528           if (comb == NULL)
3529             continue;
3530
3531           /* Success! */
3532           if (dump_file && (dump_flags & TDF_DETAILS))
3533             {
3534               fprintf (dump_file, "Transforming ");
3535               print_generic_expr (dump_file, cond0);
3536               fprintf (dump_file, " %c ", opcode == BIT_AND_EXPR ? '&' : '|');
3537               print_generic_expr (dump_file, cond1);
3538               fprintf (dump_file, " into ");
3539               print_generic_expr (dump_file, comb);
3540               fputc ('\n', dump_file);
3541             }
3542
3543           gimple_assign_set_rhs1 (stmt0, comb);
3544           if (invert)
3545             std::swap (*gimple_assign_rhs2_ptr (stmt0),
3546                        *gimple_assign_rhs3_ptr (stmt0));
3547           update_stmt (stmt0);
3548
3549           elt1 = error_mark_node;
3550           any_changes = true;
3551         }
3552     }
3553
3554   if (any_changes)
3555     {
3556       operand_entry *oe;
3557       j = 0;
3558       FOR_EACH_VEC_ELT (*ops, i, oe)
3559         {
3560           if (oe->op == error_mark_node)
3561             continue;
3562           else if (i != j)
3563             (*ops)[j] = oe;
3564           j++;
3565         }
3566       ops->truncate (j);
3567     }
3568
3569   return any_changes;
3570 }
3571
3572 /* Return true if STMT is a cast like:
3573    <bb N>:
3574    ...
3575    _123 = (int) _234;
3576
3577    <bb M>:
3578    # _345 = PHI <_123(N), 1(...), 1(...)>
3579    where _234 has bool type, _123 has single use and
3580    bb N has a single successor M.  This is commonly used in
3581    the last block of a range test.
3582
3583    Also Return true if STMT is tcc_compare like:
3584    <bb N>:
3585    ...
3586    _234 = a_2(D) == 2;
3587
3588    <bb M>:
3589    # _345 = PHI <_234(N), 1(...), 1(...)>
3590    _346 = (int) _345;
3591    where _234 has booltype, single use and
3592    bb N has a single successor M.  This is commonly used in
3593    the last block of a range test.  */
3594
3595 static bool
3596 final_range_test_p (gimple *stmt)
3597 {
3598   basic_block bb, rhs_bb, lhs_bb;
3599   edge e;
3600   tree lhs, rhs;
3601   use_operand_p use_p;
3602   gimple *use_stmt;
3603
3604   if (!gimple_assign_cast_p (stmt)
3605       && (!is_gimple_assign (stmt)
3606           || (TREE_CODE_CLASS (gimple_assign_rhs_code (stmt))
3607               != tcc_comparison)))
3608     return false;
3609   bb = gimple_bb (stmt);
3610   if (!single_succ_p (bb))
3611     return false;
3612   e = single_succ_edge (bb);
3613   if (e->flags & EDGE_COMPLEX)
3614     return false;
3615
3616   lhs = gimple_assign_lhs (stmt);
3617   rhs = gimple_assign_rhs1 (stmt);
3618   if (gimple_assign_cast_p (stmt)
3619       && (!INTEGRAL_TYPE_P (TREE_TYPE (lhs))
3620           || TREE_CODE (rhs) != SSA_NAME
3621           || TREE_CODE (TREE_TYPE (rhs)) != BOOLEAN_TYPE))
3622     return false;
3623
3624   if (!gimple_assign_cast_p (stmt)
3625       && (TREE_CODE (TREE_TYPE (lhs)) != BOOLEAN_TYPE))
3626       return false;
3627
3628   /* Test whether lhs is consumed only by a PHI in the only successor bb.  */
3629   if (!single_imm_use (lhs, &use_p, &use_stmt))
3630     return false;
3631
3632   if (gimple_code (use_stmt) != GIMPLE_PHI
3633       || gimple_bb (use_stmt) != e->dest)
3634     return false;
3635
3636   /* And that the rhs is defined in the same loop.  */
3637   if (gimple_assign_cast_p (stmt))
3638     {
3639       if (TREE_CODE (rhs) != SSA_NAME
3640           || !(rhs_bb = gimple_bb (SSA_NAME_DEF_STMT (rhs)))
3641           || !flow_bb_inside_loop_p (loop_containing_stmt (stmt), rhs_bb))
3642         return false;
3643     }
3644   else
3645     {
3646       if (TREE_CODE (lhs) != SSA_NAME
3647           || !(lhs_bb = gimple_bb (SSA_NAME_DEF_STMT (lhs)))
3648           || !flow_bb_inside_loop_p (loop_containing_stmt (stmt), lhs_bb))
3649         return false;
3650     }
3651
3652   return true;
3653 }
3654
3655 /* Return true if BB is suitable basic block for inter-bb range test
3656    optimization.  If BACKWARD is true, BB should be the only predecessor
3657    of TEST_BB, and *OTHER_BB is either NULL and filled by the routine,
3658    or compared with to find a common basic block to which all conditions
3659    branch to if true resp. false.  If BACKWARD is false, TEST_BB should
3660    be the only predecessor of BB.  */
3661
3662 static bool
3663 suitable_cond_bb (basic_block bb, basic_block test_bb, basic_block *other_bb,
3664                   bool backward)
3665 {
3666   edge_iterator ei, ei2;
3667   edge e, e2;
3668   gimple *stmt;
3669   gphi_iterator gsi;
3670   bool other_edge_seen = false;
3671   bool is_cond;
3672
3673   if (test_bb == bb)
3674     return false;
3675   /* Check last stmt first.  */
3676   stmt = last_stmt (bb);
3677   if (stmt == NULL
3678       || (gimple_code (stmt) != GIMPLE_COND
3679           && (backward || !final_range_test_p (stmt)))
3680       || gimple_visited_p (stmt)
3681       || stmt_could_throw_p (stmt)
3682       || *other_bb == bb)
3683     return false;
3684   is_cond = gimple_code (stmt) == GIMPLE_COND;
3685   if (is_cond)
3686     {
3687       /* If last stmt is GIMPLE_COND, verify that one of the succ edges
3688          goes to the next bb (if BACKWARD, it is TEST_BB), and the other
3689          to *OTHER_BB (if not set yet, try to find it out).  */
3690       if (EDGE_COUNT (bb->succs) != 2)
3691         return false;
3692       FOR_EACH_EDGE (e, ei, bb->succs)
3693         {
3694           if (!(e->flags & (EDGE_TRUE_VALUE | EDGE_FALSE_VALUE)))
3695             return false;
3696           if (e->dest == test_bb)
3697             {
3698               if (backward)
3699                 continue;
3700               else
3701                 return false;
3702             }
3703           if (e->dest == bb)
3704             return false;
3705           if (*other_bb == NULL)
3706             {
3707               FOR_EACH_EDGE (e2, ei2, test_bb->succs)
3708                 if (!(e2->flags & (EDGE_TRUE_VALUE | EDGE_FALSE_VALUE)))
3709                   return false;
3710                 else if (e->dest == e2->dest)
3711                   *other_bb = e->dest;
3712               if (*other_bb == NULL)
3713                 return false;
3714             }
3715           if (e->dest == *other_bb)
3716             other_edge_seen = true;
3717           else if (backward)
3718             return false;
3719         }
3720       if (*other_bb == NULL || !other_edge_seen)
3721         return false;
3722     }
3723   else if (single_succ (bb) != *other_bb)
3724     return false;
3725
3726   /* Now check all PHIs of *OTHER_BB.  */
3727   e = find_edge (bb, *other_bb);
3728   e2 = find_edge (test_bb, *other_bb);
3729   for (gsi = gsi_start_phis (e->dest); !gsi_end_p (gsi); gsi_next (&gsi))
3730     {
3731       gphi *phi = gsi.phi ();
3732       /* If both BB and TEST_BB end with GIMPLE_COND, all PHI arguments
3733          corresponding to BB and TEST_BB predecessor must be the same.  */
3734       if (!operand_equal_p (gimple_phi_arg_def (phi, e->dest_idx),
3735                             gimple_phi_arg_def (phi, e2->dest_idx), 0))
3736         {
3737           /* Otherwise, if one of the blocks doesn't end with GIMPLE_COND,
3738              one of the PHIs should have the lhs of the last stmt in
3739              that block as PHI arg and that PHI should have 0 or 1
3740              corresponding to it in all other range test basic blocks
3741              considered.  */
3742           if (!is_cond)
3743             {
3744               if (gimple_phi_arg_def (phi, e->dest_idx)
3745                   == gimple_assign_lhs (stmt)
3746                   && (integer_zerop (gimple_phi_arg_def (phi, e2->dest_idx))
3747                       || integer_onep (gimple_phi_arg_def (phi,
3748                                                            e2->dest_idx))))
3749                 continue;
3750             }
3751           else
3752             {
3753               gimple *test_last = last_stmt (test_bb);
3754               if (gimple_code (test_last) != GIMPLE_COND
3755                   && gimple_phi_arg_def (phi, e2->dest_idx)
3756                      == gimple_assign_lhs (test_last)
3757                   && (integer_zerop (gimple_phi_arg_def (phi, e->dest_idx))
3758                       || integer_onep (gimple_phi_arg_def (phi, e->dest_idx))))
3759                 continue;
3760             }
3761
3762           return false;
3763         }
3764     }
3765   return true;
3766 }
3767
3768 /* Return true if BB doesn't have side-effects that would disallow
3769    range test optimization, all SSA_NAMEs set in the bb are consumed
3770    in the bb and there are no PHIs.  */
3771
3772 static bool
3773 no_side_effect_bb (basic_block bb)
3774 {
3775   gimple_stmt_iterator gsi;
3776   gimple *last;
3777
3778   if (!gimple_seq_empty_p (phi_nodes (bb)))
3779     return false;
3780   last = last_stmt (bb);
3781   for (gsi = gsi_start_bb (bb); !gsi_end_p (gsi); gsi_next (&gsi))
3782     {
3783       gimple *stmt = gsi_stmt (gsi);
3784       tree lhs;
3785       imm_use_iterator imm_iter;
3786       use_operand_p use_p;
3787
3788       if (is_gimple_debug (stmt))
3789         continue;
3790       if (gimple_has_side_effects (stmt))
3791         return false;
3792       if (stmt == last)
3793         return true;
3794       if (!is_gimple_assign (stmt))
3795         return false;
3796       lhs = gimple_assign_lhs (stmt);
3797       if (TREE_CODE (lhs) != SSA_NAME)
3798         return false;
3799       if (gimple_assign_rhs_could_trap_p (stmt))
3800         return false;
3801       FOR_EACH_IMM_USE_FAST (use_p, imm_iter, lhs)
3802         {
3803           gimple *use_stmt = USE_STMT (use_p);
3804           if (is_gimple_debug (use_stmt))
3805             continue;
3806           if (gimple_bb (use_stmt) != bb)
3807             return false;
3808         }
3809     }
3810   return false;
3811 }
3812
3813 /* If VAR is set by CODE (BIT_{AND,IOR}_EXPR) which is reassociable,
3814    return true and fill in *OPS recursively.  */
3815
3816 static bool
3817 get_ops (tree var, enum tree_code code, vec<operand_entry *> *ops,
3818          struct loop *loop)
3819 {
3820   gimple *stmt = SSA_NAME_DEF_STMT (var);
3821   tree rhs[2];
3822   int i;
3823
3824   if (!is_reassociable_op (stmt, code, loop))
3825     return false;
3826
3827   rhs[0] = gimple_assign_rhs1 (stmt);
3828   rhs[1] = gimple_assign_rhs2 (stmt);
3829   gimple_set_visited (stmt, true);
3830   for (i = 0; i < 2; i++)
3831     if (TREE_CODE (rhs[i]) == SSA_NAME
3832         && !get_ops (rhs[i], code, ops, loop)
3833         && has_single_use (rhs[i]))
3834       {
3835         operand_entry *oe = operand_entry_pool.allocate ();
3836
3837         oe->op = rhs[i];
3838         oe->rank = code;
3839         oe->id = 0;
3840         oe->count = 1;
3841         oe->stmt_to_insert = NULL;
3842         ops->safe_push (oe);
3843       }
3844   return true;
3845 }
3846
3847 /* Find the ops that were added by get_ops starting from VAR, see if
3848    they were changed during update_range_test and if yes, create new
3849    stmts.  */
3850
3851 static tree
3852 update_ops (tree var, enum tree_code code, vec<operand_entry *> ops,
3853             unsigned int *pidx, struct loop *loop)
3854 {
3855   gimple *stmt = SSA_NAME_DEF_STMT (var);
3856   tree rhs[4];
3857   int i;
3858
3859   if (!is_reassociable_op (stmt, code, loop))
3860     return NULL;
3861
3862   rhs[0] = gimple_assign_rhs1 (stmt);
3863   rhs[1] = gimple_assign_rhs2 (stmt);
3864   rhs[2] = rhs[0];
3865   rhs[3] = rhs[1];
3866   for (i = 0; i < 2; i++)
3867     if (TREE_CODE (rhs[i]) == SSA_NAME)
3868       {
3869         rhs[2 + i] = update_ops (rhs[i], code, ops, pidx, loop);
3870         if (rhs[2 + i] == NULL_TREE)
3871           {
3872             if (has_single_use (rhs[i]))
3873               rhs[2 + i] = ops[(*pidx)++]->op;
3874             else
3875               rhs[2 + i] = rhs[i];
3876           }
3877       }
3878   if ((rhs[2] != rhs[0] || rhs[3] != rhs[1])
3879       && (rhs[2] != rhs[1] || rhs[3] != rhs[0]))
3880     {
3881       gimple_stmt_iterator gsi = gsi_for_stmt (stmt);
3882       var = make_ssa_name (TREE_TYPE (var));
3883       gassign *g = gimple_build_assign (var, gimple_assign_rhs_code (stmt),
3884                                         rhs[2], rhs[3]);
3885       gimple_set_uid (g, gimple_uid (stmt));
3886       gimple_set_visited (g, true);
3887       gsi_insert_before (&gsi, g, GSI_SAME_STMT);
3888     }
3889   return var;
3890 }
3891
3892 /* Structure to track the initial value passed to get_ops and
3893    the range in the ops vector for each basic block.  */
3894
3895 struct inter_bb_range_test_entry
3896 {
3897   tree op;
3898   unsigned int first_idx, last_idx;
3899 };
3900
3901 /* Inter-bb range test optimization.
3902
3903    Returns TRUE if a gimple conditional is optimized to a true/false,
3904    otherwise return FALSE.
3905
3906    This indicates to the caller that it should run a CFG cleanup pass
3907    once reassociation is completed.  */
3908
3909 static bool
3910 maybe_optimize_range_tests (gimple *stmt)
3911 {
3912   basic_block first_bb = gimple_bb (stmt);
3913   basic_block last_bb = first_bb;
3914   basic_block other_bb = NULL;
3915   basic_block bb;
3916   edge_iterator ei;
3917   edge e;
3918   auto_vec<operand_entry *> ops;
3919   auto_vec<inter_bb_range_test_entry> bbinfo;
3920   bool any_changes = false;
3921   bool cfg_cleanup_needed = false;
3922
3923   /* Consider only basic blocks that end with GIMPLE_COND or
3924      a cast statement satisfying final_range_test_p.  All
3925      but the last bb in the first_bb .. last_bb range
3926      should end with GIMPLE_COND.  */
3927   if (gimple_code (stmt) == GIMPLE_COND)
3928     {
3929       if (EDGE_COUNT (first_bb->succs) != 2)
3930         return cfg_cleanup_needed;
3931     }
3932   else if (final_range_test_p (stmt))
3933     other_bb = single_succ (first_bb);
3934   else
3935     return cfg_cleanup_needed;
3936
3937   if (stmt_could_throw_p (stmt))
3938     return cfg_cleanup_needed;
3939
3940   /* As relative ordering of post-dominator sons isn't fixed,
3941      maybe_optimize_range_tests can be called first on any
3942      bb in the range we want to optimize.  So, start searching
3943      backwards, if first_bb can be set to a predecessor.  */
3944   while (single_pred_p (first_bb))
3945     {
3946       basic_block pred_bb = single_pred (first_bb);
3947       if (!suitable_cond_bb (pred_bb, first_bb, &other_bb, true))
3948         break;
3949       if (!no_side_effect_bb (first_bb))
3950         break;
3951       first_bb = pred_bb;
3952     }
3953   /* If first_bb is last_bb, other_bb hasn't been computed yet.
3954      Before starting forward search in last_bb successors, find
3955      out the other_bb.  */
3956   if (first_bb == last_bb)
3957     {
3958       other_bb = NULL;
3959       /* As non-GIMPLE_COND last stmt always terminates the range,
3960          if forward search didn't discover anything, just give up.  */
3961       if (gimple_code (stmt) != GIMPLE_COND)
3962         return cfg_cleanup_needed;
3963       /* Look at both successors.  Either it ends with a GIMPLE_COND
3964          and satisfies suitable_cond_bb, or ends with a cast and
3965          other_bb is that cast's successor.  */
3966       FOR_EACH_EDGE (e, ei, first_bb->succs)
3967         if (!(e->flags & (EDGE_TRUE_VALUE | EDGE_FALSE_VALUE))
3968             || e->dest == first_bb)
3969           return cfg_cleanup_needed;
3970         else if (single_pred_p (e->dest))
3971           {
3972             stmt = last_stmt (e->dest);
3973             if (stmt
3974                 && gimple_code (stmt) == GIMPLE_COND
3975                 && EDGE_COUNT (e->dest->succs) == 2)
3976               {
3977                 if (suitable_cond_bb (first_bb, e->dest, &other_bb, true))
3978                   break;
3979                 else
3980                   other_bb = NULL;
3981               }
3982             else if (stmt
3983                      && final_range_test_p (stmt)
3984                      && find_edge (first_bb, single_succ (e->dest)))
3985               {
3986                 other_bb = single_succ (e->dest);
3987                 if (other_bb == first_bb)
3988                   other_bb = NULL;
3989               }
3990           }
3991       if (other_bb == NULL)
3992         return cfg_cleanup_needed;
3993     }
3994   /* Now do the forward search, moving last_bb to successor bbs
3995      that aren't other_bb.  */
3996   while (EDGE_COUNT (last_bb->succs) == 2)
3997     {
3998       FOR_EACH_EDGE (e, ei, last_bb->succs)
3999         if (e->dest != other_bb)
4000           break;
4001       if (e == NULL)
4002         break;
4003       if (!single_pred_p (e->dest))
4004         break;
4005       if (!suitable_cond_bb (e->dest, last_bb, &other_bb, false))
4006         break;
4007       if (!no_side_effect_bb (e->dest))
4008         break;
4009       last_bb = e->dest;
4010     }
4011   if (first_bb == last_bb)
4012     return cfg_cleanup_needed;
4013   /* Here basic blocks first_bb through last_bb's predecessor
4014      end with GIMPLE_COND, all of them have one of the edges to
4015      other_bb and another to another block in the range,
4016      all blocks except first_bb don't have side-effects and
4017      last_bb ends with either GIMPLE_COND, or cast satisfying
4018      final_range_test_p.  */
4019   for (bb = last_bb; ; bb = single_pred (bb))
4020     {
4021       enum tree_code code;
4022       tree lhs, rhs;
4023       inter_bb_range_test_entry bb_ent;
4024
4025       bb_ent.op = NULL_TREE;
4026       bb_ent.first_idx = ops.length ();
4027       bb_ent.last_idx = bb_ent.first_idx;
4028       e = find_edge (bb, other_bb);
4029       stmt = last_stmt (bb);
4030       gimple_set_visited (stmt, true);
4031       if (gimple_code (stmt) != GIMPLE_COND)
4032         {
4033           use_operand_p use_p;
4034           gimple *phi;
4035           edge e2;
4036           unsigned int d;
4037
4038           lhs = gimple_assign_lhs (stmt);
4039           rhs = gimple_assign_rhs1 (stmt);
4040           gcc_assert (bb == last_bb);
4041
4042           /* stmt is
4043              _123 = (int) _234;
4044              OR
4045              _234 = a_2(D) == 2;
4046
4047              followed by:
4048              <bb M>:
4049              # _345 = PHI <_123(N), 1(...), 1(...)>
4050
4051              or 0 instead of 1.  If it is 0, the _234
4052              range test is anded together with all the
4053              other range tests, if it is 1, it is ored with
4054              them.  */
4055           single_imm_use (lhs, &use_p, &phi);
4056           gcc_assert (gimple_code (phi) == GIMPLE_PHI);
4057           e2 = find_edge (first_bb, other_bb);
4058           d = e2->dest_idx;
4059           gcc_assert (gimple_phi_arg_def (phi, e->dest_idx) == lhs);
4060           if (integer_zerop (gimple_phi_arg_def (phi, d)))
4061             code = BIT_AND_EXPR;
4062           else
4063             {
4064               gcc_checking_assert (integer_onep (gimple_phi_arg_def (phi, d)));
4065               code = BIT_IOR_EXPR;
4066             }
4067
4068           /* If _234 SSA_NAME_DEF_STMT is
4069              _234 = _567 | _789;
4070              (or &, corresponding to 1/0 in the phi arguments,
4071              push into ops the individual range test arguments
4072              of the bitwise or resp. and, recursively.  */
4073           if (TREE_CODE (rhs) == SSA_NAME
4074               && (TREE_CODE_CLASS (gimple_assign_rhs_code (stmt))
4075                   != tcc_comparison)
4076               && !get_ops (rhs, code, &ops,
4077                         loop_containing_stmt (stmt))
4078               && has_single_use (rhs))
4079             {
4080               /* Otherwise, push the _234 range test itself.  */
4081               operand_entry *oe = operand_entry_pool.allocate ();
4082
4083               oe->op = rhs;
4084               oe->rank = code;
4085               oe->id = 0;
4086               oe->count = 1;
4087               oe->stmt_to_insert = NULL;
4088               ops.safe_push (oe);
4089               bb_ent.last_idx++;
4090               bb_ent.op = rhs;
4091             }
4092           else if (is_gimple_assign (stmt)
4093                    && (TREE_CODE_CLASS (gimple_assign_rhs_code (stmt))
4094                        == tcc_comparison)
4095                    && !get_ops (lhs, code, &ops,
4096                                 loop_containing_stmt (stmt))
4097                    && has_single_use (lhs))
4098             {
4099               operand_entry *oe = operand_entry_pool.allocate ();
4100               oe->op = lhs;
4101               oe->rank = code;
4102               oe->id = 0;
4103               oe->count = 1;
4104               ops.safe_push (oe);
4105               bb_ent.last_idx++;
4106               bb_ent.op = lhs;
4107             }
4108           else
4109             {
4110               bb_ent.last_idx = ops.length ();
4111               bb_ent.op = rhs;
4112             }
4113           bbinfo.safe_push (bb_ent);
4114           continue;
4115         }
4116       /* Otherwise stmt is GIMPLE_COND.  */
4117       code = gimple_cond_code (stmt);
4118       lhs = gimple_cond_lhs (stmt);
4119       rhs = gimple_cond_rhs (stmt);
4120       if (TREE_CODE (lhs) == SSA_NAME
4121           && INTEGRAL_TYPE_P (TREE_TYPE (lhs))
4122           && ((code != EQ_EXPR && code != NE_EXPR)
4123               || rhs != boolean_false_node
4124                  /* Either push into ops the individual bitwise
4125                     or resp. and operands, depending on which
4126                     edge is other_bb.  */
4127               || !get_ops (lhs, (((e->flags & EDGE_TRUE_VALUE) == 0)
4128                                  ^ (code == EQ_EXPR))
4129                                 ? BIT_AND_EXPR : BIT_IOR_EXPR, &ops,
4130                            loop_containing_stmt (stmt))))
4131         {
4132           /* Or push the GIMPLE_COND stmt itself.  */
4133           operand_entry *oe = operand_entry_pool.allocate ();
4134
4135           oe->op = NULL;
4136           oe->rank = (e->flags & EDGE_TRUE_VALUE)
4137                      ? BIT_IOR_EXPR : BIT_AND_EXPR;
4138           /* oe->op = NULL signs that there is no SSA_NAME
4139              for the range test, and oe->id instead is the
4140              basic block number, at which's end the GIMPLE_COND
4141              is.  */
4142           oe->id = bb->index;
4143           oe->count = 1;
4144           oe->stmt_to_insert = NULL;
4145           ops.safe_push (oe);
4146           bb_ent.op = NULL;
4147           bb_ent.last_idx++;
4148         }
4149       else if (ops.length () > bb_ent.first_idx)
4150         {
4151           bb_ent.op = lhs;
4152           bb_ent.last_idx = ops.length ();
4153         }
4154       bbinfo.safe_push (bb_ent);
4155       if (bb == first_bb)
4156         break;
4157     }
4158   if (ops.length () > 1)
4159     any_changes = optimize_range_tests (ERROR_MARK, &ops, first_bb);
4160   if (any_changes)
4161     {
4162       unsigned int idx, max_idx = 0;
4163       /* update_ops relies on has_single_use predicates returning the
4164          same values as it did during get_ops earlier.  Additionally it
4165          never removes statements, only adds new ones and it should walk
4166          from the single imm use and check the predicate already before
4167          making those changes.
4168          On the other side, the handling of GIMPLE_COND directly can turn
4169          previously multiply used SSA_NAMEs into single use SSA_NAMEs, so
4170          it needs to be done in a separate loop afterwards.  */
4171       for (bb = last_bb, idx = 0; ; bb = single_pred (bb), idx++)
4172         {
4173           if (bbinfo[idx].first_idx < bbinfo[idx].last_idx
4174               && bbinfo[idx].op != NULL_TREE)
4175             {
4176               tree new_op;
4177
4178               max_idx = idx;
4179               stmt = last_stmt (bb);
4180               new_op = update_ops (bbinfo[idx].op,
4181                                    (enum tree_code)
4182                                    ops[bbinfo[idx].first_idx]->rank,
4183                                    ops, &bbinfo[idx].first_idx,
4184                                    loop_containing_stmt (stmt));
4185               if (new_op == NULL_TREE)
4186                 {
4187                   gcc_assert (bb == last_bb);
4188                   new_op = ops[bbinfo[idx].first_idx++]->op;
4189                 }
4190               if (bbinfo[idx].op != new_op)
4191                 {
4192                   imm_use_iterator iter;
4193                   use_operand_p use_p;
4194                   gimple *use_stmt, *cast_or_tcc_cmp_stmt = NULL;
4195
4196                   FOR_EACH_IMM_USE_STMT (use_stmt, iter, bbinfo[idx].op)
4197                     if (is_gimple_debug (use_stmt))
4198                       continue;
4199                     else if (gimple_code (use_stmt) == GIMPLE_COND
4200                              || gimple_code (use_stmt) == GIMPLE_PHI)
4201                       FOR_EACH_IMM_USE_ON_STMT (use_p, iter)
4202                         SET_USE (use_p, new_op);
4203                     else if ((is_gimple_assign (use_stmt)
4204                               && (TREE_CODE_CLASS
4205                                   (gimple_assign_rhs_code (use_stmt))
4206                                   == tcc_comparison)))
4207                       cast_or_tcc_cmp_stmt = use_stmt;
4208                     else if (gimple_assign_cast_p (use_stmt))
4209                       cast_or_tcc_cmp_stmt = use_stmt;
4210                     else
4211                       gcc_unreachable ();
4212
4213                   if (cast_or_tcc_cmp_stmt)
4214                     {
4215                       gcc_assert (bb == last_bb);
4216                       tree lhs = gimple_assign_lhs (cast_or_tcc_cmp_stmt);
4217                       tree new_lhs = make_ssa_name (TREE_TYPE (lhs));
4218                       enum tree_code rhs_code
4219                         = gimple_assign_cast_p (cast_or_tcc_cmp_stmt)
4220                         ? gimple_assign_rhs_code (cast_or_tcc_cmp_stmt)
4221                         : CONVERT_EXPR;
4222                       gassign *g;
4223                       if (is_gimple_min_invariant (new_op))
4224                         {
4225                           new_op = fold_convert (TREE_TYPE (lhs), new_op);
4226                           g = gimple_build_assign (new_lhs, new_op);
4227                         }
4228                       else
4229                         g = gimple_build_assign (new_lhs, rhs_code, new_op);
4230                       gimple_stmt_iterator gsi
4231                         = gsi_for_stmt (cast_or_tcc_cmp_stmt);
4232                       gimple_set_uid (g, gimple_uid (cast_or_tcc_cmp_stmt));
4233                       gimple_set_visited (g, true);
4234                       gsi_insert_before (&gsi, g, GSI_SAME_STMT);
4235                       FOR_EACH_IMM_USE_STMT (use_stmt, iter, lhs)
4236                         if (is_gimple_debug (use_stmt))
4237                           continue;
4238                         else if (gimple_code (use_stmt) == GIMPLE_COND
4239                                  || gimple_code (use_stmt) == GIMPLE_PHI)
4240                           FOR_EACH_IMM_USE_ON_STMT (use_p, iter)
4241                             SET_USE (use_p, new_lhs);
4242                         else
4243                           gcc_unreachable ();
4244                     }
4245                 }
4246             }
4247           if (bb == first_bb)
4248             break;
4249         }
4250       for (bb = last_bb, idx = 0; ; bb = single_pred (bb), idx++)
4251         {
4252           if (bbinfo[idx].first_idx < bbinfo[idx].last_idx
4253               && bbinfo[idx].op == NULL_TREE
4254               && ops[bbinfo[idx].first_idx]->op != NULL_TREE)
4255             {
4256               gcond *cond_stmt = as_a <gcond *> (last_stmt (bb));
4257
4258               if (idx > max_idx)
4259                 max_idx = idx;
4260
4261               /* If we collapse the conditional to a true/false
4262                  condition, then bubble that knowledge up to our caller.  */
4263               if (integer_zerop (ops[bbinfo[idx].first_idx]->op))
4264                 {
4265                   gimple_cond_make_false (cond_stmt);
4266                   cfg_cleanup_needed = true;
4267                 }
4268               else if (integer_onep (ops[bbinfo[idx].first_idx]->op))
4269                 {
4270                   gimple_cond_make_true (cond_stmt);
4271                   cfg_cleanup_needed = true;
4272                 }
4273               else
4274                 {
4275                   gimple_cond_set_code (cond_stmt, NE_EXPR);
4276                   gimple_cond_set_lhs (cond_stmt,
4277                                        ops[bbinfo[idx].first_idx]->op);
4278                   gimple_cond_set_rhs (cond_stmt, boolean_false_node);
4279                 }
4280               update_stmt (cond_stmt);
4281             }
4282           if (bb == first_bb)
4283             break;
4284         }
4285
4286       /* The above changes could result in basic blocks after the first
4287          modified one, up to and including last_bb, to be executed even if
4288          they would not be in the original program.  If the value ranges of
4289          assignment lhs' in those bbs were dependent on the conditions
4290          guarding those basic blocks which now can change, the VRs might
4291          be incorrect.  As no_side_effect_bb should ensure those SSA_NAMEs
4292          are only used within the same bb, it should be not a big deal if
4293          we just reset all the VRs in those bbs.  See PR68671.  */
4294       for (bb = last_bb, idx = 0; idx < max_idx; bb = single_pred (bb), idx++)
4295         reset_flow_sensitive_info_in_bb (bb);
4296     }
4297   return cfg_cleanup_needed;
4298 }
4299
4300 /* Return true if OPERAND is defined by a PHI node which uses the LHS
4301    of STMT in it's operands.  This is also known as a "destructive
4302    update" operation.  */
4303
4304 static bool
4305 is_phi_for_stmt (gimple *stmt, tree operand)
4306 {
4307   gimple *def_stmt;
4308   gphi *def_phi;
4309   tree lhs;
4310   use_operand_p arg_p;
4311   ssa_op_iter i;
4312
4313   if (TREE_CODE (operand) != SSA_NAME)
4314     return false;
4315
4316   lhs = gimple_assign_lhs (stmt);
4317
4318   def_stmt = SSA_NAME_DEF_STMT (operand);
4319   def_phi = dyn_cast <gphi *> (def_stmt);
4320   if (!def_phi)
4321     return false;
4322
4323   FOR_EACH_PHI_ARG (arg_p, def_phi, i, SSA_OP_USE)
4324     if (lhs == USE_FROM_PTR (arg_p))
4325       return true;
4326   return false;
4327 }
4328
4329 /* Remove def stmt of VAR if VAR has zero uses and recurse
4330    on rhs1 operand if so.  */
4331
4332 static void
4333 remove_visited_stmt_chain (tree var)
4334 {
4335   gimple *stmt;
4336   gimple_stmt_iterator gsi;
4337
4338   while (1)
4339     {
4340       if (TREE_CODE (var) != SSA_NAME || !has_zero_uses (var))
4341         return;
4342       stmt = SSA_NAME_DEF_STMT (var);
4343       if (is_gimple_assign (stmt) && gimple_visited_p (stmt))
4344         {
4345           var = gimple_assign_rhs1 (stmt);
4346           gsi = gsi_for_stmt (stmt);
4347           reassoc_remove_stmt (&gsi);
4348           release_defs (stmt);
4349         }
4350       else
4351         return;
4352     }
4353 }
4354
4355 /* This function checks three consequtive operands in
4356    passed operands vector OPS starting from OPINDEX and
4357    swaps two operands if it is profitable for binary operation
4358    consuming OPINDEX + 1 abnd OPINDEX + 2 operands.
4359
4360    We pair ops with the same rank if possible.
4361
4362    The alternative we try is to see if STMT is a destructive
4363    update style statement, which is like:
4364    b = phi (a, ...)
4365    a = c + b;
4366    In that case, we want to use the destructive update form to
4367    expose the possible vectorizer sum reduction opportunity.
4368    In that case, the third operand will be the phi node. This
4369    check is not performed if STMT is null.
4370
4371    We could, of course, try to be better as noted above, and do a
4372    lot of work to try to find these opportunities in >3 operand
4373    cases, but it is unlikely to be worth it.  */
4374
4375 static void
4376 swap_ops_for_binary_stmt (vec<operand_entry *> ops,
4377                           unsigned int opindex, gimple *stmt)
4378 {
4379   operand_entry *oe1, *oe2, *oe3;
4380
4381   oe1 = ops[opindex];
4382   oe2 = ops[opindex + 1];
4383   oe3 = ops[opindex + 2];
4384
4385   if ((oe1->rank == oe2->rank
4386        && oe2->rank != oe3->rank)
4387       || (stmt && is_phi_for_stmt (stmt, oe3->op)
4388           && !is_phi_for_stmt (stmt, oe1->op)
4389           && !is_phi_for_stmt (stmt, oe2->op)))
4390     std::swap (*oe1, *oe3);
4391   else if ((oe1->rank == oe3->rank
4392             && oe2->rank != oe3->rank)
4393            || (stmt && is_phi_for_stmt (stmt, oe2->op)
4394                && !is_phi_for_stmt (stmt, oe1->op)
4395                && !is_phi_for_stmt (stmt, oe3->op)))
4396     std::swap (*oe1, *oe2);
4397 }
4398
4399 /* If definition of RHS1 or RHS2 dominates STMT, return the later of those
4400    two definitions, otherwise return STMT.  */
4401
4402 static inline gimple *
4403 find_insert_point (gimple *stmt, tree rhs1, tree rhs2)
4404 {
4405   if (TREE_CODE (rhs1) == SSA_NAME
4406       && reassoc_stmt_dominates_stmt_p (stmt, SSA_NAME_DEF_STMT (rhs1)))
4407     stmt = SSA_NAME_DEF_STMT (rhs1);
4408   if (TREE_CODE (rhs2) == SSA_NAME
4409       && reassoc_stmt_dominates_stmt_p (stmt, SSA_NAME_DEF_STMT (rhs2)))
4410     stmt = SSA_NAME_DEF_STMT (rhs2);
4411   return stmt;
4412 }
4413
4414 /* If the stmt that defines operand has to be inserted, insert it
4415    before the use.  */
4416 static void
4417 insert_stmt_before_use (gimple *stmt, gimple *stmt_to_insert)
4418 {
4419   gcc_assert (is_gimple_assign (stmt_to_insert));
4420   tree rhs1 = gimple_assign_rhs1 (stmt_to_insert);
4421   tree rhs2 = gimple_assign_rhs2 (stmt_to_insert);
4422   gimple *insert_point = find_insert_point (stmt, rhs1, rhs2);
4423   gimple_stmt_iterator gsi = gsi_for_stmt (insert_point);
4424   gimple_set_uid (stmt_to_insert, gimple_uid (insert_point));
4425
4426   /* If the insert point is not stmt, then insert_point would be
4427      the point where operand rhs1 or rhs2 is defined. In this case,
4428      stmt_to_insert has to be inserted afterwards. This would
4429      only happen when the stmt insertion point is flexible. */
4430   if (stmt == insert_point)
4431     gsi_insert_before (&gsi, stmt_to_insert, GSI_NEW_STMT);
4432   else
4433     insert_stmt_after (stmt_to_insert, insert_point);
4434 }
4435
4436
4437 /* Recursively rewrite our linearized statements so that the operators
4438    match those in OPS[OPINDEX], putting the computation in rank
4439    order.  Return new lhs.
4440    CHANGED is true if we shouldn't reuse the lhs SSA_NAME both in
4441    the current stmt and during recursive invocations.
4442    NEXT_CHANGED is true if we shouldn't reuse the lhs SSA_NAME in
4443    recursive invocations.  */
4444
4445 static tree
4446 rewrite_expr_tree (gimple *stmt, unsigned int opindex,
4447                    vec<operand_entry *> ops, bool changed, bool next_changed)
4448 {
4449   tree rhs1 = gimple_assign_rhs1 (stmt);
4450   tree rhs2 = gimple_assign_rhs2 (stmt);
4451   tree lhs = gimple_assign_lhs (stmt);
4452   operand_entry *oe;
4453
4454   /* The final recursion case for this function is that you have
4455      exactly two operations left.
4456      If we had exactly one op in the entire list to start with, we
4457      would have never called this function, and the tail recursion
4458      rewrites them one at a time.  */
4459   if (opindex + 2 == ops.length ())
4460     {
4461       operand_entry *oe1, *oe2;
4462
4463       oe1 = ops[opindex];
4464       oe2 = ops[opindex + 1];
4465
4466       if (rhs1 != oe1->op || rhs2 != oe2->op)
4467         {
4468           gimple_stmt_iterator gsi = gsi_for_stmt (stmt);
4469           unsigned int uid = gimple_uid (stmt);
4470
4471           if (dump_file && (dump_flags & TDF_DETAILS))
4472             {
4473               fprintf (dump_file, "Transforming ");
4474               print_gimple_stmt (dump_file, stmt, 0);
4475             }
4476
4477           /* If the stmt that defines operand has to be inserted, insert it
4478              before the use.  */
4479           if (oe1->stmt_to_insert)
4480             insert_stmt_before_use (stmt, oe1->stmt_to_insert);
4481           if (oe2->stmt_to_insert)
4482             insert_stmt_before_use (stmt, oe2->stmt_to_insert);
4483           /* Even when changed is false, reassociation could have e.g. removed
4484              some redundant operations, so unless we are just swapping the
4485              arguments or unless there is no change at all (then we just
4486              return lhs), force creation of a new SSA_NAME.  */
4487           if (changed || ((rhs1 != oe2->op || rhs2 != oe1->op) && opindex))
4488             {
4489               gimple *insert_point
4490                 = find_insert_point (stmt, oe1->op, oe2->op);
4491               lhs = make_ssa_name (TREE_TYPE (lhs));
4492               stmt
4493                 = gimple_build_assign (lhs, gimple_assign_rhs_code (stmt),
4494                                        oe1->op, oe2->op);
4495               gimple_set_uid (stmt, uid);
4496               gimple_set_visited (stmt, true);
4497               if (insert_point == gsi_stmt (gsi))
4498                 gsi_insert_before (&gsi, stmt, GSI_SAME_STMT);
4499               else
4500                 insert_stmt_after (stmt, insert_point);
4501             }
4502           else
4503             {
4504               gcc_checking_assert (find_insert_point (stmt, oe1->op, oe2->op)
4505                                    == stmt);
4506               gimple_assign_set_rhs1 (stmt, oe1->op);
4507               gimple_assign_set_rhs2 (stmt, oe2->op);
4508               update_stmt (stmt);
4509             }
4510
4511           if (rhs1 != oe1->op && rhs1 != oe2->op)
4512             remove_visited_stmt_chain (rhs1);
4513
4514           if (dump_file && (dump_flags & TDF_DETAILS))
4515             {
4516               fprintf (dump_file, " into ");
4517               print_gimple_stmt (dump_file, stmt, 0);
4518             }
4519         }
4520       return lhs;
4521     }
4522
4523   /* If we hit here, we should have 3 or more ops left.  */
4524   gcc_assert (opindex + 2 < ops.length ());
4525
4526   /* Rewrite the next operator.  */
4527   oe = ops[opindex];
4528
4529   /* If the stmt that defines operand has to be inserted, insert it
4530      before the use.  */
4531   if (oe->stmt_to_insert)
4532     insert_stmt_before_use (stmt, oe->stmt_to_insert);
4533
4534   /* Recurse on the LHS of the binary operator, which is guaranteed to
4535      be the non-leaf side.  */
4536   tree new_rhs1
4537     = rewrite_expr_tree (SSA_NAME_DEF_STMT (rhs1), opindex + 1, ops,
4538                          changed || oe->op != rhs2 || next_changed,
4539                          false);
4540
4541   if (oe->op != rhs2 || new_rhs1 != rhs1)
4542     {
4543       if (dump_file && (dump_flags & TDF_DETAILS))
4544         {
4545           fprintf (dump_file, "Transforming ");
4546           print_gimple_stmt (dump_file, stmt, 0);
4547         }
4548
4549       /* If changed is false, this is either opindex == 0
4550          or all outer rhs2's were equal to corresponding oe->op,
4551          and powi_result is NULL.
4552          That means lhs is equivalent before and after reassociation.
4553          Otherwise ensure the old lhs SSA_NAME is not reused and
4554          create a new stmt as well, so that any debug stmts will be
4555          properly adjusted.  */
4556       if (changed)
4557         {
4558           gimple_stmt_iterator gsi = gsi_for_stmt (stmt);
4559           unsigned int uid = gimple_uid (stmt);
4560           gimple *insert_point = find_insert_point (stmt, new_rhs1, oe->op);
4561
4562           lhs = make_ssa_name (TREE_TYPE (lhs));
4563           stmt = gimple_build_assign (lhs, gimple_assign_rhs_code (stmt),
4564                                       new_rhs1, oe->op);
4565           gimple_set_uid (stmt, uid);
4566           gimple_set_visited (stmt, true);
4567           if (insert_point == gsi_stmt (gsi))
4568             gsi_insert_before (&gsi, stmt, GSI_SAME_STMT);
4569           else
4570             insert_stmt_after (stmt, insert_point);
4571         }
4572       else
4573         {
4574           gcc_checking_assert (find_insert_point (stmt, new_rhs1, oe->op)
4575                                == stmt);
4576           gimple_assign_set_rhs1 (stmt, new_rhs1);
4577           gimple_assign_set_rhs2 (stmt, oe->op);
4578           update_stmt (stmt);
4579         }
4580
4581       if (dump_file && (dump_flags & TDF_DETAILS))
4582         {
4583           fprintf (dump_file, " into ");
4584           print_gimple_stmt (dump_file, stmt, 0);
4585         }
4586     }
4587   return lhs;
4588 }
4589
4590 /* Find out how many cycles we need to compute statements chain.
4591    OPS_NUM holds number os statements in a chain.  CPU_WIDTH is a
4592    maximum number of independent statements we may execute per cycle.  */
4593
4594 static int
4595 get_required_cycles (int ops_num, int cpu_width)
4596 {
4597   int res;
4598   int elog;
4599   unsigned int rest;
4600
4601   /* While we have more than 2 * cpu_width operands
4602      we may reduce number of operands by cpu_width
4603      per cycle.  */
4604   res = ops_num / (2 * cpu_width);
4605
4606   /* Remained operands count may be reduced twice per cycle
4607      until we have only one operand.  */
4608   rest = (unsigned)(ops_num - res * cpu_width);
4609   elog = exact_log2 (rest);
4610   if (elog >= 0)
4611     res += elog;
4612   else
4613     res += floor_log2 (rest) + 1;
4614
4615   return res;
4616 }
4617
4618 /* Returns an optimal number of registers to use for computation of
4619    given statements.  */
4620
4621 static int
4622 get_reassociation_width (int ops_num, enum tree_code opc,
4623                          machine_mode mode)
4624 {
4625   int param_width = PARAM_VALUE (PARAM_TREE_REASSOC_WIDTH);
4626   int width;
4627   int width_min;
4628   int cycles_best;
4629
4630   if (param_width > 0)
4631     width = param_width;
4632   else
4633     width = targetm.sched.reassociation_width (opc, mode);
4634
4635   if (width == 1)
4636     return width;
4637
4638   /* Get the minimal time required for sequence computation.  */
4639   cycles_best = get_required_cycles (ops_num, width);
4640
4641   /* Check if we may use less width and still compute sequence for
4642      the same time.  It will allow us to reduce registers usage.
4643      get_required_cycles is monotonically increasing with lower width
4644      so we can perform a binary search for the minimal width that still
4645      results in the optimal cycle count.  */
4646   width_min = 1;
4647   while (width > width_min)
4648     {
4649       int width_mid = (width + width_min) / 2;
4650
4651       if (get_required_cycles (ops_num, width_mid) == cycles_best)
4652         width = width_mid;
4653       else if (width_min < width_mid)
4654         width_min = width_mid;
4655       else
4656         break;
4657     }
4658
4659   return width;
4660 }
4661
4662 /* Recursively rewrite our linearized statements so that the operators
4663    match those in OPS[OPINDEX], putting the computation in rank
4664    order and trying to allow operations to be executed in
4665    parallel.  */
4666
4667 static void
4668 rewrite_expr_tree_parallel (gassign *stmt, int width,
4669                             vec<operand_entry *> ops)
4670 {
4671   enum tree_code opcode = gimple_assign_rhs_code (stmt);
4672   int op_num = ops.length ();
4673   gcc_assert (op_num > 0);
4674   int stmt_num = op_num - 1;
4675   gimple **stmts = XALLOCAVEC (gimple *, stmt_num);
4676   int op_index = op_num - 1;
4677   int stmt_index = 0;
4678   int ready_stmts_end = 0;
4679   int i = 0;
4680   gimple *stmt1 = NULL, *stmt2 = NULL;
4681   tree last_rhs1 = gimple_assign_rhs1 (stmt);
4682
4683   /* We start expression rewriting from the top statements.
4684      So, in this loop we create a full list of statements
4685      we will work with.  */
4686   stmts[stmt_num - 1] = stmt;
4687   for (i = stmt_num - 2; i >= 0; i--)
4688     stmts[i] = SSA_NAME_DEF_STMT (gimple_assign_rhs1 (stmts[i+1]));
4689
4690   for (i = 0; i < stmt_num; i++)
4691     {
4692       tree op1, op2;
4693
4694       /* Determine whether we should use results of
4695          already handled statements or not.  */
4696       if (ready_stmts_end == 0
4697           && (i - stmt_index >= width || op_index < 1))
4698         ready_stmts_end = i;
4699
4700       /* Now we choose operands for the next statement.  Non zero
4701          value in ready_stmts_end means here that we should use
4702          the result of already generated statements as new operand.  */
4703       if (ready_stmts_end > 0)
4704         {
4705           op1 = gimple_assign_lhs (stmts[stmt_index++]);
4706           if (ready_stmts_end > stmt_index)
4707             op2 = gimple_assign_lhs (stmts[stmt_index++]);
4708           else if (op_index >= 0)
4709             {
4710               operand_entry *oe = ops[op_index--];
4711               stmt2 = oe->stmt_to_insert;
4712               op2 = oe->op;
4713             }
4714           else
4715             {
4716               gcc_assert (stmt_index < i);
4717               op2 = gimple_assign_lhs (stmts[stmt_index++]);
4718             }
4719
4720           if (stmt_index >= ready_stmts_end)
4721             ready_stmts_end = 0;
4722         }
4723       else
4724         {
4725           if (op_index > 1)
4726             swap_ops_for_binary_stmt (ops, op_index - 2, NULL);
4727           operand_entry *oe2 = ops[op_index--];
4728           operand_entry *oe1 = ops[op_index--];
4729           op2 = oe2->op;
4730           stmt2 = oe2->stmt_to_insert;
4731           op1 = oe1->op;
4732           stmt1 = oe1->stmt_to_insert;
4733         }
4734
4735       /* If we emit the last statement then we should put
4736          operands into the last statement.  It will also
4737          break the loop.  */
4738       if (op_index < 0 && stmt_index == i)
4739         i = stmt_num - 1;
4740
4741       if (dump_file && (dump_flags & TDF_DETAILS))
4742         {
4743           fprintf (dump_file, "Transforming ");
4744           print_gimple_stmt (dump_file, stmts[i], 0);
4745         }
4746
4747       /* If the stmt that defines operand has to be inserted, insert it
4748          before the use.  */
4749       if (stmt1)
4750         insert_stmt_before_use (stmts[i], stmt1);
4751       if (stmt2)
4752         insert_stmt_before_use (stmts[i], stmt2);
4753       stmt1 = stmt2 = NULL;
4754
4755       /* We keep original statement only for the last one.  All
4756          others are recreated.  */
4757       if (i == stmt_num - 1)
4758         {
4759           gimple_assign_set_rhs1 (stmts[i], op1);
4760           gimple_assign_set_rhs2 (stmts[i], op2);
4761           update_stmt (stmts[i]);
4762         }
4763       else
4764         {
4765           stmts[i] = build_and_add_sum (TREE_TYPE (last_rhs1), op1, op2, opcode);
4766         }
4767       if (dump_file && (dump_flags & TDF_DETAILS))
4768         {
4769           fprintf (dump_file, " into ");
4770           print_gimple_stmt (dump_file, stmts[i], 0);
4771         }
4772     }
4773
4774   remove_visited_stmt_chain (last_rhs1);
4775 }
4776
4777 /* Transform STMT, which is really (A +B) + (C + D) into the left
4778    linear form, ((A+B)+C)+D.
4779    Recurse on D if necessary.  */
4780
4781 static void
4782 linearize_expr (gimple *stmt)
4783 {
4784   gimple_stmt_iterator gsi;
4785   gimple *binlhs = SSA_NAME_DEF_STMT (gimple_assign_rhs1 (stmt));
4786   gimple *binrhs = SSA_NAME_DEF_STMT (gimple_assign_rhs2 (stmt));
4787   gimple *oldbinrhs = binrhs;
4788   enum tree_code rhscode = gimple_assign_rhs_code (stmt);
4789   gimple *newbinrhs = NULL;
4790   struct loop *loop = loop_containing_stmt (stmt);
4791   tree lhs = gimple_assign_lhs (stmt);
4792
4793   gcc_assert (is_reassociable_op (binlhs, rhscode, loop)
4794               && is_reassociable_op (binrhs, rhscode, loop));
4795
4796   gsi = gsi_for_stmt (stmt);
4797
4798   gimple_assign_set_rhs2 (stmt, gimple_assign_rhs1 (binrhs));
4799   binrhs = gimple_build_assign (make_ssa_name (TREE_TYPE (lhs)),
4800                                 gimple_assign_rhs_code (binrhs),
4801                                 gimple_assign_lhs (binlhs),
4802                                 gimple_assign_rhs2 (binrhs));
4803   gimple_assign_set_rhs1 (stmt, gimple_assign_lhs (binrhs));
4804   gsi_insert_before (&gsi, binrhs, GSI_SAME_STMT);
4805   gimple_set_uid (binrhs, gimple_uid (stmt));
4806
4807   if (TREE_CODE (gimple_assign_rhs2 (stmt)) == SSA_NAME)
4808     newbinrhs = SSA_NAME_DEF_STMT (gimple_assign_rhs2 (stmt));
4809
4810   if (dump_file && (dump_flags & TDF_DETAILS))
4811     {
4812       fprintf (dump_file, "Linearized: ");
4813       print_gimple_stmt (dump_file, stmt, 0);
4814     }
4815
4816   reassociate_stats.linearized++;
4817   update_stmt (stmt);
4818
4819   gsi = gsi_for_stmt (oldbinrhs);
4820   reassoc_remove_stmt (&gsi);
4821   release_defs (oldbinrhs);
4822
4823   gimple_set_visited (stmt, true);
4824   gimple_set_visited (binlhs, true);
4825   gimple_set_visited (binrhs, true);
4826
4827   /* Tail recurse on the new rhs if it still needs reassociation.  */
4828   if (newbinrhs && is_reassociable_op (newbinrhs, rhscode, loop))
4829     /* ??? This should probably be linearize_expr (newbinrhs) but I don't
4830            want to change the algorithm while converting to tuples.  */
4831     linearize_expr (stmt);
4832 }
4833
4834 /* If LHS has a single immediate use that is a GIMPLE_ASSIGN statement, return
4835    it.  Otherwise, return NULL.  */
4836
4837 static gimple *
4838 get_single_immediate_use (tree lhs)
4839 {
4840   use_operand_p immuse;
4841   gimple *immusestmt;
4842
4843   if (TREE_CODE (lhs) == SSA_NAME
4844       && single_imm_use (lhs, &immuse, &immusestmt)
4845       && is_gimple_assign (immusestmt))
4846     return immusestmt;
4847
4848   return NULL;
4849 }
4850
4851 /* Recursively negate the value of TONEGATE, and return the SSA_NAME
4852    representing the negated value.  Insertions of any necessary
4853    instructions go before GSI.
4854    This function is recursive in that, if you hand it "a_5" as the
4855    value to negate, and a_5 is defined by "a_5 = b_3 + b_4", it will
4856    transform b_3 + b_4 into a_5 = -b_3 + -b_4.  */
4857
4858 static tree
4859 negate_value (tree tonegate, gimple_stmt_iterator *gsip)
4860 {
4861   gimple *negatedefstmt = NULL;
4862   tree resultofnegate;
4863   gimple_stmt_iterator gsi;
4864   unsigned int uid;
4865
4866   /* If we are trying to negate a name, defined by an add, negate the
4867      add operands instead.  */
4868   if (TREE_CODE (tonegate) == SSA_NAME)
4869     negatedefstmt = SSA_NAME_DEF_STMT (tonegate);
4870   if (TREE_CODE (tonegate) == SSA_NAME
4871       && is_gimple_assign (negatedefstmt)
4872       && TREE_CODE (gimple_assign_lhs (negatedefstmt)) == SSA_NAME
4873       && has_single_use (gimple_assign_lhs (negatedefstmt))
4874       && gimple_assign_rhs_code (negatedefstmt) == PLUS_EXPR)
4875     {
4876       tree rhs1 = gimple_assign_rhs1 (negatedefstmt);
4877       tree rhs2 = gimple_assign_rhs2 (negatedefstmt);
4878       tree lhs = gimple_assign_lhs (negatedefstmt);
4879       gimple *g;
4880
4881       gsi = gsi_for_stmt (negatedefstmt);
4882       rhs1 = negate_value (rhs1, &gsi);
4883
4884       gsi = gsi_for_stmt (negatedefstmt);
4885       rhs2 = negate_value (rhs2, &gsi);
4886
4887       gsi = gsi_for_stmt (negatedefstmt);
4888       lhs = make_ssa_name (TREE_TYPE (lhs));
4889       gimple_set_visited (negatedefstmt, true);
4890       g = gimple_build_assign (lhs, PLUS_EXPR, rhs1, rhs2);
4891       gimple_set_uid (g, gimple_uid (negatedefstmt));
4892       gsi_insert_before (&gsi, g, GSI_SAME_STMT);
4893       return lhs;
4894     }
4895
4896   tonegate = fold_build1 (NEGATE_EXPR, TREE_TYPE (tonegate), tonegate);
4897   resultofnegate = force_gimple_operand_gsi (gsip, tonegate, true,
4898                                              NULL_TREE, true, GSI_SAME_STMT);
4899   gsi = *gsip;
4900   uid = gimple_uid (gsi_stmt (gsi));
4901   for (gsi_prev (&gsi); !gsi_end_p (gsi); gsi_prev (&gsi))
4902     {
4903       gimple *stmt = gsi_stmt (gsi);
4904       if (gimple_uid (stmt) != 0)
4905         break;
4906       gimple_set_uid (stmt, uid);
4907     }
4908   return resultofnegate;
4909 }
4910
4911 /* Return true if we should break up the subtract in STMT into an add
4912    with negate.  This is true when we the subtract operands are really
4913    adds, or the subtract itself is used in an add expression.  In
4914    either case, breaking up the subtract into an add with negate
4915    exposes the adds to reassociation.  */
4916
4917 static bool
4918 should_break_up_subtract (gimple *stmt)
4919 {
4920   tree lhs = gimple_assign_lhs (stmt);
4921   tree binlhs = gimple_assign_rhs1 (stmt);
4922   tree binrhs = gimple_assign_rhs2 (stmt);
4923   gimple *immusestmt;
4924   struct loop *loop = loop_containing_stmt (stmt);
4925
4926   if (TREE_CODE (binlhs) == SSA_NAME
4927       && is_reassociable_op (SSA_NAME_DEF_STMT (binlhs), PLUS_EXPR, loop))
4928     return true;
4929
4930   if (TREE_CODE (binrhs) == SSA_NAME
4931       && is_reassociable_op (SSA_NAME_DEF_STMT (binrhs), PLUS_EXPR, loop))
4932     return true;
4933
4934   if (TREE_CODE (lhs) == SSA_NAME
4935       && (immusestmt = get_single_immediate_use (lhs))
4936       && is_gimple_assign (immusestmt)
4937       && (gimple_assign_rhs_code (immusestmt) == PLUS_EXPR
4938           || (gimple_assign_rhs_code (immusestmt) == MINUS_EXPR
4939               && gimple_assign_rhs1 (immusestmt) == lhs)
4940           || gimple_assign_rhs_code (immusestmt) == MULT_EXPR))
4941     return true;
4942   return false;
4943 }
4944
4945 /* Transform STMT from A - B into A + -B.  */
4946
4947 static void
4948 break_up_subtract (gimple *stmt, gimple_stmt_iterator *gsip)
4949 {
4950   tree rhs1 = gimple_assign_rhs1 (stmt);
4951   tree rhs2 = gimple_assign_rhs2 (stmt);
4952
4953   if (dump_file && (dump_flags & TDF_DETAILS))
4954     {
4955       fprintf (dump_file, "Breaking up subtract ");
4956       print_gimple_stmt (dump_file, stmt, 0);
4957     }
4958
4959   rhs2 = negate_value (rhs2, gsip);
4960   gimple_assign_set_rhs_with_ops (gsip, PLUS_EXPR, rhs1, rhs2);
4961   update_stmt (stmt);
4962 }
4963
4964 /* Determine whether STMT is a builtin call that raises an SSA name
4965    to an integer power and has only one use.  If so, and this is early
4966    reassociation and unsafe math optimizations are permitted, place
4967    the SSA name in *BASE and the exponent in *EXPONENT, and return TRUE.
4968    If any of these conditions does not hold, return FALSE.  */
4969
4970 static bool
4971 acceptable_pow_call (gcall *stmt, tree *base, HOST_WIDE_INT *exponent)
4972 {
4973   tree arg1;
4974   REAL_VALUE_TYPE c, cint;
4975
4976   switch (gimple_call_combined_fn (stmt))
4977     {
4978     CASE_CFN_POW:
4979       if (flag_errno_math)
4980         return false;
4981
4982       *base = gimple_call_arg (stmt, 0);
4983       arg1 = gimple_call_arg (stmt, 1);
4984
4985       if (TREE_CODE (arg1) != REAL_CST)
4986         return false;
4987
4988       c = TREE_REAL_CST (arg1);
4989
4990       if (REAL_EXP (&c) > HOST_BITS_PER_WIDE_INT)
4991         return false;
4992
4993       *exponent = real_to_integer (&c);
4994       real_from_integer (&cint, VOIDmode, *exponent, SIGNED);
4995       if (!real_identical (&c, &cint))
4996         return false;
4997
4998       break;
4999
5000     CASE_CFN_POWI:
5001       *base = gimple_call_arg (stmt, 0);
5002       arg1 = gimple_call_arg (stmt, 1);
5003
5004       if (!tree_fits_shwi_p (arg1))
5005         return false;
5006
5007       *exponent = tree_to_shwi (arg1);
5008       break;
5009
5010     default:
5011       return false;
5012     }
5013
5014   /* Expanding negative exponents is generally unproductive, so we don't
5015      complicate matters with those.  Exponents of zero and one should
5016      have been handled by expression folding.  */
5017   if (*exponent < 2 || TREE_CODE (*base) != SSA_NAME)
5018     return false;
5019
5020   return true;
5021 }
5022
5023 /* Try to derive and add operand entry for OP to *OPS.  Return false if
5024    unsuccessful.  */
5025
5026 static bool
5027 try_special_add_to_ops (vec<operand_entry *> *ops,
5028                         enum tree_code code,
5029                         tree op, gimple* def_stmt)
5030 {
5031   tree base = NULL_TREE;
5032   HOST_WIDE_INT exponent = 0;
5033
5034   if (TREE_CODE (op) != SSA_NAME
5035       || ! has_single_use (op))
5036     return false;
5037
5038   if (code == MULT_EXPR
5039       && reassoc_insert_powi_p
5040       && flag_unsafe_math_optimizations
5041       && is_gimple_call (def_stmt)
5042       && acceptable_pow_call (as_a <gcall *> (def_stmt), &base, &exponent))
5043     {
5044       add_repeat_to_ops_vec (ops, base, exponent);
5045       gimple_set_visited (def_stmt, true);
5046       return true;
5047     }
5048   else if (code == MULT_EXPR
5049            && is_gimple_assign (def_stmt)
5050            && gimple_assign_rhs_code (def_stmt) == NEGATE_EXPR
5051            && !HONOR_SNANS (TREE_TYPE (op))
5052            && (!HONOR_SIGNED_ZEROS (TREE_TYPE (op))
5053                || !COMPLEX_FLOAT_TYPE_P (TREE_TYPE (op))))
5054     {
5055       tree rhs1 = gimple_assign_rhs1 (def_stmt);
5056       tree cst = build_minus_one_cst (TREE_TYPE (op));
5057       add_to_ops_vec (ops, rhs1);
5058       add_to_ops_vec (ops, cst);
5059       gimple_set_visited (def_stmt, true);
5060       return true;
5061     }
5062
5063   return false;
5064 }
5065
5066 /* Recursively linearize a binary expression that is the RHS of STMT.
5067    Place the operands of the expression tree in the vector named OPS.  */
5068
5069 static void
5070 linearize_expr_tree (vec<operand_entry *> *ops, gimple *stmt,
5071                      bool is_associative, bool set_visited)
5072 {
5073   tree binlhs = gimple_assign_rhs1 (stmt);
5074   tree binrhs = gimple_assign_rhs2 (stmt);
5075   gimple *binlhsdef = NULL, *binrhsdef = NULL;
5076   bool binlhsisreassoc = false;
5077   bool binrhsisreassoc = false;
5078   enum tree_code rhscode = gimple_assign_rhs_code (stmt);
5079   struct loop *loop = loop_containing_stmt (stmt);
5080
5081   if (set_visited)
5082     gimple_set_visited (stmt, true);
5083
5084   if (TREE_CODE (binlhs) == SSA_NAME)
5085     {
5086       binlhsdef = SSA_NAME_DEF_STMT (binlhs);
5087       binlhsisreassoc = (is_reassociable_op (binlhsdef, rhscode, loop)
5088                          && !stmt_could_throw_p (binlhsdef));
5089     }
5090
5091   if (TREE_CODE (binrhs) == SSA_NAME)
5092     {
5093       binrhsdef = SSA_NAME_DEF_STMT (binrhs);
5094       binrhsisreassoc = (is_reassociable_op (binrhsdef, rhscode, loop)
5095                          && !stmt_could_throw_p (binrhsdef));
5096     }
5097
5098   /* If the LHS is not reassociable, but the RHS is, we need to swap
5099      them.  If neither is reassociable, there is nothing we can do, so
5100      just put them in the ops vector.  If the LHS is reassociable,
5101      linearize it.  If both are reassociable, then linearize the RHS
5102      and the LHS.  */
5103
5104   if (!binlhsisreassoc)
5105     {
5106       /* If this is not a associative operation like division, give up.  */
5107       if (!is_associative)
5108         {
5109           add_to_ops_vec (ops, binrhs);
5110           return;
5111         }
5112
5113       if (!binrhsisreassoc)
5114         {
5115           if (!try_special_add_to_ops (ops, rhscode, binrhs, binrhsdef))
5116             add_to_ops_vec (ops, binrhs);
5117
5118           if (!try_special_add_to_ops (ops, rhscode, binlhs, binlhsdef))
5119             add_to_ops_vec (ops, binlhs);
5120
5121           return;
5122         }
5123
5124       if (dump_file && (dump_flags & TDF_DETAILS))
5125         {
5126           fprintf (dump_file, "swapping operands of ");
5127           print_gimple_stmt (dump_file, stmt, 0);
5128         }
5129
5130       swap_ssa_operands (stmt,
5131                          gimple_assign_rhs1_ptr (stmt),
5132                          gimple_assign_rhs2_ptr (stmt));
5133       update_stmt (stmt);
5134
5135       if (dump_file && (dump_flags & TDF_DETAILS))
5136         {
5137           fprintf (dump_file, " is now ");
5138           print_gimple_stmt (dump_file, stmt, 0);
5139         }
5140
5141       /* We want to make it so the lhs is always the reassociative op,
5142          so swap.  */
5143       std::swap (binlhs, binrhs);
5144     }
5145   else if (binrhsisreassoc)
5146     {
5147       linearize_expr (stmt);
5148       binlhs = gimple_assign_rhs1 (stmt);
5149       binrhs = gimple_assign_rhs2 (stmt);
5150     }
5151
5152   gcc_assert (TREE_CODE (binrhs) != SSA_NAME
5153               || !is_reassociable_op (SSA_NAME_DEF_STMT (binrhs),
5154                                       rhscode, loop));
5155   linearize_expr_tree (ops, SSA_NAME_DEF_STMT (binlhs),
5156                        is_associative, set_visited);
5157
5158   if (!try_special_add_to_ops (ops, rhscode, binrhs, binrhsdef))
5159     add_to_ops_vec (ops, binrhs);
5160 }
5161
5162 /* Repropagate the negates back into subtracts, since no other pass
5163    currently does it.  */
5164
5165 static void
5166 repropagate_negates (void)
5167 {
5168   unsigned int i = 0;
5169   tree negate;
5170
5171   FOR_EACH_VEC_ELT (plus_negates, i, negate)
5172     {
5173       gimple *user = get_single_immediate_use (negate);
5174
5175       if (!user || !is_gimple_assign (user))
5176         continue;
5177
5178       /* The negate operand can be either operand of a PLUS_EXPR
5179          (it can be the LHS if the RHS is a constant for example).
5180
5181          Force the negate operand to the RHS of the PLUS_EXPR, then
5182          transform the PLUS_EXPR into a MINUS_EXPR.  */
5183       if (gimple_assign_rhs_code (user) == PLUS_EXPR)
5184         {
5185           /* If the negated operand appears on the LHS of the
5186              PLUS_EXPR, exchange the operands of the PLUS_EXPR
5187              to force the negated operand to the RHS of the PLUS_EXPR.  */
5188           if (gimple_assign_rhs1 (user) == negate)
5189             {
5190               swap_ssa_operands (user,
5191                                  gimple_assign_rhs1_ptr (user),
5192                                  gimple_assign_rhs2_ptr (user));
5193             }
5194
5195           /* Now transform the PLUS_EXPR into a MINUS_EXPR and replace
5196              the RHS of the PLUS_EXPR with the operand of the NEGATE_EXPR.  */
5197           if (gimple_assign_rhs2 (user) == negate)
5198             {
5199               tree rhs1 = gimple_assign_rhs1 (user);
5200               tree rhs2 = gimple_assign_rhs1 (SSA_NAME_DEF_STMT (negate));
5201               gimple_stmt_iterator gsi = gsi_for_stmt (user);
5202               gimple_assign_set_rhs_with_ops (&gsi, MINUS_EXPR, rhs1, rhs2);
5203               update_stmt (user);
5204             }
5205         }
5206       else if (gimple_assign_rhs_code (user) == MINUS_EXPR)
5207         {
5208           if (gimple_assign_rhs1 (user) == negate)
5209             {
5210               /* We have
5211                    x = -a
5212                    y = x - b
5213                  which we transform into
5214                    x = a + b
5215                    y = -x .
5216                  This pushes down the negate which we possibly can merge
5217                  into some other operation, hence insert it into the
5218                  plus_negates vector.  */
5219               gimple *feed = SSA_NAME_DEF_STMT (negate);
5220               tree a = gimple_assign_rhs1 (feed);
5221               tree b = gimple_assign_rhs2 (user);
5222               gimple_stmt_iterator gsi = gsi_for_stmt (feed);
5223               gimple_stmt_iterator gsi2 = gsi_for_stmt (user);
5224               tree x = make_ssa_name (TREE_TYPE (gimple_assign_lhs (feed)));
5225               gimple *g = gimple_build_assign (x, PLUS_EXPR, a, b);
5226               gsi_insert_before (&gsi2, g, GSI_SAME_STMT);
5227               gimple_assign_set_rhs_with_ops (&gsi2, NEGATE_EXPR, x);
5228               user = gsi_stmt (gsi2);
5229               update_stmt (user);
5230               reassoc_remove_stmt (&gsi);
5231               release_defs (feed);
5232               plus_negates.safe_push (gimple_assign_lhs (user));
5233             }
5234           else
5235             {
5236               /* Transform "x = -a; y = b - x" into "y = b + a", getting
5237                  rid of one operation.  */
5238               gimple *feed = SSA_NAME_DEF_STMT (negate);
5239               tree a = gimple_assign_rhs1 (feed);
5240               tree rhs1 = gimple_assign_rhs1 (user);
5241               gimple_stmt_iterator gsi = gsi_for_stmt (user);
5242               gimple_assign_set_rhs_with_ops (&gsi, PLUS_EXPR, rhs1, a);
5243               update_stmt (gsi_stmt (gsi));
5244             }
5245         }
5246     }
5247 }
5248
5249 /* Returns true if OP is of a type for which we can do reassociation.
5250    That is for integral or non-saturating fixed-point types, and for
5251    floating point type when associative-math is enabled.  */
5252
5253 static bool
5254 can_reassociate_p (tree op)
5255 {
5256   tree type = TREE_TYPE (op);
5257   if (TREE_CODE (op) == SSA_NAME && SSA_NAME_OCCURS_IN_ABNORMAL_PHI (op))
5258     return false;
5259   if ((ANY_INTEGRAL_TYPE_P (type) && TYPE_OVERFLOW_WRAPS (type))
5260       || NON_SAT_FIXED_POINT_TYPE_P (type)
5261       || (flag_associative_math && FLOAT_TYPE_P (type)))
5262     return true;
5263   return false;
5264 }
5265
5266 /* Break up subtract operations in block BB.
5267
5268    We do this top down because we don't know whether the subtract is
5269    part of a possible chain of reassociation except at the top.
5270
5271    IE given
5272    d = f + g
5273    c = a + e
5274    b = c - d
5275    q = b - r
5276    k = t - q
5277
5278    we want to break up k = t - q, but we won't until we've transformed q
5279    = b - r, which won't be broken up until we transform b = c - d.
5280
5281    En passant, clear the GIMPLE visited flag on every statement
5282    and set UIDs within each basic block.  */
5283
5284 static void
5285 break_up_subtract_bb (basic_block bb)
5286 {
5287   gimple_stmt_iterator gsi;
5288   basic_block son;
5289   unsigned int uid = 1;
5290
5291   for (gsi = gsi_start_bb (bb); !gsi_end_p (gsi); gsi_next (&gsi))
5292     {
5293       gimple *stmt = gsi_stmt (gsi);
5294       gimple_set_visited (stmt, false);
5295       gimple_set_uid (stmt, uid++);
5296
5297       if (!is_gimple_assign (stmt)
5298           || !can_reassociate_p (gimple_assign_lhs (stmt)))
5299         continue;
5300
5301       /* Look for simple gimple subtract operations.  */
5302       if (gimple_assign_rhs_code (stmt) == MINUS_EXPR)
5303         {
5304           if (!can_reassociate_p (gimple_assign_rhs1 (stmt))
5305               || !can_reassociate_p (gimple_assign_rhs2 (stmt)))
5306             continue;
5307
5308           /* Check for a subtract used only in an addition.  If this
5309              is the case, transform it into add of a negate for better
5310              reassociation.  IE transform C = A-B into C = A + -B if C
5311              is only used in an addition.  */
5312           if (should_break_up_subtract (stmt))
5313             break_up_subtract (stmt, &gsi);
5314         }
5315       else if (gimple_assign_rhs_code (stmt) == NEGATE_EXPR
5316                && can_reassociate_p (gimple_assign_rhs1 (stmt)))
5317         plus_negates.safe_push (gimple_assign_lhs (stmt));
5318     }
5319   for (son = first_dom_son (CDI_DOMINATORS, bb);
5320        son;
5321        son = next_dom_son (CDI_DOMINATORS, son))
5322     break_up_subtract_bb (son);
5323 }
5324
5325 /* Used for repeated factor analysis.  */
5326 struct repeat_factor
5327 {
5328   /* An SSA name that occurs in a multiply chain.  */
5329   tree factor;
5330
5331   /* Cached rank of the factor.  */
5332   unsigned rank;
5333
5334   /* Number of occurrences of the factor in the chain.  */
5335   HOST_WIDE_INT count;
5336
5337   /* An SSA name representing the product of this factor and
5338      all factors appearing later in the repeated factor vector.  */
5339   tree repr;
5340 };
5341
5342
5343 static vec<repeat_factor> repeat_factor_vec;
5344
5345 /* Used for sorting the repeat factor vector.  Sort primarily by
5346    ascending occurrence count, secondarily by descending rank.  */
5347
5348 static int
5349 compare_repeat_factors (const void *x1, const void *x2)
5350 {
5351   const repeat_factor *rf1 = (const repeat_factor *) x1;
5352   const repeat_factor *rf2 = (const repeat_factor *) x2;
5353
5354   if (rf1->count != rf2->count)
5355     return rf1->count - rf2->count;
5356
5357   return rf2->rank - rf1->rank;
5358 }
5359
5360 /* Look for repeated operands in OPS in the multiply tree rooted at
5361    STMT.  Replace them with an optimal sequence of multiplies and powi
5362    builtin calls, and remove the used operands from OPS.  Return an
5363    SSA name representing the value of the replacement sequence.  */
5364
5365 static tree
5366 attempt_builtin_powi (gimple *stmt, vec<operand_entry *> *ops)
5367 {
5368   unsigned i, j, vec_len;
5369   int ii;
5370   operand_entry *oe;
5371   repeat_factor *rf1, *rf2;
5372   repeat_factor rfnew;
5373   tree result = NULL_TREE;
5374   tree target_ssa, iter_result;
5375   tree type = TREE_TYPE (gimple_get_lhs (stmt));
5376   tree powi_fndecl = mathfn_built_in (type, BUILT_IN_POWI);
5377   gimple_stmt_iterator gsi = gsi_for_stmt (stmt);
5378   gimple *mul_stmt, *pow_stmt;
5379
5380   /* Nothing to do if BUILT_IN_POWI doesn't exist for this type and
5381      target.  */
5382   if (!powi_fndecl)
5383     return NULL_TREE;
5384
5385   /* Allocate the repeated factor vector.  */
5386   repeat_factor_vec.create (10);
5387
5388   /* Scan the OPS vector for all SSA names in the product and build
5389      up a vector of occurrence counts for each factor.  */
5390   FOR_EACH_VEC_ELT (*ops, i, oe)
5391     {
5392       if (TREE_CODE (oe->op) == SSA_NAME)
5393         {
5394           FOR_EACH_VEC_ELT (repeat_factor_vec, j, rf1)
5395             {
5396               if (rf1->factor == oe->op)
5397                 {
5398                   rf1->count += oe->count;
5399                   break;
5400                 }
5401             }
5402
5403           if (j >= repeat_factor_vec.length ())
5404             {
5405               rfnew.factor = oe->op;
5406               rfnew.rank = oe->rank;
5407               rfnew.count = oe->count;
5408               rfnew.repr = NULL_TREE;
5409               repeat_factor_vec.safe_push (rfnew);
5410             }
5411         }
5412     }
5413
5414   /* Sort the repeated factor vector by (a) increasing occurrence count,
5415      and (b) decreasing rank.  */
5416   repeat_factor_vec.qsort (compare_repeat_factors);
5417
5418   /* It is generally best to combine as many base factors as possible
5419      into a product before applying __builtin_powi to the result.
5420      However, the sort order chosen for the repeated factor vector
5421      allows us to cache partial results for the product of the base
5422      factors for subsequent use.  When we already have a cached partial
5423      result from a previous iteration, it is best to make use of it
5424      before looking for another __builtin_pow opportunity.
5425
5426      As an example, consider x * x * y * y * y * z * z * z * z.
5427      We want to first compose the product x * y * z, raise it to the
5428      second power, then multiply this by y * z, and finally multiply
5429      by z.  This can be done in 5 multiplies provided we cache y * z
5430      for use in both expressions:
5431
5432         t1 = y * z
5433         t2 = t1 * x
5434         t3 = t2 * t2
5435         t4 = t1 * t3
5436         result = t4 * z
5437
5438      If we instead ignored the cached y * z and first multiplied by
5439      the __builtin_pow opportunity z * z, we would get the inferior:
5440
5441         t1 = y * z
5442         t2 = t1 * x
5443         t3 = t2 * t2
5444         t4 = z * z
5445         t5 = t3 * t4
5446         result = t5 * y  */
5447
5448   vec_len = repeat_factor_vec.length ();
5449   
5450   /* Repeatedly look for opportunities to create a builtin_powi call.  */
5451   while (true)
5452     {
5453       HOST_WIDE_INT power;
5454
5455       /* First look for the largest cached product of factors from
5456          preceding iterations.  If found, create a builtin_powi for
5457          it if the minimum occurrence count for its factors is at
5458          least 2, or just use this cached product as our next 
5459          multiplicand if the minimum occurrence count is 1.  */
5460       FOR_EACH_VEC_ELT (repeat_factor_vec, j, rf1)
5461         {
5462           if (rf1->repr && rf1->count > 0)
5463             break;
5464         }
5465
5466       if (j < vec_len)
5467         {
5468           power = rf1->count;
5469
5470           if (power == 1)
5471             {
5472               iter_result = rf1->repr;
5473
5474               if (dump_file && (dump_flags & TDF_DETAILS))
5475                 {
5476                   unsigned elt;
5477                   repeat_factor *rf;
5478                   fputs ("Multiplying by cached product ", dump_file);
5479                   for (elt = j; elt < vec_len; elt++)
5480                     {
5481                       rf = &repeat_factor_vec[elt];
5482                       print_generic_expr (dump_file, rf->factor);
5483                       if (elt < vec_len - 1)
5484                         fputs (" * ", dump_file);
5485                     }
5486                   fputs ("\n", dump_file);
5487                 }
5488             }
5489           else
5490             {
5491               iter_result = make_temp_ssa_name (type, NULL, "reassocpow");
5492               pow_stmt = gimple_build_call (powi_fndecl, 2, rf1->repr, 
5493                                             build_int_cst (integer_type_node,
5494                                                            power));
5495               gimple_call_set_lhs (pow_stmt, iter_result);
5496               gimple_set_location (pow_stmt, gimple_location (stmt));
5497               gimple_set_uid (pow_stmt, gimple_uid (stmt));
5498               gsi_insert_before (&gsi, pow_stmt, GSI_SAME_STMT);
5499
5500               if (dump_file && (dump_flags & TDF_DETAILS))
5501                 {
5502                   unsigned elt;
5503                   repeat_factor *rf;
5504                   fputs ("Building __builtin_pow call for cached product (",
5505                          dump_file);
5506                   for (elt = j; elt < vec_len; elt++)
5507                     {
5508                       rf = &repeat_factor_vec[elt];
5509                       print_generic_expr (dump_file, rf->factor);
5510                       if (elt < vec_len - 1)
5511                         fputs (" * ", dump_file);
5512                     }
5513                   fprintf (dump_file, ")^" HOST_WIDE_INT_PRINT_DEC"\n",
5514                            power);
5515                 }
5516             }
5517         }
5518       else
5519         {
5520           /* Otherwise, find the first factor in the repeated factor
5521              vector whose occurrence count is at least 2.  If no such
5522              factor exists, there are no builtin_powi opportunities
5523              remaining.  */
5524           FOR_EACH_VEC_ELT (repeat_factor_vec, j, rf1)
5525             {
5526               if (rf1->count >= 2)
5527                 break;
5528             }
5529
5530           if (j >= vec_len)
5531             break;
5532
5533           power = rf1->count;
5534
5535           if (dump_file && (dump_flags & TDF_DETAILS))
5536             {
5537               unsigned elt;
5538               repeat_factor *rf;
5539               fputs ("Building __builtin_pow call for (", dump_file);
5540               for (elt = j; elt < vec_len; elt++)
5541                 {
5542                   rf = &repeat_factor_vec[elt];
5543                   print_generic_expr (dump_file, rf->factor);
5544                   if (elt < vec_len - 1)
5545                     fputs (" * ", dump_file);
5546                 }
5547               fprintf (dump_file, ")^" HOST_WIDE_INT_PRINT_DEC"\n", power);
5548             }
5549
5550           reassociate_stats.pows_created++;
5551
5552           /* Visit each element of the vector in reverse order (so that
5553              high-occurrence elements are visited first, and within the
5554              same occurrence count, lower-ranked elements are visited
5555              first).  Form a linear product of all elements in this order
5556              whose occurrencce count is at least that of element J.
5557              Record the SSA name representing the product of each element
5558              with all subsequent elements in the vector.  */
5559           if (j == vec_len - 1)
5560             rf1->repr = rf1->factor;
5561           else
5562             {
5563               for (ii = vec_len - 2; ii >= (int)j; ii--)
5564                 {
5565                   tree op1, op2;
5566
5567                   rf1 = &repeat_factor_vec[ii];
5568                   rf2 = &repeat_factor_vec[ii + 1];
5569
5570                   /* Init the last factor's representative to be itself.  */
5571                   if (!rf2->repr)
5572                     rf2->repr = rf2->factor;
5573
5574                   op1 = rf1->factor;
5575                   op2 = rf2->repr;
5576
5577                   target_ssa = make_temp_ssa_name (type, NULL, "reassocpow");
5578                   mul_stmt = gimple_build_assign (target_ssa, MULT_EXPR,
5579                                                   op1, op2);
5580                   gimple_set_location (mul_stmt, gimple_location (stmt));
5581                   gimple_set_uid (mul_stmt, gimple_uid (stmt));
5582                   gsi_insert_before (&gsi, mul_stmt, GSI_SAME_STMT);
5583                   rf1->repr = target_ssa;
5584
5585                   /* Don't reprocess the multiply we just introduced.  */
5586                   gimple_set_visited (mul_stmt, true);
5587                 }
5588             }
5589
5590           /* Form a call to __builtin_powi for the maximum product
5591              just formed, raised to the power obtained earlier.  */
5592           rf1 = &repeat_factor_vec[j];
5593           iter_result = make_temp_ssa_name (type, NULL, "reassocpow");
5594           pow_stmt = gimple_build_call (powi_fndecl, 2, rf1->repr, 
5595                                         build_int_cst (integer_type_node,
5596                                                        power));
5597           gimple_call_set_lhs (pow_stmt, iter_result);
5598           gimple_set_location (pow_stmt, gimple_location (stmt));
5599           gimple_set_uid (pow_stmt, gimple_uid (stmt));
5600           gsi_insert_before (&gsi, pow_stmt, GSI_SAME_STMT);
5601         }
5602
5603       /* If we previously formed at least one other builtin_powi call,
5604          form the product of this one and those others.  */
5605       if (result)
5606         {
5607           tree new_result = make_temp_ssa_name (type, NULL, "reassocpow");
5608           mul_stmt = gimple_build_assign (new_result, MULT_EXPR,
5609                                           result, iter_result);
5610           gimple_set_location (mul_stmt, gimple_location (stmt));
5611           gimple_set_uid (mul_stmt, gimple_uid (stmt));
5612           gsi_insert_before (&gsi, mul_stmt, GSI_SAME_STMT);
5613           gimple_set_visited (mul_stmt, true);
5614           result = new_result;
5615         }
5616       else
5617         result = iter_result;
5618
5619       /* Decrement the occurrence count of each element in the product
5620          by the count found above, and remove this many copies of each
5621          factor from OPS.  */
5622       for (i = j; i < vec_len; i++)
5623         {
5624           unsigned k = power;
5625           unsigned n;
5626
5627           rf1 = &repeat_factor_vec[i];
5628           rf1->count -= power;
5629           
5630           FOR_EACH_VEC_ELT_REVERSE (*ops, n, oe)
5631             {
5632               if (oe->op == rf1->factor)
5633                 {
5634                   if (oe->count <= k)
5635                     {
5636                       ops->ordered_remove (n);
5637                       k -= oe->count;
5638
5639                       if (k == 0)
5640                         break;
5641                     }
5642                   else
5643                     {
5644                       oe->count -= k;
5645                       break;
5646                     }
5647                 }
5648             }
5649         }
5650     }
5651
5652   /* At this point all elements in the repeated factor vector have a
5653      remaining occurrence count of 0 or 1, and those with a count of 1
5654      don't have cached representatives.  Re-sort the ops vector and
5655      clean up.  */
5656   ops->qsort (sort_by_operand_rank);
5657   repeat_factor_vec.release ();
5658
5659   /* Return the final product computed herein.  Note that there may
5660      still be some elements with single occurrence count left in OPS;
5661      those will be handled by the normal reassociation logic.  */
5662   return result;
5663 }
5664
5665 /* Attempt to optimize
5666    CST1 * copysign (CST2, y) -> copysign (CST1 * CST2, y) if CST1 > 0, or
5667    CST1 * copysign (CST2, y) -> -copysign (CST1 * CST2, y) if CST1 < 0.  */
5668
5669 static void
5670 attempt_builtin_copysign (vec<operand_entry *> *ops)
5671 {
5672   operand_entry *oe;
5673   unsigned int i;
5674   unsigned int length = ops->length ();
5675   tree cst = ops->last ()->op;
5676
5677   if (length == 1 || TREE_CODE (cst) != REAL_CST)
5678     return;
5679
5680   FOR_EACH_VEC_ELT (*ops, i, oe)
5681     {
5682       if (TREE_CODE (oe->op) == SSA_NAME
5683           && has_single_use (oe->op))
5684         {
5685           gimple *def_stmt = SSA_NAME_DEF_STMT (oe->op);
5686           if (gcall *old_call = dyn_cast <gcall *> (def_stmt))
5687             {
5688               tree arg0, arg1;
5689               switch (gimple_call_combined_fn (old_call))
5690                 {
5691                 CASE_CFN_COPYSIGN:
5692                 CASE_CFN_COPYSIGN_FN:
5693                   arg0 = gimple_call_arg (old_call, 0);
5694                   arg1 = gimple_call_arg (old_call, 1);
5695                   /* The first argument of copysign must be a constant,
5696                      otherwise there's nothing to do.  */
5697                   if (TREE_CODE (arg0) == REAL_CST)
5698                     {
5699                       tree type = TREE_TYPE (arg0);
5700                       tree mul = const_binop (MULT_EXPR, type, cst, arg0);
5701                       /* If we couldn't fold to a single constant, skip it.
5702                          That happens e.g. for inexact multiplication when
5703                          -frounding-math.  */
5704                       if (mul == NULL_TREE)
5705                         break;
5706                       /* Instead of adjusting OLD_CALL, let's build a new
5707                          call to not leak the LHS and prevent keeping bogus
5708                          debug statements.  DCE will clean up the old call.  */
5709                       gcall *new_call;
5710                       if (gimple_call_internal_p (old_call))
5711                         new_call = gimple_build_call_internal
5712                           (IFN_COPYSIGN, 2, mul, arg1);
5713                       else
5714                         new_call = gimple_build_call
5715                           (gimple_call_fndecl (old_call), 2, mul, arg1);
5716                       tree lhs = make_ssa_name (type);
5717                       gimple_call_set_lhs (new_call, lhs);
5718                       gimple_set_location (new_call,
5719                                            gimple_location (old_call));
5720                       insert_stmt_after (new_call, old_call);
5721                       /* We've used the constant, get rid of it.  */
5722                       ops->pop ();
5723                       bool cst1_neg = real_isneg (TREE_REAL_CST_PTR (cst));
5724                       /* Handle the CST1 < 0 case by negating the result.  */
5725                       if (cst1_neg)
5726                         {
5727                           tree negrhs = make_ssa_name (TREE_TYPE (lhs));
5728                           gimple *negate_stmt
5729                             = gimple_build_assign (negrhs, NEGATE_EXPR, lhs);
5730                           insert_stmt_after (negate_stmt, new_call);
5731                           oe->op = negrhs;
5732                         }
5733                       else
5734                         oe->op = lhs;
5735                       if (dump_file && (dump_flags & TDF_DETAILS))
5736                         {
5737                           fprintf (dump_file, "Optimizing copysign: ");
5738                           print_generic_expr (dump_file, cst);
5739                           fprintf (dump_file, " * COPYSIGN (");
5740                           print_generic_expr (dump_file, arg0);
5741                           fprintf (dump_file, ", ");
5742                           print_generic_expr (dump_file, arg1);
5743                           fprintf (dump_file, ") into %sCOPYSIGN (",
5744                                    cst1_neg ? "-" : "");
5745                           print_generic_expr (dump_file, mul);
5746                           fprintf (dump_file, ", ");
5747                           print_generic_expr (dump_file, arg1);
5748                           fprintf (dump_file, "\n");
5749                         }
5750                       return;
5751                     }
5752                   break;
5753                 default:
5754                   break;
5755                 }
5756             }
5757         }
5758     }
5759 }
5760
5761 /* Transform STMT at *GSI into a copy by replacing its rhs with NEW_RHS.  */
5762
5763 static void
5764 transform_stmt_to_copy (gimple_stmt_iterator *gsi, gimple *stmt, tree new_rhs)
5765 {
5766   tree rhs1;
5767
5768   if (dump_file && (dump_flags & TDF_DETAILS))
5769     {
5770       fprintf (dump_file, "Transforming ");
5771       print_gimple_stmt (dump_file, stmt, 0);
5772     }
5773
5774   rhs1 = gimple_assign_rhs1 (stmt);
5775   gimple_assign_set_rhs_from_tree (gsi, new_rhs);
5776   update_stmt (stmt);
5777   remove_visited_stmt_chain (rhs1);
5778
5779   if (dump_file && (dump_flags & TDF_DETAILS))
5780     {
5781       fprintf (dump_file, " into ");
5782       print_gimple_stmt (dump_file, stmt, 0);
5783     }
5784 }
5785
5786 /* Transform STMT at *GSI into a multiply of RHS1 and RHS2.  */
5787
5788 static void
5789 transform_stmt_to_multiply (gimple_stmt_iterator *gsi, gimple *stmt,
5790                             tree rhs1, tree rhs2)
5791 {
5792   if (dump_file && (dump_flags & TDF_DETAILS))
5793     {
5794       fprintf (dump_file, "Transforming ");
5795       print_gimple_stmt (dump_file, stmt, 0);
5796     }
5797
5798   gimple_assign_set_rhs_with_ops (gsi, MULT_EXPR, rhs1, rhs2);
5799   update_stmt (gsi_stmt (*gsi));
5800   remove_visited_stmt_chain (rhs1);
5801
5802   if (dump_file && (dump_flags & TDF_DETAILS))
5803     {
5804       fprintf (dump_file, " into ");
5805       print_gimple_stmt (dump_file, stmt, 0);
5806     }
5807 }
5808
5809 /* Reassociate expressions in basic block BB and its post-dominator as
5810    children.
5811
5812    Bubble up return status from maybe_optimize_range_tests.  */
5813
5814 static bool
5815 reassociate_bb (basic_block bb)
5816 {
5817   gimple_stmt_iterator gsi;
5818   basic_block son;
5819   gimple *stmt = last_stmt (bb);
5820   bool cfg_cleanup_needed = false;
5821
5822   if (stmt && !gimple_visited_p (stmt))
5823     cfg_cleanup_needed |= maybe_optimize_range_tests (stmt);
5824
5825   for (gsi = gsi_last_bb (bb); !gsi_end_p (gsi); gsi_prev (&gsi))
5826     {
5827       stmt = gsi_stmt (gsi);
5828
5829       if (is_gimple_assign (stmt)
5830           && !stmt_could_throw_p (stmt))
5831         {
5832           tree lhs, rhs1, rhs2;
5833           enum tree_code rhs_code = gimple_assign_rhs_code (stmt);
5834
5835           /* If this is not a gimple binary expression, there is
5836              nothing for us to do with it.  */
5837           if (get_gimple_rhs_class (rhs_code) != GIMPLE_BINARY_RHS)
5838             continue;
5839
5840           /* If this was part of an already processed statement,
5841              we don't need to touch it again. */
5842           if (gimple_visited_p (stmt))
5843             {
5844               /* This statement might have become dead because of previous
5845                  reassociations.  */
5846               if (has_zero_uses (gimple_get_lhs (stmt)))
5847                 {
5848                   reassoc_remove_stmt (&gsi);
5849                   release_defs (stmt);
5850                   /* We might end up removing the last stmt above which
5851                      places the iterator to the end of the sequence.
5852                      Reset it to the last stmt in this case which might
5853                      be the end of the sequence as well if we removed
5854                      the last statement of the sequence.  In which case
5855                      we need to bail out.  */
5856                   if (gsi_end_p (gsi))
5857                     {
5858                       gsi = gsi_last_bb (bb);
5859                       if (gsi_end_p (gsi))
5860                         break;
5861                     }
5862                 }
5863               continue;
5864             }
5865
5866           lhs = gimple_assign_lhs (stmt);
5867           rhs1 = gimple_assign_rhs1 (stmt);
5868           rhs2 = gimple_assign_rhs2 (stmt);
5869
5870           /* For non-bit or min/max operations we can't associate
5871              all types.  Verify that here.  */
5872           if (rhs_code != BIT_IOR_EXPR
5873               && rhs_code != BIT_AND_EXPR
5874               && rhs_code != BIT_XOR_EXPR
5875               && rhs_code != MIN_EXPR
5876               && rhs_code != MAX_EXPR
5877               && (!can_reassociate_p (lhs)
5878                   || !can_reassociate_p (rhs1)
5879                   || !can_reassociate_p (rhs2)))
5880             continue;
5881
5882           if (associative_tree_code (rhs_code))
5883             {
5884               auto_vec<operand_entry *> ops;
5885               tree powi_result = NULL_TREE;
5886               bool is_vector = VECTOR_TYPE_P (TREE_TYPE (lhs));
5887
5888               /* There may be no immediate uses left by the time we
5889                  get here because we may have eliminated them all.  */
5890               if (TREE_CODE (lhs) == SSA_NAME && has_zero_uses (lhs))
5891                 continue;
5892
5893               gimple_set_visited (stmt, true);
5894               linearize_expr_tree (&ops, stmt, true, true);
5895               ops.qsort (sort_by_operand_rank);
5896               int orig_len = ops.length ();
5897               optimize_ops_list (rhs_code, &ops);
5898               if (undistribute_ops_list (rhs_code, &ops,
5899                                          loop_containing_stmt (stmt)))
5900                 {
5901                   ops.qsort (sort_by_operand_rank);
5902                   optimize_ops_list (rhs_code, &ops);
5903                 }
5904
5905               if (rhs_code == PLUS_EXPR
5906                   && transform_add_to_multiply (&ops))
5907                 ops.qsort (sort_by_operand_rank);
5908
5909               if (rhs_code == BIT_IOR_EXPR || rhs_code == BIT_AND_EXPR)
5910                 {
5911                   if (is_vector)
5912                     optimize_vec_cond_expr (rhs_code, &ops);
5913                   else
5914                     optimize_range_tests (rhs_code, &ops, NULL);
5915                 }
5916
5917               if (rhs_code == MULT_EXPR && !is_vector)
5918                 {
5919                   attempt_builtin_copysign (&ops);
5920
5921                   if (reassoc_insert_powi_p
5922                       && flag_unsafe_math_optimizations)
5923                     powi_result = attempt_builtin_powi (stmt, &ops);
5924                 }
5925
5926               operand_entry *last;
5927               bool negate_result = false;
5928               if (ops.length () > 1
5929                   && rhs_code == MULT_EXPR)
5930                 {
5931                   last = ops.last ();
5932                   if ((integer_minus_onep (last->op)
5933                        || real_minus_onep (last->op))
5934                       && !HONOR_SNANS (TREE_TYPE (lhs))
5935                       && (!HONOR_SIGNED_ZEROS (TREE_TYPE (lhs))
5936                           || !COMPLEX_FLOAT_TYPE_P (TREE_TYPE (lhs))))
5937                     {
5938                       ops.pop ();
5939                       negate_result = true;
5940                     }
5941                 }
5942
5943               tree new_lhs = lhs;
5944               /* If the operand vector is now empty, all operands were 
5945                  consumed by the __builtin_powi optimization.  */
5946               if (ops.length () == 0)
5947                 transform_stmt_to_copy (&gsi, stmt, powi_result);
5948               else if (ops.length () == 1)
5949                 {
5950                   tree last_op = ops.last ()->op;
5951
5952                   /* If the stmt that defines operand has to be inserted, insert it
5953                      before the use.  */
5954                   if (ops.last ()->stmt_to_insert)
5955                     insert_stmt_before_use (stmt, ops.last ()->stmt_to_insert);
5956                   if (powi_result)
5957                     transform_stmt_to_multiply (&gsi, stmt, last_op,
5958                                                 powi_result);
5959                   else
5960                     transform_stmt_to_copy (&gsi, stmt, last_op);
5961                 }
5962               else
5963                 {
5964                   machine_mode mode = TYPE_MODE (TREE_TYPE (lhs));
5965                   int ops_num = ops.length ();
5966                   int width = get_reassociation_width (ops_num, rhs_code, mode);
5967
5968                   if (dump_file && (dump_flags & TDF_DETAILS))
5969                     fprintf (dump_file,
5970                              "Width = %d was chosen for reassociation\n", width);
5971
5972
5973                   /* For binary bit operations, if there are at least 3
5974                      operands and the last last operand in OPS is a constant,
5975                      move it to the front.  This helps ensure that we generate
5976                      (X & Y) & C rather than (X & C) & Y.  The former will
5977                      often match a canonical bit test when we get to RTL.  */
5978                   if (ops.length () > 2
5979                       && (rhs_code == BIT_AND_EXPR
5980                           || rhs_code == BIT_IOR_EXPR
5981                           || rhs_code == BIT_XOR_EXPR)
5982                       && TREE_CODE (ops.last ()->op) == INTEGER_CST)
5983                     std::swap (*ops[0], *ops[ops_num - 1]);
5984
5985                   if (width > 1
5986                       && ops.length () > 3)
5987                     rewrite_expr_tree_parallel (as_a <gassign *> (stmt),
5988                                                 width, ops);
5989                   else
5990                     {
5991                       /* When there are three operands left, we want
5992                          to make sure the ones that get the double
5993                          binary op are chosen wisely.  */
5994                       int len = ops.length ();
5995                       if (len >= 3)
5996                         swap_ops_for_binary_stmt (ops, len - 3, stmt);
5997
5998                       new_lhs = rewrite_expr_tree (stmt, 0, ops,
5999                                                    powi_result != NULL
6000                                                    || negate_result,
6001                                                    len != orig_len);
6002                     }
6003
6004                   /* If we combined some repeated factors into a 
6005                      __builtin_powi call, multiply that result by the
6006                      reassociated operands.  */
6007                   if (powi_result)
6008                     {
6009                       gimple *mul_stmt, *lhs_stmt = SSA_NAME_DEF_STMT (lhs);
6010                       tree type = TREE_TYPE (lhs);
6011                       tree target_ssa = make_temp_ssa_name (type, NULL,
6012                                                             "reassocpow");
6013                       gimple_set_lhs (lhs_stmt, target_ssa);
6014                       update_stmt (lhs_stmt);
6015                       if (lhs != new_lhs)
6016                         {
6017                           target_ssa = new_lhs;
6018                           new_lhs = lhs;
6019                         }
6020                       mul_stmt = gimple_build_assign (lhs, MULT_EXPR,
6021                                                       powi_result, target_ssa);
6022                       gimple_set_location (mul_stmt, gimple_location (stmt));
6023                       gimple_set_uid (mul_stmt, gimple_uid (stmt));
6024                       gsi_insert_after (&gsi, mul_stmt, GSI_NEW_STMT);
6025                     }
6026                 }
6027
6028               if (negate_result)
6029                 {
6030                   stmt = SSA_NAME_DEF_STMT (lhs);
6031                   tree tmp = make_ssa_name (TREE_TYPE (lhs));
6032                   gimple_set_lhs (stmt, tmp);
6033                   if (lhs != new_lhs)
6034                     tmp = new_lhs;
6035                   gassign *neg_stmt = gimple_build_assign (lhs, NEGATE_EXPR,
6036                                                            tmp);
6037                   gimple_set_uid (neg_stmt, gimple_uid (stmt));
6038                   gsi_insert_after (&gsi, neg_stmt, GSI_NEW_STMT);
6039                   update_stmt (stmt);
6040                 }
6041             }
6042         }
6043     }
6044   for (son = first_dom_son (CDI_POST_DOMINATORS, bb);
6045        son;
6046        son = next_dom_son (CDI_POST_DOMINATORS, son))
6047     cfg_cleanup_needed |= reassociate_bb (son);
6048
6049   return cfg_cleanup_needed;
6050 }
6051
6052 /* Add jumps around shifts for range tests turned into bit tests.
6053    For each SSA_NAME VAR we have code like:
6054    VAR = ...; // final stmt of range comparison
6055    // bit test here...;
6056    OTHERVAR = ...; // final stmt of the bit test sequence
6057    RES = VAR | OTHERVAR;
6058    Turn the above into:
6059    VAR = ...;
6060    if (VAR != 0)
6061      goto <l3>;
6062    else
6063      goto <l2>;
6064    <l2>:
6065    // bit test here...;
6066    OTHERVAR = ...;
6067    <l3>:
6068    # RES = PHI<1(l1), OTHERVAR(l2)>;  */
6069
6070 static void
6071 branch_fixup (void)
6072 {
6073   tree var;
6074   unsigned int i;
6075
6076   FOR_EACH_VEC_ELT (reassoc_branch_fixups, i, var)
6077     {
6078       gimple *def_stmt = SSA_NAME_DEF_STMT (var);
6079       gimple *use_stmt;
6080       use_operand_p use;
6081       bool ok = single_imm_use (var, &use, &use_stmt);
6082       gcc_assert (ok
6083                   && is_gimple_assign (use_stmt)
6084                   && gimple_assign_rhs_code (use_stmt) == BIT_IOR_EXPR
6085                   && gimple_bb (def_stmt) == gimple_bb (use_stmt));
6086
6087       basic_block cond_bb = gimple_bb (def_stmt);
6088       basic_block then_bb = split_block (cond_bb, def_stmt)->dest;
6089       basic_block merge_bb = split_block (then_bb, use_stmt)->dest;
6090
6091       gimple_stmt_iterator gsi = gsi_for_stmt (def_stmt);
6092       gimple *g = gimple_build_cond (NE_EXPR, var,
6093                                      build_zero_cst (TREE_TYPE (var)),
6094                                      NULL_TREE, NULL_TREE);
6095       location_t loc = gimple_location (use_stmt);
6096       gimple_set_location (g, loc);
6097       gsi_insert_after (&gsi, g, GSI_NEW_STMT);
6098
6099       edge etrue = make_edge (cond_bb, merge_bb, EDGE_TRUE_VALUE);
6100       etrue->probability = profile_probability::even ();
6101       edge efalse = find_edge (cond_bb, then_bb);
6102       efalse->flags = EDGE_FALSE_VALUE;
6103       efalse->probability -= etrue->probability;
6104       then_bb->count -= etrue->count ();
6105
6106       tree othervar = NULL_TREE;
6107       if (gimple_assign_rhs1 (use_stmt) == var)
6108         othervar = gimple_assign_rhs2 (use_stmt);
6109       else if (gimple_assign_rhs2 (use_stmt) == var)
6110         othervar = gimple_assign_rhs1 (use_stmt);
6111       else
6112         gcc_unreachable ();
6113       tree lhs = gimple_assign_lhs (use_stmt);
6114       gphi *phi = create_phi_node (lhs, merge_bb);
6115       add_phi_arg (phi, build_one_cst (TREE_TYPE (lhs)), etrue, loc);
6116       add_phi_arg (phi, othervar, single_succ_edge (then_bb), loc);
6117       gsi = gsi_for_stmt (use_stmt);
6118       gsi_remove (&gsi, true);
6119
6120       set_immediate_dominator (CDI_DOMINATORS, merge_bb, cond_bb);
6121       set_immediate_dominator (CDI_POST_DOMINATORS, cond_bb, merge_bb);
6122     }
6123   reassoc_branch_fixups.release ();
6124 }
6125
6126 void dump_ops_vector (FILE *file, vec<operand_entry *> ops);
6127 void debug_ops_vector (vec<operand_entry *> ops);
6128
6129 /* Dump the operand entry vector OPS to FILE.  */
6130
6131 void
6132 dump_ops_vector (FILE *file, vec<operand_entry *> ops)
6133 {
6134   operand_entry *oe;
6135   unsigned int i;
6136
6137   FOR_EACH_VEC_ELT (ops, i, oe)
6138     {
6139       fprintf (file, "Op %d -> rank: %d, tree: ", i, oe->rank);
6140       print_generic_expr (file, oe->op);
6141       fprintf (file, "\n");
6142     }
6143 }
6144
6145 /* Dump the operand entry vector OPS to STDERR.  */
6146
6147 DEBUG_FUNCTION void
6148 debug_ops_vector (vec<operand_entry *> ops)
6149 {
6150   dump_ops_vector (stderr, ops);
6151 }
6152
6153 /* Bubble up return status from reassociate_bb.  */
6154
6155 static bool
6156 do_reassoc (void)
6157 {
6158   break_up_subtract_bb (ENTRY_BLOCK_PTR_FOR_FN (cfun));
6159   return reassociate_bb (EXIT_BLOCK_PTR_FOR_FN (cfun));
6160 }
6161
6162 /* Initialize the reassociation pass.  */
6163
6164 static void
6165 init_reassoc (void)
6166 {
6167   int i;
6168   long rank = 2;
6169   int *bbs = XNEWVEC (int, n_basic_blocks_for_fn (cfun) - NUM_FIXED_BLOCKS);
6170
6171   /* Find the loops, so that we can prevent moving calculations in
6172      them.  */
6173   loop_optimizer_init (AVOID_CFG_MODIFICATIONS);
6174
6175   memset (&reassociate_stats, 0, sizeof (reassociate_stats));
6176
6177   next_operand_entry_id = 0;
6178
6179   /* Reverse RPO (Reverse Post Order) will give us something where
6180      deeper loops come later.  */
6181   pre_and_rev_post_order_compute (NULL, bbs, false);
6182   bb_rank = XCNEWVEC (long, last_basic_block_for_fn (cfun));
6183   operand_rank = new hash_map<tree, long>;
6184
6185   /* Give each default definition a distinct rank.  This includes
6186      parameters and the static chain.  Walk backwards over all
6187      SSA names so that we get proper rank ordering according
6188      to tree_swap_operands_p.  */
6189   for (i = num_ssa_names - 1; i > 0; --i)
6190     {
6191       tree name = ssa_name (i);
6192       if (name && SSA_NAME_IS_DEFAULT_DEF (name))
6193         insert_operand_rank (name, ++rank);
6194     }
6195
6196   /* Set up rank for each BB  */
6197   for (i = 0; i < n_basic_blocks_for_fn (cfun) - NUM_FIXED_BLOCKS; i++)
6198     bb_rank[bbs[i]] = ++rank << 16;
6199
6200   free (bbs);
6201   calculate_dominance_info (CDI_POST_DOMINATORS);
6202   plus_negates = vNULL;
6203 }
6204
6205 /* Cleanup after the reassociation pass, and print stats if
6206    requested.  */
6207
6208 static void
6209 fini_reassoc (void)
6210 {
6211   statistics_counter_event (cfun, "Linearized",
6212                             reassociate_stats.linearized);
6213   statistics_counter_event (cfun, "Constants eliminated",
6214                             reassociate_stats.constants_eliminated);
6215   statistics_counter_event (cfun, "Ops eliminated",
6216                             reassociate_stats.ops_eliminated);
6217   statistics_counter_event (cfun, "Statements rewritten",
6218                             reassociate_stats.rewritten);
6219   statistics_counter_event (cfun, "Built-in pow[i] calls encountered",
6220                             reassociate_stats.pows_encountered);
6221   statistics_counter_event (cfun, "Built-in powi calls created",
6222                             reassociate_stats.pows_created);
6223
6224   delete operand_rank;
6225   operand_entry_pool.release ();
6226   free (bb_rank);
6227   plus_negates.release ();
6228   free_dominance_info (CDI_POST_DOMINATORS);
6229   loop_optimizer_finalize ();
6230 }
6231
6232 /* Gate and execute functions for Reassociation.  If INSERT_POWI_P, enable
6233    insertion of __builtin_powi calls.
6234
6235    Returns TODO_cfg_cleanup if a CFG cleanup pass is desired due to
6236    optimization of a gimple conditional.  Otherwise returns zero.  */
6237
6238 static unsigned int
6239 execute_reassoc (bool insert_powi_p)
6240 {
6241   reassoc_insert_powi_p = insert_powi_p;
6242
6243   init_reassoc ();
6244
6245   bool cfg_cleanup_needed;
6246   cfg_cleanup_needed = do_reassoc ();
6247   repropagate_negates ();
6248   branch_fixup ();
6249
6250   fini_reassoc ();
6251   return cfg_cleanup_needed ? TODO_cleanup_cfg : 0;
6252 }
6253
6254 namespace {
6255
6256 const pass_data pass_data_reassoc =
6257 {
6258   GIMPLE_PASS, /* type */
6259   "reassoc", /* name */
6260   OPTGROUP_NONE, /* optinfo_flags */
6261   TV_TREE_REASSOC, /* tv_id */
6262   ( PROP_cfg | PROP_ssa ), /* properties_required */
6263   0, /* properties_provided */
6264   0, /* properties_destroyed */
6265   0, /* todo_flags_start */
6266   TODO_update_ssa_only_virtuals, /* todo_flags_finish */
6267 };
6268
6269 class pass_reassoc : public gimple_opt_pass
6270 {
6271 public:
6272   pass_reassoc (gcc::context *ctxt)
6273     : gimple_opt_pass (pass_data_reassoc, ctxt), insert_powi_p (false)
6274   {}
6275
6276   /* opt_pass methods: */
6277   opt_pass * clone () { return new pass_reassoc (m_ctxt); }
6278   void set_pass_param (unsigned int n, bool param)
6279     {
6280       gcc_assert (n == 0);
6281       insert_powi_p = param;
6282     }
6283   virtual bool gate (function *) { return flag_tree_reassoc != 0; }
6284   virtual unsigned int execute (function *)
6285     { return execute_reassoc (insert_powi_p); }
6286
6287  private:
6288   /* Enable insertion of __builtin_powi calls during execute_reassoc.  See
6289      point 3a in the pass header comment.  */
6290   bool insert_powi_p;
6291 }; // class pass_reassoc
6292
6293 } // anon namespace
6294
6295 gimple_opt_pass *
6296 make_pass_reassoc (gcc::context *ctxt)
6297 {
6298   return new pass_reassoc (ctxt);
6299 }