OSDN Git Service

In libobjc/:
[pf3gnuchains/gcc-fork.git] / gcc / ifcvt.c
1 /* If-conversion support.
2    Copyright (C) 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2010
3    Free Software Foundation, Inc.
4
5    This file is part of GCC.
6
7    GCC is free software; you can redistribute it and/or modify it
8    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, but WITHOUT
13    ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
14    or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public
15    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 "tm.h"
25
26 #include "rtl.h"
27 #include "regs.h"
28 #include "function.h"
29 #include "flags.h"
30 #include "insn-config.h"
31 #include "recog.h"
32 #include "except.h"
33 #include "hard-reg-set.h"
34 #include "basic-block.h"
35 #include "expr.h"
36 #include "output.h"
37 #include "optabs.h"
38 #include "diagnostic-core.h"
39 #include "toplev.h"
40 #include "tm_p.h"
41 #include "cfgloop.h"
42 #include "target.h"
43 #include "timevar.h"
44 #include "tree-pass.h"
45 #include "df.h"
46 #include "vec.h"
47 #include "vecprim.h"
48 #include "dbgcnt.h"
49
50 #ifndef HAVE_conditional_move
51 #define HAVE_conditional_move 0
52 #endif
53 #ifndef HAVE_incscc
54 #define HAVE_incscc 0
55 #endif
56 #ifndef HAVE_decscc
57 #define HAVE_decscc 0
58 #endif
59 #ifndef HAVE_trap
60 #define HAVE_trap 0
61 #endif
62
63 #ifndef MAX_CONDITIONAL_EXECUTE
64 #define MAX_CONDITIONAL_EXECUTE \
65   (BRANCH_COST (optimize_function_for_speed_p (cfun), false) \
66    + 1)
67 #endif
68
69 #define IFCVT_MULTIPLE_DUMPS 1
70
71 #define NULL_BLOCK      ((basic_block) NULL)
72
73 /* # of IF-THEN or IF-THEN-ELSE blocks we looked at  */
74 static int num_possible_if_blocks;
75
76 /* # of IF-THEN or IF-THEN-ELSE blocks were converted to conditional
77    execution.  */
78 static int num_updated_if_blocks;
79
80 /* # of changes made.  */
81 static int num_true_changes;
82
83 /* Whether conditional execution changes were made.  */
84 static int cond_exec_changed_p;
85
86 /* Forward references.  */
87 static int count_bb_insns (const_basic_block);
88 static bool cheap_bb_rtx_cost_p (const_basic_block, int);
89 static rtx first_active_insn (basic_block);
90 static rtx last_active_insn (basic_block, int);
91 static basic_block block_fallthru (basic_block);
92 static int cond_exec_process_insns (ce_if_block_t *, rtx, rtx, rtx, rtx, int);
93 static rtx cond_exec_get_condition (rtx);
94 static rtx noce_get_condition (rtx, rtx *, bool);
95 static int noce_operand_ok (const_rtx);
96 static void merge_if_block (ce_if_block_t *);
97 static int find_cond_trap (basic_block, edge, edge);
98 static basic_block find_if_header (basic_block, int);
99 static int block_jumps_and_fallthru_p (basic_block, basic_block);
100 static int noce_find_if_block (basic_block, edge, edge, int);
101 static int cond_exec_find_if_block (ce_if_block_t *);
102 static int find_if_case_1 (basic_block, edge, edge);
103 static int find_if_case_2 (basic_block, edge, edge);
104 static int find_memory (rtx *, void *);
105 static int dead_or_predicable (basic_block, basic_block, basic_block,
106                                basic_block, int);
107 static void noce_emit_move_insn (rtx, rtx);
108 static rtx block_has_only_trap (basic_block);
109 \f
110 /* Count the number of non-jump active insns in BB.  */
111
112 static int
113 count_bb_insns (const_basic_block bb)
114 {
115   int count = 0;
116   rtx insn = BB_HEAD (bb);
117
118   while (1)
119     {
120       if (CALL_P (insn) || NONJUMP_INSN_P (insn))
121         count++;
122
123       if (insn == BB_END (bb))
124         break;
125       insn = NEXT_INSN (insn);
126     }
127
128   return count;
129 }
130
131 /* Determine whether the total insn_rtx_cost on non-jump insns in
132    basic block BB is less than MAX_COST.  This function returns
133    false if the cost of any instruction could not be estimated.  */
134
135 static bool
136 cheap_bb_rtx_cost_p (const_basic_block bb, int max_cost)
137 {
138   int count = 0;
139   rtx insn = BB_HEAD (bb);
140   bool speed = optimize_bb_for_speed_p (bb);
141
142   while (1)
143     {
144       if (NONJUMP_INSN_P (insn))
145         {
146           int cost = insn_rtx_cost (PATTERN (insn), speed);
147           if (cost == 0)
148             return false;
149
150           /* If this instruction is the load or set of a "stack" register,
151              such as a floating point register on x87, then the cost of
152              speculatively executing this insn may need to include
153              the additional cost of popping its result off of the
154              register stack.  Unfortunately, correctly recognizing and
155              accounting for this additional overhead is tricky, so for
156              now we simply prohibit such speculative execution.  */
157 #ifdef STACK_REGS
158           {
159             rtx set = single_set (insn);
160             if (set && STACK_REG_P (SET_DEST (set)))
161               return false;
162           }
163 #endif
164
165           count += cost;
166           if (count >= max_cost)
167             return false;
168         }
169       else if (CALL_P (insn))
170         return false;
171
172       if (insn == BB_END (bb))
173         break;
174       insn = NEXT_INSN (insn);
175     }
176
177   return true;
178 }
179
180 /* Return the first non-jump active insn in the basic block.  */
181
182 static rtx
183 first_active_insn (basic_block bb)
184 {
185   rtx insn = BB_HEAD (bb);
186
187   if (LABEL_P (insn))
188     {
189       if (insn == BB_END (bb))
190         return NULL_RTX;
191       insn = NEXT_INSN (insn);
192     }
193
194   while (NOTE_P (insn) || DEBUG_INSN_P (insn))
195     {
196       if (insn == BB_END (bb))
197         return NULL_RTX;
198       insn = NEXT_INSN (insn);
199     }
200
201   if (JUMP_P (insn))
202     return NULL_RTX;
203
204   return insn;
205 }
206
207 /* Return the last non-jump active (non-jump) insn in the basic block.  */
208
209 static rtx
210 last_active_insn (basic_block bb, int skip_use_p)
211 {
212   rtx insn = BB_END (bb);
213   rtx head = BB_HEAD (bb);
214
215   while (NOTE_P (insn)
216          || JUMP_P (insn)
217          || DEBUG_INSN_P (insn)
218          || (skip_use_p
219              && NONJUMP_INSN_P (insn)
220              && GET_CODE (PATTERN (insn)) == USE))
221     {
222       if (insn == head)
223         return NULL_RTX;
224       insn = PREV_INSN (insn);
225     }
226
227   if (LABEL_P (insn))
228     return NULL_RTX;
229
230   return insn;
231 }
232
233 /* Return the basic block reached by falling though the basic block BB.  */
234
235 static basic_block
236 block_fallthru (basic_block bb)
237 {
238   edge e;
239   edge_iterator ei;
240
241   FOR_EACH_EDGE (e, ei, bb->succs)
242     if (e->flags & EDGE_FALLTHRU)
243       break;
244
245   return (e) ? e->dest : NULL_BLOCK;
246 }
247 \f
248 /* Go through a bunch of insns, converting them to conditional
249    execution format if possible.  Return TRUE if all of the non-note
250    insns were processed.  */
251
252 static int
253 cond_exec_process_insns (ce_if_block_t *ce_info ATTRIBUTE_UNUSED,
254                          /* if block information */rtx start,
255                          /* first insn to look at */rtx end,
256                          /* last insn to look at */rtx test,
257                          /* conditional execution test */rtx prob_val,
258                          /* probability of branch taken. */int mod_ok)
259 {
260   int must_be_last = FALSE;
261   rtx insn;
262   rtx xtest;
263   rtx pattern;
264
265   if (!start || !end)
266     return FALSE;
267
268   for (insn = start; ; insn = NEXT_INSN (insn))
269     {
270       if (NOTE_P (insn) || DEBUG_INSN_P (insn))
271         goto insn_done;
272
273       gcc_assert(NONJUMP_INSN_P (insn) || CALL_P (insn));
274
275       /* Remove USE insns that get in the way.  */
276       if (reload_completed && GET_CODE (PATTERN (insn)) == USE)
277         {
278           /* ??? Ug.  Actually unlinking the thing is problematic,
279              given what we'd have to coordinate with our callers.  */
280           SET_INSN_DELETED (insn);
281           goto insn_done;
282         }
283
284       /* Last insn wasn't last?  */
285       if (must_be_last)
286         return FALSE;
287
288       if (modified_in_p (test, insn))
289         {
290           if (!mod_ok)
291             return FALSE;
292           must_be_last = TRUE;
293         }
294
295       /* Now build the conditional form of the instruction.  */
296       pattern = PATTERN (insn);
297       xtest = copy_rtx (test);
298
299       /* If this is already a COND_EXEC, rewrite the test to be an AND of the
300          two conditions.  */
301       if (GET_CODE (pattern) == COND_EXEC)
302         {
303           if (GET_MODE (xtest) != GET_MODE (COND_EXEC_TEST (pattern)))
304             return FALSE;
305
306           xtest = gen_rtx_AND (GET_MODE (xtest), xtest,
307                                COND_EXEC_TEST (pattern));
308           pattern = COND_EXEC_CODE (pattern);
309         }
310
311       pattern = gen_rtx_COND_EXEC (VOIDmode, xtest, pattern);
312
313       /* If the machine needs to modify the insn being conditionally executed,
314          say for example to force a constant integer operand into a temp
315          register, do so here.  */
316 #ifdef IFCVT_MODIFY_INSN
317       IFCVT_MODIFY_INSN (ce_info, pattern, insn);
318       if (! pattern)
319         return FALSE;
320 #endif
321
322       validate_change (insn, &PATTERN (insn), pattern, 1);
323
324       if (CALL_P (insn) && prob_val)
325         validate_change (insn, &REG_NOTES (insn),
326                          alloc_EXPR_LIST (REG_BR_PROB, prob_val,
327                                           REG_NOTES (insn)), 1);
328
329     insn_done:
330       if (insn == end)
331         break;
332     }
333
334   return TRUE;
335 }
336
337 /* Return the condition for a jump.  Do not do any special processing.  */
338
339 static rtx
340 cond_exec_get_condition (rtx jump)
341 {
342   rtx test_if, cond;
343
344   if (any_condjump_p (jump))
345     test_if = SET_SRC (pc_set (jump));
346   else
347     return NULL_RTX;
348   cond = XEXP (test_if, 0);
349
350   /* If this branches to JUMP_LABEL when the condition is false,
351      reverse the condition.  */
352   if (GET_CODE (XEXP (test_if, 2)) == LABEL_REF
353       && XEXP (XEXP (test_if, 2), 0) == JUMP_LABEL (jump))
354     {
355       enum rtx_code rev = reversed_comparison_code (cond, jump);
356       if (rev == UNKNOWN)
357         return NULL_RTX;
358
359       cond = gen_rtx_fmt_ee (rev, GET_MODE (cond), XEXP (cond, 0),
360                              XEXP (cond, 1));
361     }
362
363   return cond;
364 }
365
366 /* Given a simple IF-THEN or IF-THEN-ELSE block, attempt to convert it
367    to conditional execution.  Return TRUE if we were successful at
368    converting the block.  */
369
370 static int
371 cond_exec_process_if_block (ce_if_block_t * ce_info,
372                             /* if block information */int do_multiple_p)
373 {
374   basic_block test_bb = ce_info->test_bb;       /* last test block */
375   basic_block then_bb = ce_info->then_bb;       /* THEN */
376   basic_block else_bb = ce_info->else_bb;       /* ELSE or NULL */
377   rtx test_expr;                /* expression in IF_THEN_ELSE that is tested */
378   rtx then_start;               /* first insn in THEN block */
379   rtx then_end;                 /* last insn + 1 in THEN block */
380   rtx else_start = NULL_RTX;    /* first insn in ELSE block or NULL */
381   rtx else_end = NULL_RTX;      /* last insn + 1 in ELSE block */
382   int max;                      /* max # of insns to convert.  */
383   int then_mod_ok;              /* whether conditional mods are ok in THEN */
384   rtx true_expr;                /* test for else block insns */
385   rtx false_expr;               /* test for then block insns */
386   rtx true_prob_val;            /* probability of else block */
387   rtx false_prob_val;           /* probability of then block */
388   rtx then_last_head = NULL_RTX;        /* Last match at the head of THEN */
389   rtx else_last_head = NULL_RTX;        /* Last match at the head of ELSE */
390   rtx then_first_tail = NULL_RTX;       /* First match at the tail of THEN */
391   rtx else_first_tail = NULL_RTX;       /* First match at the tail of ELSE */
392   int then_n_insns, else_n_insns, n_insns;
393   enum rtx_code false_code;
394
395   /* If test is comprised of && or || elements, and we've failed at handling
396      all of them together, just use the last test if it is the special case of
397      && elements without an ELSE block.  */
398   if (!do_multiple_p && ce_info->num_multiple_test_blocks)
399     {
400       if (else_bb || ! ce_info->and_and_p)
401         return FALSE;
402
403       ce_info->test_bb = test_bb = ce_info->last_test_bb;
404       ce_info->num_multiple_test_blocks = 0;
405       ce_info->num_and_and_blocks = 0;
406       ce_info->num_or_or_blocks = 0;
407     }
408
409   /* Find the conditional jump to the ELSE or JOIN part, and isolate
410      the test.  */
411   test_expr = cond_exec_get_condition (BB_END (test_bb));
412   if (! test_expr)
413     return FALSE;
414
415   /* If the conditional jump is more than just a conditional jump,
416      then we can not do conditional execution conversion on this block.  */
417   if (! onlyjump_p (BB_END (test_bb)))
418     return FALSE;
419
420   /* Collect the bounds of where we're to search, skipping any labels, jumps
421      and notes at the beginning and end of the block.  Then count the total
422      number of insns and see if it is small enough to convert.  */
423   then_start = first_active_insn (then_bb);
424   then_end = last_active_insn (then_bb, TRUE);
425   then_n_insns = ce_info->num_then_insns = count_bb_insns (then_bb);
426   n_insns = then_n_insns;
427   max = MAX_CONDITIONAL_EXECUTE;
428
429   if (else_bb)
430     {
431       int n_matching;
432
433       max *= 2;
434       else_start = first_active_insn (else_bb);
435       else_end = last_active_insn (else_bb, TRUE);
436       else_n_insns = ce_info->num_else_insns = count_bb_insns (else_bb);
437       n_insns += else_n_insns;
438
439       /* Look for matching sequences at the head and tail of the two blocks,
440          and limit the range of insns to be converted if possible.  */
441       n_matching = flow_find_cross_jump (then_bb, else_bb,
442                                          &then_first_tail, &else_first_tail);
443       if (then_first_tail == BB_HEAD (then_bb))
444         then_start = then_end = NULL_RTX;
445       if (else_first_tail == BB_HEAD (else_bb))
446         else_start = else_end = NULL_RTX;
447
448       if (n_matching > 0)
449         {
450           if (then_end)
451             then_end = prev_active_insn (then_first_tail);
452           if (else_end)
453             else_end = prev_active_insn (else_first_tail);
454           n_insns -= 2 * n_matching;
455         }
456
457       if (then_start && else_start)
458         {
459           int longest_match = MIN (then_n_insns - n_matching,
460                                    else_n_insns - n_matching);
461           n_matching
462             = flow_find_head_matching_sequence (then_bb, else_bb,
463                                                 &then_last_head,
464                                                 &else_last_head,
465                                                 longest_match);
466
467           if (n_matching > 0)
468             {
469               rtx insn;
470
471               /* We won't pass the insns in the head sequence to
472                  cond_exec_process_insns, so we need to test them here
473                  to make sure that they don't clobber the condition.  */
474               for (insn = BB_HEAD (then_bb);
475                    insn != NEXT_INSN (then_last_head);
476                    insn = NEXT_INSN (insn))
477                 if (!LABEL_P (insn) && !NOTE_P (insn)
478                     && !DEBUG_INSN_P (insn)
479                     && modified_in_p (test_expr, insn))
480                   return FALSE;
481             }
482
483           if (then_last_head == then_end)
484             then_start = then_end = NULL_RTX;
485           if (else_last_head == else_end)
486             else_start = else_end = NULL_RTX;
487
488           if (n_matching > 0)
489             {
490               if (then_start)
491                 then_start = next_active_insn (then_last_head);
492               if (else_start)
493                 else_start = next_active_insn (else_last_head);
494               n_insns -= 2 * n_matching;
495             }
496         }
497     }
498
499   if (n_insns > max)
500     return FALSE;
501
502   /* Map test_expr/test_jump into the appropriate MD tests to use on
503      the conditionally executed code.  */
504
505   true_expr = test_expr;
506
507   false_code = reversed_comparison_code (true_expr, BB_END (test_bb));
508   if (false_code != UNKNOWN)
509     false_expr = gen_rtx_fmt_ee (false_code, GET_MODE (true_expr),
510                                  XEXP (true_expr, 0), XEXP (true_expr, 1));
511   else
512     false_expr = NULL_RTX;
513
514 #ifdef IFCVT_MODIFY_TESTS
515   /* If the machine description needs to modify the tests, such as setting a
516      conditional execution register from a comparison, it can do so here.  */
517   IFCVT_MODIFY_TESTS (ce_info, true_expr, false_expr);
518
519   /* See if the conversion failed.  */
520   if (!true_expr || !false_expr)
521     goto fail;
522 #endif
523
524   true_prob_val = find_reg_note (BB_END (test_bb), REG_BR_PROB, NULL_RTX);
525   if (true_prob_val)
526     {
527       true_prob_val = XEXP (true_prob_val, 0);
528       false_prob_val = GEN_INT (REG_BR_PROB_BASE - INTVAL (true_prob_val));
529     }
530   else
531     false_prob_val = NULL_RTX;
532
533   /* If we have && or || tests, do them here.  These tests are in the adjacent
534      blocks after the first block containing the test.  */
535   if (ce_info->num_multiple_test_blocks > 0)
536     {
537       basic_block bb = test_bb;
538       basic_block last_test_bb = ce_info->last_test_bb;
539
540       if (! false_expr)
541         goto fail;
542
543       do
544         {
545           rtx start, end;
546           rtx t, f;
547           enum rtx_code f_code;
548
549           bb = block_fallthru (bb);
550           start = first_active_insn (bb);
551           end = last_active_insn (bb, TRUE);
552           if (start
553               && ! cond_exec_process_insns (ce_info, start, end, false_expr,
554                                             false_prob_val, FALSE))
555             goto fail;
556
557           /* If the conditional jump is more than just a conditional jump, then
558              we can not do conditional execution conversion on this block.  */
559           if (! onlyjump_p (BB_END (bb)))
560             goto fail;
561
562           /* Find the conditional jump and isolate the test.  */
563           t = cond_exec_get_condition (BB_END (bb));
564           if (! t)
565             goto fail;
566
567           f_code = reversed_comparison_code (t, BB_END (bb));
568           if (f_code == UNKNOWN)
569             goto fail;
570
571           f = gen_rtx_fmt_ee (f_code, GET_MODE (t), XEXP (t, 0), XEXP (t, 1));
572           if (ce_info->and_and_p)
573             {
574               t = gen_rtx_AND (GET_MODE (t), true_expr, t);
575               f = gen_rtx_IOR (GET_MODE (t), false_expr, f);
576             }
577           else
578             {
579               t = gen_rtx_IOR (GET_MODE (t), true_expr, t);
580               f = gen_rtx_AND (GET_MODE (t), false_expr, f);
581             }
582
583           /* If the machine description needs to modify the tests, such as
584              setting a conditional execution register from a comparison, it can
585              do so here.  */
586 #ifdef IFCVT_MODIFY_MULTIPLE_TESTS
587           IFCVT_MODIFY_MULTIPLE_TESTS (ce_info, bb, t, f);
588
589           /* See if the conversion failed.  */
590           if (!t || !f)
591             goto fail;
592 #endif
593
594           true_expr = t;
595           false_expr = f;
596         }
597       while (bb != last_test_bb);
598     }
599
600   /* For IF-THEN-ELSE blocks, we don't allow modifications of the test
601      on then THEN block.  */
602   then_mod_ok = (else_bb == NULL_BLOCK);
603
604   /* Go through the THEN and ELSE blocks converting the insns if possible
605      to conditional execution.  */
606
607   if (then_end
608       && (! false_expr
609           || ! cond_exec_process_insns (ce_info, then_start, then_end,
610                                         false_expr, false_prob_val,
611                                         then_mod_ok)))
612     goto fail;
613
614   if (else_bb && else_end
615       && ! cond_exec_process_insns (ce_info, else_start, else_end,
616                                     true_expr, true_prob_val, TRUE))
617     goto fail;
618
619   /* If we cannot apply the changes, fail.  Do not go through the normal fail
620      processing, since apply_change_group will call cancel_changes.  */
621   if (! apply_change_group ())
622     {
623 #ifdef IFCVT_MODIFY_CANCEL
624       /* Cancel any machine dependent changes.  */
625       IFCVT_MODIFY_CANCEL (ce_info);
626 #endif
627       return FALSE;
628     }
629
630 #ifdef IFCVT_MODIFY_FINAL
631   /* Do any machine dependent final modifications.  */
632   IFCVT_MODIFY_FINAL (ce_info);
633 #endif
634
635   /* Conversion succeeded.  */
636   if (dump_file)
637     fprintf (dump_file, "%d insn%s converted to conditional execution.\n",
638              n_insns, (n_insns == 1) ? " was" : "s were");
639
640   /* Merge the blocks!  If we had matching sequences, make sure to delete one
641      copy at the appropriate location first: delete the copy in the THEN branch
642      for a tail sequence so that the remaining one is executed last for both
643      branches, and delete the copy in the ELSE branch for a head sequence so
644      that the remaining one is executed first for both branches.  */
645   if (then_first_tail)
646     {
647       rtx from = then_first_tail;
648       if (!INSN_P (from))
649         from = next_active_insn (from);
650       delete_insn_chain (from, BB_END (then_bb), false);
651     }
652   if (else_last_head)
653     delete_insn_chain (first_active_insn (else_bb), else_last_head, false);
654
655   merge_if_block (ce_info);
656   cond_exec_changed_p = TRUE;
657   return TRUE;
658
659  fail:
660 #ifdef IFCVT_MODIFY_CANCEL
661   /* Cancel any machine dependent changes.  */
662   IFCVT_MODIFY_CANCEL (ce_info);
663 #endif
664
665   cancel_changes (0);
666   return FALSE;
667 }
668 \f
669 /* Used by noce_process_if_block to communicate with its subroutines.
670
671    The subroutines know that A and B may be evaluated freely.  They
672    know that X is a register.  They should insert new instructions
673    before cond_earliest.  */
674
675 struct noce_if_info
676 {
677   /* The basic blocks that make up the IF-THEN-{ELSE-,}JOIN block.  */
678   basic_block test_bb, then_bb, else_bb, join_bb;
679
680   /* The jump that ends TEST_BB.  */
681   rtx jump;
682
683   /* The jump condition.  */
684   rtx cond;
685
686   /* New insns should be inserted before this one.  */
687   rtx cond_earliest;
688
689   /* Insns in the THEN and ELSE block.  There is always just this
690      one insns in those blocks.  The insns are single_set insns.
691      If there was no ELSE block, INSN_B is the last insn before
692      COND_EARLIEST, or NULL_RTX.  In the former case, the insn
693      operands are still valid, as if INSN_B was moved down below
694      the jump.  */
695   rtx insn_a, insn_b;
696
697   /* The SET_SRC of INSN_A and INSN_B.  */
698   rtx a, b;
699
700   /* The SET_DEST of INSN_A.  */
701   rtx x;
702
703   /* True if this if block is not canonical.  In the canonical form of
704      if blocks, the THEN_BB is the block reached via the fallthru edge
705      from TEST_BB.  For the noce transformations, we allow the symmetric
706      form as well.  */
707   bool then_else_reversed;
708
709   /* Estimated cost of the particular branch instruction.  */
710   int branch_cost;
711 };
712
713 static rtx noce_emit_store_flag (struct noce_if_info *, rtx, int, int);
714 static int noce_try_move (struct noce_if_info *);
715 static int noce_try_store_flag (struct noce_if_info *);
716 static int noce_try_addcc (struct noce_if_info *);
717 static int noce_try_store_flag_constants (struct noce_if_info *);
718 static int noce_try_store_flag_mask (struct noce_if_info *);
719 static rtx noce_emit_cmove (struct noce_if_info *, rtx, enum rtx_code, rtx,
720                             rtx, rtx, rtx);
721 static int noce_try_cmove (struct noce_if_info *);
722 static int noce_try_cmove_arith (struct noce_if_info *);
723 static rtx noce_get_alt_condition (struct noce_if_info *, rtx, rtx *);
724 static int noce_try_minmax (struct noce_if_info *);
725 static int noce_try_abs (struct noce_if_info *);
726 static int noce_try_sign_mask (struct noce_if_info *);
727
728 /* Helper function for noce_try_store_flag*.  */
729
730 static rtx
731 noce_emit_store_flag (struct noce_if_info *if_info, rtx x, int reversep,
732                       int normalize)
733 {
734   rtx cond = if_info->cond;
735   int cond_complex;
736   enum rtx_code code;
737
738   cond_complex = (! general_operand (XEXP (cond, 0), VOIDmode)
739                   || ! general_operand (XEXP (cond, 1), VOIDmode));
740
741   /* If earliest == jump, or when the condition is complex, try to
742      build the store_flag insn directly.  */
743
744   if (cond_complex)
745     {
746       rtx set = pc_set (if_info->jump);
747       cond = XEXP (SET_SRC (set), 0);
748       if (GET_CODE (XEXP (SET_SRC (set), 2)) == LABEL_REF
749           && XEXP (XEXP (SET_SRC (set), 2), 0) == JUMP_LABEL (if_info->jump))
750         reversep = !reversep;
751       if (if_info->then_else_reversed)
752         reversep = !reversep;
753     }
754
755   if (reversep)
756     code = reversed_comparison_code (cond, if_info->jump);
757   else
758     code = GET_CODE (cond);
759
760   if ((if_info->cond_earliest == if_info->jump || cond_complex)
761       && (normalize == 0 || STORE_FLAG_VALUE == normalize))
762     {
763       rtx tmp;
764
765       tmp = gen_rtx_fmt_ee (code, GET_MODE (x), XEXP (cond, 0),
766                             XEXP (cond, 1));
767       tmp = gen_rtx_SET (VOIDmode, x, tmp);
768
769       start_sequence ();
770       tmp = emit_insn (tmp);
771
772       if (recog_memoized (tmp) >= 0)
773         {
774           tmp = get_insns ();
775           end_sequence ();
776           emit_insn (tmp);
777
778           if_info->cond_earliest = if_info->jump;
779
780           return x;
781         }
782
783       end_sequence ();
784     }
785
786   /* Don't even try if the comparison operands or the mode of X are weird.  */
787   if (cond_complex || !SCALAR_INT_MODE_P (GET_MODE (x)))
788     return NULL_RTX;
789
790   return emit_store_flag (x, code, XEXP (cond, 0),
791                           XEXP (cond, 1), VOIDmode,
792                           (code == LTU || code == LEU
793                            || code == GEU || code == GTU), normalize);
794 }
795
796 /* Emit instruction to move an rtx, possibly into STRICT_LOW_PART.
797    X is the destination/target and Y is the value to copy.  */
798
799 static void
800 noce_emit_move_insn (rtx x, rtx y)
801 {
802   enum machine_mode outmode;
803   rtx outer, inner;
804   int bitpos;
805
806   if (GET_CODE (x) != STRICT_LOW_PART)
807     {
808       rtx seq, insn, target;
809       optab ot;
810
811       start_sequence ();
812       /* Check that the SET_SRC is reasonable before calling emit_move_insn,
813          otherwise construct a suitable SET pattern ourselves.  */
814       insn = (OBJECT_P (y) || CONSTANT_P (y) || GET_CODE (y) == SUBREG)
815              ? emit_move_insn (x, y)
816              : emit_insn (gen_rtx_SET (VOIDmode, x, y));
817       seq = get_insns ();
818       end_sequence ();
819
820       if (recog_memoized (insn) <= 0)
821         {
822           if (GET_CODE (x) == ZERO_EXTRACT)
823             {
824               rtx op = XEXP (x, 0);
825               unsigned HOST_WIDE_INT size = INTVAL (XEXP (x, 1));
826               unsigned HOST_WIDE_INT start = INTVAL (XEXP (x, 2));
827
828               /* store_bit_field expects START to be relative to
829                  BYTES_BIG_ENDIAN and adjusts this value for machines with
830                  BITS_BIG_ENDIAN != BYTES_BIG_ENDIAN.  In order to be able to
831                  invoke store_bit_field again it is necessary to have the START
832                  value from the first call.  */
833               if (BITS_BIG_ENDIAN != BYTES_BIG_ENDIAN)
834                 {
835                   if (MEM_P (op))
836                     start = BITS_PER_UNIT - start - size;
837                   else
838                     {
839                       gcc_assert (REG_P (op));
840                       start = BITS_PER_WORD - start - size;
841                     }
842                 }
843
844               gcc_assert (start < (MEM_P (op) ? BITS_PER_UNIT : BITS_PER_WORD));
845               store_bit_field (op, size, start, GET_MODE (x), y);
846               return;
847             }
848
849           switch (GET_RTX_CLASS (GET_CODE (y)))
850             {
851             case RTX_UNARY:
852               ot = code_to_optab[GET_CODE (y)];
853               if (ot)
854                 {
855                   start_sequence ();
856                   target = expand_unop (GET_MODE (y), ot, XEXP (y, 0), x, 0);
857                   if (target != NULL_RTX)
858                     {
859                       if (target != x)
860                         emit_move_insn (x, target);
861                       seq = get_insns ();
862                     }
863                   end_sequence ();
864                 }
865               break;
866
867             case RTX_BIN_ARITH:
868             case RTX_COMM_ARITH:
869               ot = code_to_optab[GET_CODE (y)];
870               if (ot)
871                 {
872                   start_sequence ();
873                   target = expand_binop (GET_MODE (y), ot,
874                                          XEXP (y, 0), XEXP (y, 1),
875                                          x, 0, OPTAB_DIRECT);
876                   if (target != NULL_RTX)
877                     {
878                       if (target != x)
879                           emit_move_insn (x, target);
880                       seq = get_insns ();
881                     }
882                   end_sequence ();
883                 }
884               break;
885
886             default:
887               break;
888             }
889         }
890
891       emit_insn (seq);
892       return;
893     }
894
895   outer = XEXP (x, 0);
896   inner = XEXP (outer, 0);
897   outmode = GET_MODE (outer);
898   bitpos = SUBREG_BYTE (outer) * BITS_PER_UNIT;
899   store_bit_field (inner, GET_MODE_BITSIZE (outmode), bitpos, outmode, y);
900 }
901
902 /* Return sequence of instructions generated by if conversion.  This
903    function calls end_sequence() to end the current stream, ensures
904    that are instructions are unshared, recognizable non-jump insns.
905    On failure, this function returns a NULL_RTX.  */
906
907 static rtx
908 end_ifcvt_sequence (struct noce_if_info *if_info)
909 {
910   rtx insn;
911   rtx seq = get_insns ();
912
913   set_used_flags (if_info->x);
914   set_used_flags (if_info->cond);
915   unshare_all_rtl_in_chain (seq);
916   end_sequence ();
917
918   /* Make sure that all of the instructions emitted are recognizable,
919      and that we haven't introduced a new jump instruction.
920      As an exercise for the reader, build a general mechanism that
921      allows proper placement of required clobbers.  */
922   for (insn = seq; insn; insn = NEXT_INSN (insn))
923     if (JUMP_P (insn)
924         || recog_memoized (insn) == -1)
925       return NULL_RTX;
926
927   return seq;
928 }
929
930 /* Convert "if (a != b) x = a; else x = b" into "x = a" and
931    "if (a == b) x = a; else x = b" into "x = b".  */
932
933 static int
934 noce_try_move (struct noce_if_info *if_info)
935 {
936   rtx cond = if_info->cond;
937   enum rtx_code code = GET_CODE (cond);
938   rtx y, seq;
939
940   if (code != NE && code != EQ)
941     return FALSE;
942
943   /* This optimization isn't valid if either A or B could be a NaN
944      or a signed zero.  */
945   if (HONOR_NANS (GET_MODE (if_info->x))
946       || HONOR_SIGNED_ZEROS (GET_MODE (if_info->x)))
947     return FALSE;
948
949   /* Check whether the operands of the comparison are A and in
950      either order.  */
951   if ((rtx_equal_p (if_info->a, XEXP (cond, 0))
952        && rtx_equal_p (if_info->b, XEXP (cond, 1)))
953       || (rtx_equal_p (if_info->a, XEXP (cond, 1))
954           && rtx_equal_p (if_info->b, XEXP (cond, 0))))
955     {
956       y = (code == EQ) ? if_info->a : if_info->b;
957
958       /* Avoid generating the move if the source is the destination.  */
959       if (! rtx_equal_p (if_info->x, y))
960         {
961           start_sequence ();
962           noce_emit_move_insn (if_info->x, y);
963           seq = end_ifcvt_sequence (if_info);
964           if (!seq)
965             return FALSE;
966
967           emit_insn_before_setloc (seq, if_info->jump,
968                                    INSN_LOCATOR (if_info->insn_a));
969         }
970       return TRUE;
971     }
972   return FALSE;
973 }
974
975 /* Convert "if (test) x = 1; else x = 0".
976
977    Only try 0 and STORE_FLAG_VALUE here.  Other combinations will be
978    tried in noce_try_store_flag_constants after noce_try_cmove has had
979    a go at the conversion.  */
980
981 static int
982 noce_try_store_flag (struct noce_if_info *if_info)
983 {
984   int reversep;
985   rtx target, seq;
986
987   if (CONST_INT_P (if_info->b)
988       && INTVAL (if_info->b) == STORE_FLAG_VALUE
989       && if_info->a == const0_rtx)
990     reversep = 0;
991   else if (if_info->b == const0_rtx
992            && CONST_INT_P (if_info->a)
993            && INTVAL (if_info->a) == STORE_FLAG_VALUE
994            && (reversed_comparison_code (if_info->cond, if_info->jump)
995                != UNKNOWN))
996     reversep = 1;
997   else
998     return FALSE;
999
1000   start_sequence ();
1001
1002   target = noce_emit_store_flag (if_info, if_info->x, reversep, 0);
1003   if (target)
1004     {
1005       if (target != if_info->x)
1006         noce_emit_move_insn (if_info->x, target);
1007
1008       seq = end_ifcvt_sequence (if_info);
1009       if (! seq)
1010         return FALSE;
1011
1012       emit_insn_before_setloc (seq, if_info->jump,
1013                                INSN_LOCATOR (if_info->insn_a));
1014       return TRUE;
1015     }
1016   else
1017     {
1018       end_sequence ();
1019       return FALSE;
1020     }
1021 }
1022
1023 /* Convert "if (test) x = a; else x = b", for A and B constant.  */
1024
1025 static int
1026 noce_try_store_flag_constants (struct noce_if_info *if_info)
1027 {
1028   rtx target, seq;
1029   int reversep;
1030   HOST_WIDE_INT itrue, ifalse, diff, tmp;
1031   int normalize, can_reverse;
1032   enum machine_mode mode;
1033
1034   if (CONST_INT_P (if_info->a)
1035       && CONST_INT_P (if_info->b))
1036     {
1037       mode = GET_MODE (if_info->x);
1038       ifalse = INTVAL (if_info->a);
1039       itrue = INTVAL (if_info->b);
1040
1041       /* Make sure we can represent the difference between the two values.  */
1042       if ((itrue - ifalse > 0)
1043           != ((ifalse < 0) != (itrue < 0) ? ifalse < 0 : ifalse < itrue))
1044         return FALSE;
1045
1046       diff = trunc_int_for_mode (itrue - ifalse, mode);
1047
1048       can_reverse = (reversed_comparison_code (if_info->cond, if_info->jump)
1049                      != UNKNOWN);
1050
1051       reversep = 0;
1052       if (diff == STORE_FLAG_VALUE || diff == -STORE_FLAG_VALUE)
1053         normalize = 0;
1054       else if (ifalse == 0 && exact_log2 (itrue) >= 0
1055                && (STORE_FLAG_VALUE == 1
1056                    || if_info->branch_cost >= 2))
1057         normalize = 1;
1058       else if (itrue == 0 && exact_log2 (ifalse) >= 0 && can_reverse
1059                && (STORE_FLAG_VALUE == 1 || if_info->branch_cost >= 2))
1060         normalize = 1, reversep = 1;
1061       else if (itrue == -1
1062                && (STORE_FLAG_VALUE == -1
1063                    || if_info->branch_cost >= 2))
1064         normalize = -1;
1065       else if (ifalse == -1 && can_reverse
1066                && (STORE_FLAG_VALUE == -1 || if_info->branch_cost >= 2))
1067         normalize = -1, reversep = 1;
1068       else if ((if_info->branch_cost >= 2 && STORE_FLAG_VALUE == -1)
1069                || if_info->branch_cost >= 3)
1070         normalize = -1;
1071       else
1072         return FALSE;
1073
1074       if (reversep)
1075         {
1076           tmp = itrue; itrue = ifalse; ifalse = tmp;
1077           diff = trunc_int_for_mode (-diff, mode);
1078         }
1079
1080       start_sequence ();
1081       target = noce_emit_store_flag (if_info, if_info->x, reversep, normalize);
1082       if (! target)
1083         {
1084           end_sequence ();
1085           return FALSE;
1086         }
1087
1088       /* if (test) x = 3; else x = 4;
1089          =>   x = 3 + (test == 0);  */
1090       if (diff == STORE_FLAG_VALUE || diff == -STORE_FLAG_VALUE)
1091         {
1092           target = expand_simple_binop (mode,
1093                                         (diff == STORE_FLAG_VALUE
1094                                          ? PLUS : MINUS),
1095                                         GEN_INT (ifalse), target, if_info->x, 0,
1096                                         OPTAB_WIDEN);
1097         }
1098
1099       /* if (test) x = 8; else x = 0;
1100          =>   x = (test != 0) << 3;  */
1101       else if (ifalse == 0 && (tmp = exact_log2 (itrue)) >= 0)
1102         {
1103           target = expand_simple_binop (mode, ASHIFT,
1104                                         target, GEN_INT (tmp), if_info->x, 0,
1105                                         OPTAB_WIDEN);
1106         }
1107
1108       /* if (test) x = -1; else x = b;
1109          =>   x = -(test != 0) | b;  */
1110       else if (itrue == -1)
1111         {
1112           target = expand_simple_binop (mode, IOR,
1113                                         target, GEN_INT (ifalse), if_info->x, 0,
1114                                         OPTAB_WIDEN);
1115         }
1116
1117       /* if (test) x = a; else x = b;
1118          =>   x = (-(test != 0) & (b - a)) + a;  */
1119       else
1120         {
1121           target = expand_simple_binop (mode, AND,
1122                                         target, GEN_INT (diff), if_info->x, 0,
1123                                         OPTAB_WIDEN);
1124           if (target)
1125             target = expand_simple_binop (mode, PLUS,
1126                                           target, GEN_INT (ifalse),
1127                                           if_info->x, 0, OPTAB_WIDEN);
1128         }
1129
1130       if (! target)
1131         {
1132           end_sequence ();
1133           return FALSE;
1134         }
1135
1136       if (target != if_info->x)
1137         noce_emit_move_insn (if_info->x, target);
1138
1139       seq = end_ifcvt_sequence (if_info);
1140       if (!seq)
1141         return FALSE;
1142
1143       emit_insn_before_setloc (seq, if_info->jump,
1144                                INSN_LOCATOR (if_info->insn_a));
1145       return TRUE;
1146     }
1147
1148   return FALSE;
1149 }
1150
1151 /* Convert "if (test) foo++" into "foo += (test != 0)", and
1152    similarly for "foo--".  */
1153
1154 static int
1155 noce_try_addcc (struct noce_if_info *if_info)
1156 {
1157   rtx target, seq;
1158   int subtract, normalize;
1159
1160   if (GET_CODE (if_info->a) == PLUS
1161       && rtx_equal_p (XEXP (if_info->a, 0), if_info->b)
1162       && (reversed_comparison_code (if_info->cond, if_info->jump)
1163           != UNKNOWN))
1164     {
1165       rtx cond = if_info->cond;
1166       enum rtx_code code = reversed_comparison_code (cond, if_info->jump);
1167
1168       /* First try to use addcc pattern.  */
1169       if (general_operand (XEXP (cond, 0), VOIDmode)
1170           && general_operand (XEXP (cond, 1), VOIDmode))
1171         {
1172           start_sequence ();
1173           target = emit_conditional_add (if_info->x, code,
1174                                          XEXP (cond, 0),
1175                                          XEXP (cond, 1),
1176                                          VOIDmode,
1177                                          if_info->b,
1178                                          XEXP (if_info->a, 1),
1179                                          GET_MODE (if_info->x),
1180                                          (code == LTU || code == GEU
1181                                           || code == LEU || code == GTU));
1182           if (target)
1183             {
1184               if (target != if_info->x)
1185                 noce_emit_move_insn (if_info->x, target);
1186
1187               seq = end_ifcvt_sequence (if_info);
1188               if (!seq)
1189                 return FALSE;
1190
1191               emit_insn_before_setloc (seq, if_info->jump,
1192                                        INSN_LOCATOR (if_info->insn_a));
1193               return TRUE;
1194             }
1195           end_sequence ();
1196         }
1197
1198       /* If that fails, construct conditional increment or decrement using
1199          setcc.  */
1200       if (if_info->branch_cost >= 2
1201           && (XEXP (if_info->a, 1) == const1_rtx
1202               || XEXP (if_info->a, 1) == constm1_rtx))
1203         {
1204           start_sequence ();
1205           if (STORE_FLAG_VALUE == INTVAL (XEXP (if_info->a, 1)))
1206             subtract = 0, normalize = 0;
1207           else if (-STORE_FLAG_VALUE == INTVAL (XEXP (if_info->a, 1)))
1208             subtract = 1, normalize = 0;
1209           else
1210             subtract = 0, normalize = INTVAL (XEXP (if_info->a, 1));
1211
1212
1213           target = noce_emit_store_flag (if_info,
1214                                          gen_reg_rtx (GET_MODE (if_info->x)),
1215                                          1, normalize);
1216
1217           if (target)
1218             target = expand_simple_binop (GET_MODE (if_info->x),
1219                                           subtract ? MINUS : PLUS,
1220                                           if_info->b, target, if_info->x,
1221                                           0, OPTAB_WIDEN);
1222           if (target)
1223             {
1224               if (target != if_info->x)
1225                 noce_emit_move_insn (if_info->x, target);
1226
1227               seq = end_ifcvt_sequence (if_info);
1228               if (!seq)
1229                 return FALSE;
1230
1231               emit_insn_before_setloc (seq, if_info->jump,
1232                                        INSN_LOCATOR (if_info->insn_a));
1233               return TRUE;
1234             }
1235           end_sequence ();
1236         }
1237     }
1238
1239   return FALSE;
1240 }
1241
1242 /* Convert "if (test) x = 0;" to "x &= -(test == 0);"  */
1243
1244 static int
1245 noce_try_store_flag_mask (struct noce_if_info *if_info)
1246 {
1247   rtx target, seq;
1248   int reversep;
1249
1250   reversep = 0;
1251   if ((if_info->branch_cost >= 2
1252        || STORE_FLAG_VALUE == -1)
1253       && ((if_info->a == const0_rtx
1254            && rtx_equal_p (if_info->b, if_info->x))
1255           || ((reversep = (reversed_comparison_code (if_info->cond,
1256                                                      if_info->jump)
1257                            != UNKNOWN))
1258               && if_info->b == const0_rtx
1259               && rtx_equal_p (if_info->a, if_info->x))))
1260     {
1261       start_sequence ();
1262       target = noce_emit_store_flag (if_info,
1263                                      gen_reg_rtx (GET_MODE (if_info->x)),
1264                                      reversep, -1);
1265       if (target)
1266         target = expand_simple_binop (GET_MODE (if_info->x), AND,
1267                                       if_info->x,
1268                                       target, if_info->x, 0,
1269                                       OPTAB_WIDEN);
1270
1271       if (target)
1272         {
1273           if (target != if_info->x)
1274             noce_emit_move_insn (if_info->x, target);
1275
1276           seq = end_ifcvt_sequence (if_info);
1277           if (!seq)
1278             return FALSE;
1279
1280           emit_insn_before_setloc (seq, if_info->jump,
1281                                    INSN_LOCATOR (if_info->insn_a));
1282           return TRUE;
1283         }
1284
1285       end_sequence ();
1286     }
1287
1288   return FALSE;
1289 }
1290
1291 /* Helper function for noce_try_cmove and noce_try_cmove_arith.  */
1292
1293 static rtx
1294 noce_emit_cmove (struct noce_if_info *if_info, rtx x, enum rtx_code code,
1295                  rtx cmp_a, rtx cmp_b, rtx vfalse, rtx vtrue)
1296 {
1297   /* If earliest == jump, try to build the cmove insn directly.
1298      This is helpful when combine has created some complex condition
1299      (like for alpha's cmovlbs) that we can't hope to regenerate
1300      through the normal interface.  */
1301
1302   if (if_info->cond_earliest == if_info->jump)
1303     {
1304       rtx tmp;
1305
1306       tmp = gen_rtx_fmt_ee (code, GET_MODE (if_info->cond), cmp_a, cmp_b);
1307       tmp = gen_rtx_IF_THEN_ELSE (GET_MODE (x), tmp, vtrue, vfalse);
1308       tmp = gen_rtx_SET (VOIDmode, x, tmp);
1309
1310       start_sequence ();
1311       tmp = emit_insn (tmp);
1312
1313       if (recog_memoized (tmp) >= 0)
1314         {
1315           tmp = get_insns ();
1316           end_sequence ();
1317           emit_insn (tmp);
1318
1319           return x;
1320         }
1321
1322       end_sequence ();
1323     }
1324
1325   /* Don't even try if the comparison operands are weird.  */
1326   if (! general_operand (cmp_a, GET_MODE (cmp_a))
1327       || ! general_operand (cmp_b, GET_MODE (cmp_b)))
1328     return NULL_RTX;
1329
1330 #if HAVE_conditional_move
1331   return emit_conditional_move (x, code, cmp_a, cmp_b, VOIDmode,
1332                                 vtrue, vfalse, GET_MODE (x),
1333                                 (code == LTU || code == GEU
1334                                  || code == LEU || code == GTU));
1335 #else
1336   /* We'll never get here, as noce_process_if_block doesn't call the
1337      functions involved.  Ifdef code, however, should be discouraged
1338      because it leads to typos in the code not selected.  However,
1339      emit_conditional_move won't exist either.  */
1340   return NULL_RTX;
1341 #endif
1342 }
1343
1344 /* Try only simple constants and registers here.  More complex cases
1345    are handled in noce_try_cmove_arith after noce_try_store_flag_arith
1346    has had a go at it.  */
1347
1348 static int
1349 noce_try_cmove (struct noce_if_info *if_info)
1350 {
1351   enum rtx_code code;
1352   rtx target, seq;
1353
1354   if ((CONSTANT_P (if_info->a) || register_operand (if_info->a, VOIDmode))
1355       && (CONSTANT_P (if_info->b) || register_operand (if_info->b, VOIDmode)))
1356     {
1357       start_sequence ();
1358
1359       code = GET_CODE (if_info->cond);
1360       target = noce_emit_cmove (if_info, if_info->x, code,
1361                                 XEXP (if_info->cond, 0),
1362                                 XEXP (if_info->cond, 1),
1363                                 if_info->a, if_info->b);
1364
1365       if (target)
1366         {
1367           if (target != if_info->x)
1368             noce_emit_move_insn (if_info->x, target);
1369
1370           seq = end_ifcvt_sequence (if_info);
1371           if (!seq)
1372             return FALSE;
1373
1374           emit_insn_before_setloc (seq, if_info->jump,
1375                                    INSN_LOCATOR (if_info->insn_a));
1376           return TRUE;
1377         }
1378       else
1379         {
1380           end_sequence ();
1381           return FALSE;
1382         }
1383     }
1384
1385   return FALSE;
1386 }
1387
1388 /* Try more complex cases involving conditional_move.  */
1389
1390 static int
1391 noce_try_cmove_arith (struct noce_if_info *if_info)
1392 {
1393   rtx a = if_info->a;
1394   rtx b = if_info->b;
1395   rtx x = if_info->x;
1396   rtx orig_a, orig_b;
1397   rtx insn_a, insn_b;
1398   rtx tmp, target;
1399   int is_mem = 0;
1400   int insn_cost;
1401   enum rtx_code code;
1402
1403   /* A conditional move from two memory sources is equivalent to a
1404      conditional on their addresses followed by a load.  Don't do this
1405      early because it'll screw alias analysis.  Note that we've
1406      already checked for no side effects.  */
1407   /* ??? FIXME: Magic number 5.  */
1408   if (cse_not_expected
1409       && MEM_P (a) && MEM_P (b)
1410       && MEM_ADDR_SPACE (a) == MEM_ADDR_SPACE (b)
1411       && if_info->branch_cost >= 5)
1412     {
1413       enum machine_mode address_mode
1414         = targetm.addr_space.address_mode (MEM_ADDR_SPACE (a));
1415
1416       a = XEXP (a, 0);
1417       b = XEXP (b, 0);
1418       x = gen_reg_rtx (address_mode);
1419       is_mem = 1;
1420     }
1421
1422   /* ??? We could handle this if we knew that a load from A or B could
1423      not fault.  This is also true if we've already loaded
1424      from the address along the path from ENTRY.  */
1425   else if (may_trap_p (a) || may_trap_p (b))
1426     return FALSE;
1427
1428   /* if (test) x = a + b; else x = c - d;
1429      => y = a + b;
1430         x = c - d;
1431         if (test)
1432           x = y;
1433   */
1434
1435   code = GET_CODE (if_info->cond);
1436   insn_a = if_info->insn_a;
1437   insn_b = if_info->insn_b;
1438
1439   /* Total insn_rtx_cost should be smaller than branch cost.  Exit
1440      if insn_rtx_cost can't be estimated.  */
1441   if (insn_a)
1442     {
1443       insn_cost
1444         = insn_rtx_cost (PATTERN (insn_a),
1445                          optimize_bb_for_speed_p (BLOCK_FOR_INSN (insn_a)));
1446       if (insn_cost == 0 || insn_cost > COSTS_N_INSNS (if_info->branch_cost))
1447         return FALSE;
1448     }
1449   else
1450     insn_cost = 0;
1451
1452   if (insn_b)
1453     {
1454       insn_cost
1455         += insn_rtx_cost (PATTERN (insn_b),
1456                           optimize_bb_for_speed_p (BLOCK_FOR_INSN (insn_b)));
1457       if (insn_cost == 0 || insn_cost > COSTS_N_INSNS (if_info->branch_cost))
1458         return FALSE;
1459     }
1460
1461   /* Possibly rearrange operands to make things come out more natural.  */
1462   if (reversed_comparison_code (if_info->cond, if_info->jump) != UNKNOWN)
1463     {
1464       int reversep = 0;
1465       if (rtx_equal_p (b, x))
1466         reversep = 1;
1467       else if (general_operand (b, GET_MODE (b)))
1468         reversep = 1;
1469
1470       if (reversep)
1471         {
1472           code = reversed_comparison_code (if_info->cond, if_info->jump);
1473           tmp = a, a = b, b = tmp;
1474           tmp = insn_a, insn_a = insn_b, insn_b = tmp;
1475         }
1476     }
1477
1478   start_sequence ();
1479
1480   orig_a = a;
1481   orig_b = b;
1482
1483   /* If either operand is complex, load it into a register first.
1484      The best way to do this is to copy the original insn.  In this
1485      way we preserve any clobbers etc that the insn may have had.
1486      This is of course not possible in the IS_MEM case.  */
1487   if (! general_operand (a, GET_MODE (a)))
1488     {
1489       rtx set;
1490
1491       if (is_mem)
1492         {
1493           tmp = gen_reg_rtx (GET_MODE (a));
1494           tmp = emit_insn (gen_rtx_SET (VOIDmode, tmp, a));
1495         }
1496       else if (! insn_a)
1497         goto end_seq_and_fail;
1498       else
1499         {
1500           a = gen_reg_rtx (GET_MODE (a));
1501           tmp = copy_rtx (insn_a);
1502           set = single_set (tmp);
1503           SET_DEST (set) = a;
1504           tmp = emit_insn (PATTERN (tmp));
1505         }
1506       if (recog_memoized (tmp) < 0)
1507         goto end_seq_and_fail;
1508     }
1509   if (! general_operand (b, GET_MODE (b)))
1510     {
1511       rtx set, last;
1512
1513       if (is_mem)
1514         {
1515           tmp = gen_reg_rtx (GET_MODE (b));
1516           tmp = gen_rtx_SET (VOIDmode, tmp, b);
1517         }
1518       else if (! insn_b)
1519         goto end_seq_and_fail;
1520       else
1521         {
1522           b = gen_reg_rtx (GET_MODE (b));
1523           tmp = copy_rtx (insn_b);
1524           set = single_set (tmp);
1525           SET_DEST (set) = b;
1526           tmp = PATTERN (tmp);
1527         }
1528
1529       /* If insn to set up A clobbers any registers B depends on, try to
1530          swap insn that sets up A with the one that sets up B.  If even
1531          that doesn't help, punt.  */
1532       last = get_last_insn ();
1533       if (last && modified_in_p (orig_b, last))
1534         {
1535           tmp = emit_insn_before (tmp, get_insns ());
1536           if (modified_in_p (orig_a, tmp))
1537             goto end_seq_and_fail;
1538         }
1539       else
1540         tmp = emit_insn (tmp);
1541
1542       if (recog_memoized (tmp) < 0)
1543         goto end_seq_and_fail;
1544     }
1545
1546   target = noce_emit_cmove (if_info, x, code, XEXP (if_info->cond, 0),
1547                             XEXP (if_info->cond, 1), a, b);
1548
1549   if (! target)
1550     goto end_seq_and_fail;
1551
1552   /* If we're handling a memory for above, emit the load now.  */
1553   if (is_mem)
1554     {
1555       tmp = gen_rtx_MEM (GET_MODE (if_info->x), target);
1556
1557       /* Copy over flags as appropriate.  */
1558       if (MEM_VOLATILE_P (if_info->a) || MEM_VOLATILE_P (if_info->b))
1559         MEM_VOLATILE_P (tmp) = 1;
1560       if (MEM_IN_STRUCT_P (if_info->a) && MEM_IN_STRUCT_P (if_info->b))
1561         MEM_IN_STRUCT_P (tmp) = 1;
1562       if (MEM_SCALAR_P (if_info->a) && MEM_SCALAR_P (if_info->b))
1563         MEM_SCALAR_P (tmp) = 1;
1564       if (MEM_ALIAS_SET (if_info->a) == MEM_ALIAS_SET (if_info->b))
1565         set_mem_alias_set (tmp, MEM_ALIAS_SET (if_info->a));
1566       set_mem_align (tmp,
1567                      MIN (MEM_ALIGN (if_info->a), MEM_ALIGN (if_info->b)));
1568
1569       gcc_assert (MEM_ADDR_SPACE (if_info->a) == MEM_ADDR_SPACE (if_info->b));
1570       set_mem_addr_space (tmp, MEM_ADDR_SPACE (if_info->a));
1571
1572       noce_emit_move_insn (if_info->x, tmp);
1573     }
1574   else if (target != x)
1575     noce_emit_move_insn (x, target);
1576
1577   tmp = end_ifcvt_sequence (if_info);
1578   if (!tmp)
1579     return FALSE;
1580
1581   emit_insn_before_setloc (tmp, if_info->jump, INSN_LOCATOR (if_info->insn_a));
1582   return TRUE;
1583
1584  end_seq_and_fail:
1585   end_sequence ();
1586   return FALSE;
1587 }
1588
1589 /* For most cases, the simplified condition we found is the best
1590    choice, but this is not the case for the min/max/abs transforms.
1591    For these we wish to know that it is A or B in the condition.  */
1592
1593 static rtx
1594 noce_get_alt_condition (struct noce_if_info *if_info, rtx target,
1595                         rtx *earliest)
1596 {
1597   rtx cond, set, insn;
1598   int reverse;
1599
1600   /* If target is already mentioned in the known condition, return it.  */
1601   if (reg_mentioned_p (target, if_info->cond))
1602     {
1603       *earliest = if_info->cond_earliest;
1604       return if_info->cond;
1605     }
1606
1607   set = pc_set (if_info->jump);
1608   cond = XEXP (SET_SRC (set), 0);
1609   reverse
1610     = GET_CODE (XEXP (SET_SRC (set), 2)) == LABEL_REF
1611       && XEXP (XEXP (SET_SRC (set), 2), 0) == JUMP_LABEL (if_info->jump);
1612   if (if_info->then_else_reversed)
1613     reverse = !reverse;
1614
1615   /* If we're looking for a constant, try to make the conditional
1616      have that constant in it.  There are two reasons why it may
1617      not have the constant we want:
1618
1619      1. GCC may have needed to put the constant in a register, because
1620         the target can't compare directly against that constant.  For
1621         this case, we look for a SET immediately before the comparison
1622         that puts a constant in that register.
1623
1624      2. GCC may have canonicalized the conditional, for example
1625         replacing "if x < 4" with "if x <= 3".  We can undo that (or
1626         make equivalent types of changes) to get the constants we need
1627         if they're off by one in the right direction.  */
1628
1629   if (CONST_INT_P (target))
1630     {
1631       enum rtx_code code = GET_CODE (if_info->cond);
1632       rtx op_a = XEXP (if_info->cond, 0);
1633       rtx op_b = XEXP (if_info->cond, 1);
1634       rtx prev_insn;
1635
1636       /* First, look to see if we put a constant in a register.  */
1637       prev_insn = prev_nonnote_insn (if_info->cond_earliest);
1638       if (prev_insn
1639           && BLOCK_FOR_INSN (prev_insn)
1640              == BLOCK_FOR_INSN (if_info->cond_earliest)
1641           && INSN_P (prev_insn)
1642           && GET_CODE (PATTERN (prev_insn)) == SET)
1643         {
1644           rtx src = find_reg_equal_equiv_note (prev_insn);
1645           if (!src)
1646             src = SET_SRC (PATTERN (prev_insn));
1647           if (CONST_INT_P (src))
1648             {
1649               if (rtx_equal_p (op_a, SET_DEST (PATTERN (prev_insn))))
1650                 op_a = src;
1651               else if (rtx_equal_p (op_b, SET_DEST (PATTERN (prev_insn))))
1652                 op_b = src;
1653
1654               if (CONST_INT_P (op_a))
1655                 {
1656                   rtx tmp = op_a;
1657                   op_a = op_b;
1658                   op_b = tmp;
1659                   code = swap_condition (code);
1660                 }
1661             }
1662         }
1663
1664       /* Now, look to see if we can get the right constant by
1665          adjusting the conditional.  */
1666       if (CONST_INT_P (op_b))
1667         {
1668           HOST_WIDE_INT desired_val = INTVAL (target);
1669           HOST_WIDE_INT actual_val = INTVAL (op_b);
1670
1671           switch (code)
1672             {
1673             case LT:
1674               if (actual_val == desired_val + 1)
1675                 {
1676                   code = LE;
1677                   op_b = GEN_INT (desired_val);
1678                 }
1679               break;
1680             case LE:
1681               if (actual_val == desired_val - 1)
1682                 {
1683                   code = LT;
1684                   op_b = GEN_INT (desired_val);
1685                 }
1686               break;
1687             case GT:
1688               if (actual_val == desired_val - 1)
1689                 {
1690                   code = GE;
1691                   op_b = GEN_INT (desired_val);
1692                 }
1693               break;
1694             case GE:
1695               if (actual_val == desired_val + 1)
1696                 {
1697                   code = GT;
1698                   op_b = GEN_INT (desired_val);
1699                 }
1700               break;
1701             default:
1702               break;
1703             }
1704         }
1705
1706       /* If we made any changes, generate a new conditional that is
1707          equivalent to what we started with, but has the right
1708          constants in it.  */
1709       if (code != GET_CODE (if_info->cond)
1710           || op_a != XEXP (if_info->cond, 0)
1711           || op_b != XEXP (if_info->cond, 1))
1712         {
1713           cond = gen_rtx_fmt_ee (code, GET_MODE (cond), op_a, op_b);
1714           *earliest = if_info->cond_earliest;
1715           return cond;
1716         }
1717     }
1718
1719   cond = canonicalize_condition (if_info->jump, cond, reverse,
1720                                  earliest, target, false, true);
1721   if (! cond || ! reg_mentioned_p (target, cond))
1722     return NULL;
1723
1724   /* We almost certainly searched back to a different place.
1725      Need to re-verify correct lifetimes.  */
1726
1727   /* X may not be mentioned in the range (cond_earliest, jump].  */
1728   for (insn = if_info->jump; insn != *earliest; insn = PREV_INSN (insn))
1729     if (INSN_P (insn) && reg_overlap_mentioned_p (if_info->x, PATTERN (insn)))
1730       return NULL;
1731
1732   /* A and B may not be modified in the range [cond_earliest, jump).  */
1733   for (insn = *earliest; insn != if_info->jump; insn = NEXT_INSN (insn))
1734     if (INSN_P (insn)
1735         && (modified_in_p (if_info->a, insn)
1736             || modified_in_p (if_info->b, insn)))
1737       return NULL;
1738
1739   return cond;
1740 }
1741
1742 /* Convert "if (a < b) x = a; else x = b;" to "x = min(a, b);", etc.  */
1743
1744 static int
1745 noce_try_minmax (struct noce_if_info *if_info)
1746 {
1747   rtx cond, earliest, target, seq;
1748   enum rtx_code code, op;
1749   int unsignedp;
1750
1751   /* ??? Reject modes with NaNs or signed zeros since we don't know how
1752      they will be resolved with an SMIN/SMAX.  It wouldn't be too hard
1753      to get the target to tell us...  */
1754   if (HONOR_SIGNED_ZEROS (GET_MODE (if_info->x))
1755       || HONOR_NANS (GET_MODE (if_info->x)))
1756     return FALSE;
1757
1758   cond = noce_get_alt_condition (if_info, if_info->a, &earliest);
1759   if (!cond)
1760     return FALSE;
1761
1762   /* Verify the condition is of the form we expect, and canonicalize
1763      the comparison code.  */
1764   code = GET_CODE (cond);
1765   if (rtx_equal_p (XEXP (cond, 0), if_info->a))
1766     {
1767       if (! rtx_equal_p (XEXP (cond, 1), if_info->b))
1768         return FALSE;
1769     }
1770   else if (rtx_equal_p (XEXP (cond, 1), if_info->a))
1771     {
1772       if (! rtx_equal_p (XEXP (cond, 0), if_info->b))
1773         return FALSE;
1774       code = swap_condition (code);
1775     }
1776   else
1777     return FALSE;
1778
1779   /* Determine what sort of operation this is.  Note that the code is for
1780      a taken branch, so the code->operation mapping appears backwards.  */
1781   switch (code)
1782     {
1783     case LT:
1784     case LE:
1785     case UNLT:
1786     case UNLE:
1787       op = SMAX;
1788       unsignedp = 0;
1789       break;
1790     case GT:
1791     case GE:
1792     case UNGT:
1793     case UNGE:
1794       op = SMIN;
1795       unsignedp = 0;
1796       break;
1797     case LTU:
1798     case LEU:
1799       op = UMAX;
1800       unsignedp = 1;
1801       break;
1802     case GTU:
1803     case GEU:
1804       op = UMIN;
1805       unsignedp = 1;
1806       break;
1807     default:
1808       return FALSE;
1809     }
1810
1811   start_sequence ();
1812
1813   target = expand_simple_binop (GET_MODE (if_info->x), op,
1814                                 if_info->a, if_info->b,
1815                                 if_info->x, unsignedp, OPTAB_WIDEN);
1816   if (! target)
1817     {
1818       end_sequence ();
1819       return FALSE;
1820     }
1821   if (target != if_info->x)
1822     noce_emit_move_insn (if_info->x, target);
1823
1824   seq = end_ifcvt_sequence (if_info);
1825   if (!seq)
1826     return FALSE;
1827
1828   emit_insn_before_setloc (seq, if_info->jump, INSN_LOCATOR (if_info->insn_a));
1829   if_info->cond = cond;
1830   if_info->cond_earliest = earliest;
1831
1832   return TRUE;
1833 }
1834
1835 /* Convert "if (a < 0) x = -a; else x = a;" to "x = abs(a);",
1836    "if (a < 0) x = ~a; else x = a;" to "x = one_cmpl_abs(a);",
1837    etc.  */
1838
1839 static int
1840 noce_try_abs (struct noce_if_info *if_info)
1841 {
1842   rtx cond, earliest, target, seq, a, b, c;
1843   int negate;
1844   bool one_cmpl = false;
1845
1846   /* Reject modes with signed zeros.  */
1847   if (HONOR_SIGNED_ZEROS (GET_MODE (if_info->x)))
1848     return FALSE;
1849
1850   /* Recognize A and B as constituting an ABS or NABS.  The canonical
1851      form is a branch around the negation, taken when the object is the
1852      first operand of a comparison against 0 that evaluates to true.  */
1853   a = if_info->a;
1854   b = if_info->b;
1855   if (GET_CODE (a) == NEG && rtx_equal_p (XEXP (a, 0), b))
1856     negate = 0;
1857   else if (GET_CODE (b) == NEG && rtx_equal_p (XEXP (b, 0), a))
1858     {
1859       c = a; a = b; b = c;
1860       negate = 1;
1861     }
1862   else if (GET_CODE (a) == NOT && rtx_equal_p (XEXP (a, 0), b))
1863     {
1864       negate = 0;
1865       one_cmpl = true;
1866     }
1867   else if (GET_CODE (b) == NOT && rtx_equal_p (XEXP (b, 0), a))
1868     {
1869       c = a; a = b; b = c;
1870       negate = 1;
1871       one_cmpl = true;
1872     }
1873   else
1874     return FALSE;
1875
1876   cond = noce_get_alt_condition (if_info, b, &earliest);
1877   if (!cond)
1878     return FALSE;
1879
1880   /* Verify the condition is of the form we expect.  */
1881   if (rtx_equal_p (XEXP (cond, 0), b))
1882     c = XEXP (cond, 1);
1883   else if (rtx_equal_p (XEXP (cond, 1), b))
1884     {
1885       c = XEXP (cond, 0);
1886       negate = !negate;
1887     }
1888   else
1889     return FALSE;
1890
1891   /* Verify that C is zero.  Search one step backward for a
1892      REG_EQUAL note or a simple source if necessary.  */
1893   if (REG_P (c))
1894     {
1895       rtx set, insn = prev_nonnote_insn (earliest);
1896       if (insn
1897           && BLOCK_FOR_INSN (insn) == BLOCK_FOR_INSN (earliest)
1898           && (set = single_set (insn))
1899           && rtx_equal_p (SET_DEST (set), c))
1900         {
1901           rtx note = find_reg_equal_equiv_note (insn);
1902           if (note)
1903             c = XEXP (note, 0);
1904           else
1905             c = SET_SRC (set);
1906         }
1907       else
1908         return FALSE;
1909     }
1910   if (MEM_P (c)
1911       && GET_CODE (XEXP (c, 0)) == SYMBOL_REF
1912       && CONSTANT_POOL_ADDRESS_P (XEXP (c, 0)))
1913     c = get_pool_constant (XEXP (c, 0));
1914
1915   /* Work around funny ideas get_condition has wrt canonicalization.
1916      Note that these rtx constants are known to be CONST_INT, and
1917      therefore imply integer comparisons.  */
1918   if (c == constm1_rtx && GET_CODE (cond) == GT)
1919     ;
1920   else if (c == const1_rtx && GET_CODE (cond) == LT)
1921     ;
1922   else if (c != CONST0_RTX (GET_MODE (b)))
1923     return FALSE;
1924
1925   /* Determine what sort of operation this is.  */
1926   switch (GET_CODE (cond))
1927     {
1928     case LT:
1929     case LE:
1930     case UNLT:
1931     case UNLE:
1932       negate = !negate;
1933       break;
1934     case GT:
1935     case GE:
1936     case UNGT:
1937     case UNGE:
1938       break;
1939     default:
1940       return FALSE;
1941     }
1942
1943   start_sequence ();
1944   if (one_cmpl)
1945     target = expand_one_cmpl_abs_nojump (GET_MODE (if_info->x), b,
1946                                          if_info->x);
1947   else
1948     target = expand_abs_nojump (GET_MODE (if_info->x), b, if_info->x, 1);
1949
1950   /* ??? It's a quandary whether cmove would be better here, especially
1951      for integers.  Perhaps combine will clean things up.  */
1952   if (target && negate)
1953     {
1954       if (one_cmpl)
1955         target = expand_simple_unop (GET_MODE (target), NOT, target,
1956                                      if_info->x, 0);
1957       else
1958         target = expand_simple_unop (GET_MODE (target), NEG, target,
1959                                      if_info->x, 0);
1960     }
1961
1962   if (! target)
1963     {
1964       end_sequence ();
1965       return FALSE;
1966     }
1967
1968   if (target != if_info->x)
1969     noce_emit_move_insn (if_info->x, target);
1970
1971   seq = end_ifcvt_sequence (if_info);
1972   if (!seq)
1973     return FALSE;
1974
1975   emit_insn_before_setloc (seq, if_info->jump, INSN_LOCATOR (if_info->insn_a));
1976   if_info->cond = cond;
1977   if_info->cond_earliest = earliest;
1978
1979   return TRUE;
1980 }
1981
1982 /* Convert "if (m < 0) x = b; else x = 0;" to "x = (m >> C) & b;".  */
1983
1984 static int
1985 noce_try_sign_mask (struct noce_if_info *if_info)
1986 {
1987   rtx cond, t, m, c, seq;
1988   enum machine_mode mode;
1989   enum rtx_code code;
1990   bool t_unconditional;
1991
1992   cond = if_info->cond;
1993   code = GET_CODE (cond);
1994   m = XEXP (cond, 0);
1995   c = XEXP (cond, 1);
1996
1997   t = NULL_RTX;
1998   if (if_info->a == const0_rtx)
1999     {
2000       if ((code == LT && c == const0_rtx)
2001           || (code == LE && c == constm1_rtx))
2002         t = if_info->b;
2003     }
2004   else if (if_info->b == const0_rtx)
2005     {
2006       if ((code == GE && c == const0_rtx)
2007           || (code == GT && c == constm1_rtx))
2008         t = if_info->a;
2009     }
2010
2011   if (! t || side_effects_p (t))
2012     return FALSE;
2013
2014   /* We currently don't handle different modes.  */
2015   mode = GET_MODE (t);
2016   if (GET_MODE (m) != mode)
2017     return FALSE;
2018
2019   /* This is only profitable if T is unconditionally executed/evaluated in the
2020      original insn sequence or T is cheap.  The former happens if B is the
2021      non-zero (T) value and if INSN_B was taken from TEST_BB, or there was no
2022      INSN_B which can happen for e.g. conditional stores to memory.  For the
2023      cost computation use the block TEST_BB where the evaluation will end up
2024      after the transformation.  */
2025   t_unconditional =
2026     (t == if_info->b
2027      && (if_info->insn_b == NULL_RTX
2028          || BLOCK_FOR_INSN (if_info->insn_b) == if_info->test_bb));
2029   if (!(t_unconditional
2030         || (rtx_cost (t, SET, optimize_bb_for_speed_p (if_info->test_bb))
2031             < COSTS_N_INSNS (2))))
2032     return FALSE;
2033
2034   start_sequence ();
2035   /* Use emit_store_flag to generate "m < 0 ? -1 : 0" instead of expanding
2036      "(signed) m >> 31" directly.  This benefits targets with specialized
2037      insns to obtain the signmask, but still uses ashr_optab otherwise.  */
2038   m = emit_store_flag (gen_reg_rtx (mode), LT, m, const0_rtx, mode, 0, -1);
2039   t = m ? expand_binop (mode, and_optab, m, t, NULL_RTX, 0, OPTAB_DIRECT)
2040         : NULL_RTX;
2041
2042   if (!t)
2043     {
2044       end_sequence ();
2045       return FALSE;
2046     }
2047
2048   noce_emit_move_insn (if_info->x, t);
2049
2050   seq = end_ifcvt_sequence (if_info);
2051   if (!seq)
2052     return FALSE;
2053
2054   emit_insn_before_setloc (seq, if_info->jump, INSN_LOCATOR (if_info->insn_a));
2055   return TRUE;
2056 }
2057
2058
2059 /* Optimize away "if (x & C) x |= C" and similar bit manipulation
2060    transformations.  */
2061
2062 static int
2063 noce_try_bitop (struct noce_if_info *if_info)
2064 {
2065   rtx cond, x, a, result, seq;
2066   enum machine_mode mode;
2067   enum rtx_code code;
2068   int bitnum;
2069
2070   x = if_info->x;
2071   cond = if_info->cond;
2072   code = GET_CODE (cond);
2073
2074   /* Check for no else condition.  */
2075   if (! rtx_equal_p (x, if_info->b))
2076     return FALSE;
2077
2078   /* Check for a suitable condition.  */
2079   if (code != NE && code != EQ)
2080     return FALSE;
2081   if (XEXP (cond, 1) != const0_rtx)
2082     return FALSE;
2083   cond = XEXP (cond, 0);
2084
2085   /* ??? We could also handle AND here.  */
2086   if (GET_CODE (cond) == ZERO_EXTRACT)
2087     {
2088       if (XEXP (cond, 1) != const1_rtx
2089           || !CONST_INT_P (XEXP (cond, 2))
2090           || ! rtx_equal_p (x, XEXP (cond, 0)))
2091         return FALSE;
2092       bitnum = INTVAL (XEXP (cond, 2));
2093       mode = GET_MODE (x);
2094       if (BITS_BIG_ENDIAN)
2095         bitnum = GET_MODE_BITSIZE (mode) - 1 - bitnum;
2096       if (bitnum < 0 || bitnum >= HOST_BITS_PER_WIDE_INT)
2097         return FALSE;
2098     }
2099   else
2100     return FALSE;
2101
2102   a = if_info->a;
2103   if (GET_CODE (a) == IOR || GET_CODE (a) == XOR)
2104     {
2105       /* Check for "if (X & C) x = x op C".  */
2106       if (! rtx_equal_p (x, XEXP (a, 0))
2107           || !CONST_INT_P (XEXP (a, 1))
2108           || (INTVAL (XEXP (a, 1)) & GET_MODE_MASK (mode))
2109              != (unsigned HOST_WIDE_INT) 1 << bitnum)
2110         return FALSE;
2111
2112       /* if ((x & C) == 0) x |= C; is transformed to x |= C.   */
2113       /* if ((x & C) != 0) x |= C; is transformed to nothing.  */
2114       if (GET_CODE (a) == IOR)
2115         result = (code == NE) ? a : NULL_RTX;
2116       else if (code == NE)
2117         {
2118           /* if ((x & C) == 0) x ^= C; is transformed to x |= C.   */
2119           result = gen_int_mode ((HOST_WIDE_INT) 1 << bitnum, mode);
2120           result = simplify_gen_binary (IOR, mode, x, result);
2121         }
2122       else
2123         {
2124           /* if ((x & C) != 0) x ^= C; is transformed to x &= ~C.  */
2125           result = gen_int_mode (~((HOST_WIDE_INT) 1 << bitnum), mode);
2126           result = simplify_gen_binary (AND, mode, x, result);
2127         }
2128     }
2129   else if (GET_CODE (a) == AND)
2130     {
2131       /* Check for "if (X & C) x &= ~C".  */
2132       if (! rtx_equal_p (x, XEXP (a, 0))
2133           || !CONST_INT_P (XEXP (a, 1))
2134           || (INTVAL (XEXP (a, 1)) & GET_MODE_MASK (mode))
2135              != (~((HOST_WIDE_INT) 1 << bitnum) & GET_MODE_MASK (mode)))
2136         return FALSE;
2137
2138       /* if ((x & C) == 0) x &= ~C; is transformed to nothing.  */
2139       /* if ((x & C) != 0) x &= ~C; is transformed to x &= ~C.  */
2140       result = (code == EQ) ? a : NULL_RTX;
2141     }
2142   else
2143     return FALSE;
2144
2145   if (result)
2146     {
2147       start_sequence ();
2148       noce_emit_move_insn (x, result);
2149       seq = end_ifcvt_sequence (if_info);
2150       if (!seq)
2151         return FALSE;
2152
2153       emit_insn_before_setloc (seq, if_info->jump,
2154                                INSN_LOCATOR (if_info->insn_a));
2155     }
2156   return TRUE;
2157 }
2158
2159
2160 /* Similar to get_condition, only the resulting condition must be
2161    valid at JUMP, instead of at EARLIEST.
2162
2163    If THEN_ELSE_REVERSED is true, the fallthrough does not go to the
2164    THEN block of the caller, and we have to reverse the condition.  */
2165
2166 static rtx
2167 noce_get_condition (rtx jump, rtx *earliest, bool then_else_reversed)
2168 {
2169   rtx cond, set, tmp;
2170   bool reverse;
2171
2172   if (! any_condjump_p (jump))
2173     return NULL_RTX;
2174
2175   set = pc_set (jump);
2176
2177   /* If this branches to JUMP_LABEL when the condition is false,
2178      reverse the condition.  */
2179   reverse = (GET_CODE (XEXP (SET_SRC (set), 2)) == LABEL_REF
2180              && XEXP (XEXP (SET_SRC (set), 2), 0) == JUMP_LABEL (jump));
2181
2182   /* We may have to reverse because the caller's if block is not canonical,
2183      i.e. the THEN block isn't the fallthrough block for the TEST block
2184      (see find_if_header).  */
2185   if (then_else_reversed)
2186     reverse = !reverse;
2187
2188   /* If the condition variable is a register and is MODE_INT, accept it.  */
2189
2190   cond = XEXP (SET_SRC (set), 0);
2191   tmp = XEXP (cond, 0);
2192   if (REG_P (tmp) && GET_MODE_CLASS (GET_MODE (tmp)) == MODE_INT)
2193     {
2194       *earliest = jump;
2195
2196       if (reverse)
2197         cond = gen_rtx_fmt_ee (reverse_condition (GET_CODE (cond)),
2198                                GET_MODE (cond), tmp, XEXP (cond, 1));
2199       return cond;
2200     }
2201
2202   /* Otherwise, fall back on canonicalize_condition to do the dirty
2203      work of manipulating MODE_CC values and COMPARE rtx codes.  */
2204   return canonicalize_condition (jump, cond, reverse, earliest,
2205                                  NULL_RTX, false, true);
2206 }
2207
2208 /* Return true if OP is ok for if-then-else processing.  */
2209
2210 static int
2211 noce_operand_ok (const_rtx op)
2212 {
2213   /* We special-case memories, so handle any of them with
2214      no address side effects.  */
2215   if (MEM_P (op))
2216     return ! side_effects_p (XEXP (op, 0));
2217
2218   if (side_effects_p (op))
2219     return FALSE;
2220
2221   return ! may_trap_p (op);
2222 }
2223
2224 /* Return true if a write into MEM may trap or fault.  */
2225
2226 static bool
2227 noce_mem_write_may_trap_or_fault_p (const_rtx mem)
2228 {
2229   rtx addr;
2230
2231   if (MEM_READONLY_P (mem))
2232     return true;
2233
2234   if (may_trap_or_fault_p (mem))
2235     return true;
2236
2237   addr = XEXP (mem, 0);
2238
2239   /* Call target hook to avoid the effects of -fpic etc....  */
2240   addr = targetm.delegitimize_address (addr);
2241
2242   while (addr)
2243     switch (GET_CODE (addr))
2244       {
2245       case CONST:
2246       case PRE_DEC:
2247       case PRE_INC:
2248       case POST_DEC:
2249       case POST_INC:
2250       case POST_MODIFY:
2251         addr = XEXP (addr, 0);
2252         break;
2253       case LO_SUM:
2254       case PRE_MODIFY:
2255         addr = XEXP (addr, 1);
2256         break;
2257       case PLUS:
2258         if (CONST_INT_P (XEXP (addr, 1)))
2259           addr = XEXP (addr, 0);
2260         else
2261           return false;
2262         break;
2263       case LABEL_REF:
2264         return true;
2265       case SYMBOL_REF:
2266         if (SYMBOL_REF_DECL (addr)
2267             && decl_readonly_section (SYMBOL_REF_DECL (addr), 0))
2268           return true;
2269         return false;
2270       default:
2271         return false;
2272       }
2273
2274   return false;
2275 }
2276
2277 /* Return whether we can use store speculation for MEM.  TOP_BB is the
2278    basic block above the conditional block where we are considering
2279    doing the speculative store.  We look for whether MEM is set
2280    unconditionally later in the function.  */
2281
2282 static bool
2283 noce_can_store_speculate_p (basic_block top_bb, const_rtx mem)
2284 {
2285   basic_block dominator;
2286
2287   for (dominator = get_immediate_dominator (CDI_POST_DOMINATORS, top_bb);
2288        dominator != NULL;
2289        dominator = get_immediate_dominator (CDI_POST_DOMINATORS, dominator))
2290     {
2291       rtx insn;
2292
2293       FOR_BB_INSNS (dominator, insn)
2294         {
2295           /* If we see something that might be a memory barrier, we
2296              have to stop looking.  Even if the MEM is set later in
2297              the function, we still don't want to set it
2298              unconditionally before the barrier.  */
2299           if (INSN_P (insn)
2300               && (volatile_insn_p (PATTERN (insn))
2301                   || (CALL_P (insn) && (!RTL_CONST_CALL_P (insn)))))
2302             return false;
2303
2304           if (memory_modified_in_insn_p (mem, insn))
2305             return true;
2306           if (modified_in_p (XEXP (mem, 0), insn))
2307             return false;
2308
2309         }
2310     }
2311
2312   return false;
2313 }
2314
2315 /* Given a simple IF-THEN-JOIN or IF-THEN-ELSE-JOIN block, attempt to convert
2316    it without using conditional execution.  Return TRUE if we were successful
2317    at converting the block.  */
2318
2319 static int
2320 noce_process_if_block (struct noce_if_info *if_info)
2321 {
2322   basic_block test_bb = if_info->test_bb;       /* test block */
2323   basic_block then_bb = if_info->then_bb;       /* THEN */
2324   basic_block else_bb = if_info->else_bb;       /* ELSE or NULL */
2325   basic_block join_bb = if_info->join_bb;       /* JOIN */
2326   rtx jump = if_info->jump;
2327   rtx cond = if_info->cond;
2328   rtx insn_a, insn_b;
2329   rtx set_a, set_b;
2330   rtx orig_x, x, a, b;
2331
2332   /* We're looking for patterns of the form
2333
2334      (1) if (...) x = a; else x = b;
2335      (2) x = b; if (...) x = a;
2336      (3) if (...) x = a;   // as if with an initial x = x.
2337
2338      The later patterns require jumps to be more expensive.
2339
2340      ??? For future expansion, look for multiple X in such patterns.  */
2341
2342   /* Look for one of the potential sets.  */
2343   insn_a = first_active_insn (then_bb);
2344   if (! insn_a
2345       || insn_a != last_active_insn (then_bb, FALSE)
2346       || (set_a = single_set (insn_a)) == NULL_RTX)
2347     return FALSE;
2348
2349   x = SET_DEST (set_a);
2350   a = SET_SRC (set_a);
2351
2352   /* Look for the other potential set.  Make sure we've got equivalent
2353      destinations.  */
2354   /* ??? This is overconservative.  Storing to two different mems is
2355      as easy as conditionally computing the address.  Storing to a
2356      single mem merely requires a scratch memory to use as one of the
2357      destination addresses; often the memory immediately below the
2358      stack pointer is available for this.  */
2359   set_b = NULL_RTX;
2360   if (else_bb)
2361     {
2362       insn_b = first_active_insn (else_bb);
2363       if (! insn_b
2364           || insn_b != last_active_insn (else_bb, FALSE)
2365           || (set_b = single_set (insn_b)) == NULL_RTX
2366           || ! rtx_equal_p (x, SET_DEST (set_b)))
2367         return FALSE;
2368     }
2369   else
2370     {
2371       insn_b = prev_nonnote_nondebug_insn (if_info->cond_earliest);
2372       /* We're going to be moving the evaluation of B down from above
2373          COND_EARLIEST to JUMP.  Make sure the relevant data is still
2374          intact.  */
2375       if (! insn_b
2376           || BLOCK_FOR_INSN (insn_b) != BLOCK_FOR_INSN (if_info->cond_earliest)
2377           || !NONJUMP_INSN_P (insn_b)
2378           || (set_b = single_set (insn_b)) == NULL_RTX
2379           || ! rtx_equal_p (x, SET_DEST (set_b))
2380           || ! noce_operand_ok (SET_SRC (set_b))
2381           || reg_overlap_mentioned_p (x, SET_SRC (set_b))
2382           || modified_between_p (SET_SRC (set_b), insn_b, jump)
2383           /* Likewise with X.  In particular this can happen when
2384              noce_get_condition looks farther back in the instruction
2385              stream than one might expect.  */
2386           || reg_overlap_mentioned_p (x, cond)
2387           || reg_overlap_mentioned_p (x, a)
2388           || modified_between_p (x, insn_b, jump))
2389         insn_b = set_b = NULL_RTX;
2390     }
2391
2392   /* If x has side effects then only the if-then-else form is safe to
2393      convert.  But even in that case we would need to restore any notes
2394      (such as REG_INC) at then end.  That can be tricky if
2395      noce_emit_move_insn expands to more than one insn, so disable the
2396      optimization entirely for now if there are side effects.  */
2397   if (side_effects_p (x))
2398     return FALSE;
2399
2400   b = (set_b ? SET_SRC (set_b) : x);
2401
2402   /* Only operate on register destinations, and even then avoid extending
2403      the lifetime of hard registers on small register class machines.  */
2404   orig_x = x;
2405   if (!REG_P (x)
2406       || (HARD_REGISTER_P (x)
2407           && targetm.small_register_classes_for_mode_p (GET_MODE (x))))
2408     {
2409       if (GET_MODE (x) == BLKmode)
2410         return FALSE;
2411
2412       if (GET_CODE (x) == ZERO_EXTRACT
2413           && (!CONST_INT_P (XEXP (x, 1))
2414               || !CONST_INT_P (XEXP (x, 2))))
2415         return FALSE;
2416
2417       x = gen_reg_rtx (GET_MODE (GET_CODE (x) == STRICT_LOW_PART
2418                                  ? XEXP (x, 0) : x));
2419     }
2420
2421   /* Don't operate on sources that may trap or are volatile.  */
2422   if (! noce_operand_ok (a) || ! noce_operand_ok (b))
2423     return FALSE;
2424
2425  retry:
2426   /* Set up the info block for our subroutines.  */
2427   if_info->insn_a = insn_a;
2428   if_info->insn_b = insn_b;
2429   if_info->x = x;
2430   if_info->a = a;
2431   if_info->b = b;
2432
2433   /* Try optimizations in some approximation of a useful order.  */
2434   /* ??? Should first look to see if X is live incoming at all.  If it
2435      isn't, we don't need anything but an unconditional set.  */
2436
2437   /* Look and see if A and B are really the same.  Avoid creating silly
2438      cmove constructs that no one will fix up later.  */
2439   if (rtx_equal_p (a, b))
2440     {
2441       /* If we have an INSN_B, we don't have to create any new rtl.  Just
2442          move the instruction that we already have.  If we don't have an
2443          INSN_B, that means that A == X, and we've got a noop move.  In
2444          that case don't do anything and let the code below delete INSN_A.  */
2445       if (insn_b && else_bb)
2446         {
2447           rtx note;
2448
2449           if (else_bb && insn_b == BB_END (else_bb))
2450             BB_END (else_bb) = PREV_INSN (insn_b);
2451           reorder_insns (insn_b, insn_b, PREV_INSN (jump));
2452
2453           /* If there was a REG_EQUAL note, delete it since it may have been
2454              true due to this insn being after a jump.  */
2455           if ((note = find_reg_note (insn_b, REG_EQUAL, NULL_RTX)) != 0)
2456             remove_note (insn_b, note);
2457
2458           insn_b = NULL_RTX;
2459         }
2460       /* If we have "x = b; if (...) x = a;", and x has side-effects, then
2461          x must be executed twice.  */
2462       else if (insn_b && side_effects_p (orig_x))
2463         return FALSE;
2464
2465       x = orig_x;
2466       goto success;
2467     }
2468
2469   if (!set_b && MEM_P (orig_x))
2470     {
2471       /* Disallow the "if (...) x = a;" form (implicit "else x = x;")
2472          for optimizations if writing to x may trap or fault,
2473          i.e. it's a memory other than a static var or a stack slot,
2474          is misaligned on strict aligned machines or is read-only.  If
2475          x is a read-only memory, then the program is valid only if we
2476          avoid the store into it.  If there are stores on both the
2477          THEN and ELSE arms, then we can go ahead with the conversion;
2478          either the program is broken, or the condition is always
2479          false such that the other memory is selected.  */
2480       if (noce_mem_write_may_trap_or_fault_p (orig_x))
2481         return FALSE;
2482
2483       /* Avoid store speculation: given "if (...) x = a" where x is a
2484          MEM, we only want to do the store if x is always set
2485          somewhere in the function.  This avoids cases like
2486            if (pthread_mutex_trylock(mutex))
2487              ++global_variable;
2488          where we only want global_variable to be changed if the mutex
2489          is held.  FIXME: This should ideally be expressed directly in
2490          RTL somehow.  */
2491       if (!noce_can_store_speculate_p (test_bb, orig_x))
2492         return FALSE;
2493     }
2494
2495   if (noce_try_move (if_info))
2496     goto success;
2497   if (noce_try_store_flag (if_info))
2498     goto success;
2499   if (noce_try_bitop (if_info))
2500     goto success;
2501   if (noce_try_minmax (if_info))
2502     goto success;
2503   if (noce_try_abs (if_info))
2504     goto success;
2505   if (HAVE_conditional_move
2506       && noce_try_cmove (if_info))
2507     goto success;
2508   if (! targetm.have_conditional_execution ())
2509     {
2510       if (noce_try_store_flag_constants (if_info))
2511         goto success;
2512       if (noce_try_addcc (if_info))
2513         goto success;
2514       if (noce_try_store_flag_mask (if_info))
2515         goto success;
2516       if (HAVE_conditional_move
2517           && noce_try_cmove_arith (if_info))
2518         goto success;
2519       if (noce_try_sign_mask (if_info))
2520         goto success;
2521     }
2522
2523   if (!else_bb && set_b)
2524     {
2525       insn_b = set_b = NULL_RTX;
2526       b = orig_x;
2527       goto retry;
2528     }
2529
2530   return FALSE;
2531
2532  success:
2533
2534   /* If we used a temporary, fix it up now.  */
2535   if (orig_x != x)
2536     {
2537       rtx seq;
2538
2539       start_sequence ();
2540       noce_emit_move_insn (orig_x, x);
2541       seq = get_insns ();
2542       set_used_flags (orig_x);
2543       unshare_all_rtl_in_chain (seq);
2544       end_sequence ();
2545
2546       emit_insn_before_setloc (seq, BB_END (test_bb), INSN_LOCATOR (insn_a));
2547     }
2548
2549   /* The original THEN and ELSE blocks may now be removed.  The test block
2550      must now jump to the join block.  If the test block and the join block
2551      can be merged, do so.  */
2552   if (else_bb)
2553     {
2554       delete_basic_block (else_bb);
2555       num_true_changes++;
2556     }
2557   else
2558     remove_edge (find_edge (test_bb, join_bb));
2559
2560   remove_edge (find_edge (then_bb, join_bb));
2561   redirect_edge_and_branch_force (single_succ_edge (test_bb), join_bb);
2562   delete_basic_block (then_bb);
2563   num_true_changes++;
2564
2565   if (can_merge_blocks_p (test_bb, join_bb))
2566     {
2567       merge_blocks (test_bb, join_bb);
2568       num_true_changes++;
2569     }
2570
2571   num_updated_if_blocks++;
2572   return TRUE;
2573 }
2574
2575 /* Check whether a block is suitable for conditional move conversion.
2576    Every insn must be a simple set of a register to a constant or a
2577    register.  For each assignment, store the value in the array VALS,
2578    indexed by register number, then store the register number in
2579    REGS.  COND is the condition we will test.  */
2580
2581 static int
2582 check_cond_move_block (basic_block bb, rtx *vals, VEC (int, heap) **regs,
2583                        rtx cond)
2584 {
2585   rtx insn;
2586
2587    /* We can only handle simple jumps at the end of the basic block.
2588       It is almost impossible to update the CFG otherwise.  */
2589   insn = BB_END (bb);
2590   if (JUMP_P (insn) && !onlyjump_p (insn))
2591     return FALSE;
2592
2593   FOR_BB_INSNS (bb, insn)
2594     {
2595       rtx set, dest, src;
2596
2597       if (!NONDEBUG_INSN_P (insn) || JUMP_P (insn))
2598         continue;
2599       set = single_set (insn);
2600       if (!set)
2601         return FALSE;
2602
2603       dest = SET_DEST (set);
2604       src = SET_SRC (set);
2605       if (!REG_P (dest)
2606           || (HARD_REGISTER_P (dest)
2607               && targetm.small_register_classes_for_mode_p (GET_MODE (dest))))
2608         return FALSE;
2609
2610       if (!CONSTANT_P (src) && !register_operand (src, VOIDmode))
2611         return FALSE;
2612
2613       if (side_effects_p (src) || side_effects_p (dest))
2614         return FALSE;
2615
2616       if (may_trap_p (src) || may_trap_p (dest))
2617         return FALSE;
2618
2619       /* Don't try to handle this if the source register was
2620          modified earlier in the block.  */
2621       if ((REG_P (src)
2622            && vals[REGNO (src)] != NULL)
2623           || (GET_CODE (src) == SUBREG && REG_P (SUBREG_REG (src))
2624               && vals[REGNO (SUBREG_REG (src))] != NULL))
2625         return FALSE;
2626
2627       /* Don't try to handle this if the destination register was
2628          modified earlier in the block.  */
2629       if (vals[REGNO (dest)] != NULL)
2630         return FALSE;
2631
2632       /* Don't try to handle this if the condition uses the
2633          destination register.  */
2634       if (reg_overlap_mentioned_p (dest, cond))
2635         return FALSE;
2636
2637       /* Don't try to handle this if the source register is modified
2638          later in the block.  */
2639       if (!CONSTANT_P (src)
2640           && modified_between_p (src, insn, NEXT_INSN (BB_END (bb))))
2641         return FALSE;
2642
2643       vals[REGNO (dest)] = src;
2644
2645       VEC_safe_push (int, heap, *regs, REGNO (dest));
2646     }
2647
2648   return TRUE;
2649 }
2650
2651 /* Given a basic block BB suitable for conditional move conversion,
2652    a condition COND, and arrays THEN_VALS and ELSE_VALS containing the
2653    register values depending on COND, emit the insns in the block as
2654    conditional moves.  If ELSE_BLOCK is true, THEN_BB was already
2655    processed.  The caller has started a sequence for the conversion.
2656    Return true if successful, false if something goes wrong.  */
2657
2658 static bool
2659 cond_move_convert_if_block (struct noce_if_info *if_infop,
2660                             basic_block bb, rtx cond,
2661                             rtx *then_vals, rtx *else_vals,
2662                             bool else_block_p)
2663 {
2664   enum rtx_code code;
2665   rtx insn, cond_arg0, cond_arg1;
2666
2667   code = GET_CODE (cond);
2668   cond_arg0 = XEXP (cond, 0);
2669   cond_arg1 = XEXP (cond, 1);
2670
2671   FOR_BB_INSNS (bb, insn)
2672     {
2673       rtx set, target, dest, t, e;
2674       unsigned int regno;
2675
2676       /* ??? Maybe emit conditional debug insn?  */
2677       if (!NONDEBUG_INSN_P (insn) || JUMP_P (insn))
2678         continue;
2679       set = single_set (insn);
2680       gcc_assert (set && REG_P (SET_DEST (set)));
2681
2682       dest = SET_DEST (set);
2683       regno = REGNO (dest);
2684
2685       t = then_vals[regno];
2686       e = else_vals[regno];
2687
2688       if (else_block_p)
2689         {
2690           /* If this register was set in the then block, we already
2691              handled this case there.  */
2692           if (t)
2693             continue;
2694           t = dest;
2695           gcc_assert (e);
2696         }
2697       else
2698         {
2699           gcc_assert (t);
2700           if (!e)
2701             e = dest;
2702         }
2703
2704       target = noce_emit_cmove (if_infop, dest, code, cond_arg0, cond_arg1,
2705                                 t, e);
2706       if (!target)
2707         return false;
2708
2709       if (target != dest)
2710         noce_emit_move_insn (dest, target);
2711     }
2712
2713   return true;
2714 }
2715
2716 /* Given a simple IF-THEN-JOIN or IF-THEN-ELSE-JOIN block, attempt to convert
2717    it using only conditional moves.  Return TRUE if we were successful at
2718    converting the block.  */
2719
2720 static int
2721 cond_move_process_if_block (struct noce_if_info *if_info)
2722 {
2723   basic_block test_bb = if_info->test_bb;
2724   basic_block then_bb = if_info->then_bb;
2725   basic_block else_bb = if_info->else_bb;
2726   basic_block join_bb = if_info->join_bb;
2727   rtx jump = if_info->jump;
2728   rtx cond = if_info->cond;
2729   rtx seq, loc_insn;
2730   int max_reg, size, c, reg;
2731   rtx *then_vals;
2732   rtx *else_vals;
2733   VEC (int, heap) *then_regs = NULL;
2734   VEC (int, heap) *else_regs = NULL;
2735   unsigned int i;
2736
2737   /* Build a mapping for each block to the value used for each
2738      register.  */
2739   max_reg = max_reg_num ();
2740   size = (max_reg + 1) * sizeof (rtx);
2741   then_vals = (rtx *) alloca (size);
2742   else_vals = (rtx *) alloca (size);
2743   memset (then_vals, 0, size);
2744   memset (else_vals, 0, size);
2745
2746   /* Make sure the blocks are suitable.  */
2747   if (!check_cond_move_block (then_bb, then_vals, &then_regs, cond)
2748       || (else_bb
2749           && !check_cond_move_block (else_bb, else_vals, &else_regs, cond)))
2750     {
2751       VEC_free (int, heap, then_regs);
2752       VEC_free (int, heap, else_regs);
2753       return FALSE;
2754     }
2755
2756   /* Make sure the blocks can be used together.  If the same register
2757      is set in both blocks, and is not set to a constant in both
2758      cases, then both blocks must set it to the same register.  We
2759      have already verified that if it is set to a register, that the
2760      source register does not change after the assignment.  Also count
2761      the number of registers set in only one of the blocks.  */
2762   c = 0;
2763   FOR_EACH_VEC_ELT (int, then_regs, i, reg)
2764     {
2765       if (!then_vals[reg] && !else_vals[reg])
2766         continue;
2767
2768       if (!else_vals[reg])
2769         ++c;
2770       else
2771         {
2772           if (!CONSTANT_P (then_vals[reg])
2773               && !CONSTANT_P (else_vals[reg])
2774               && !rtx_equal_p (then_vals[reg], else_vals[reg]))
2775             {
2776               VEC_free (int, heap, then_regs);
2777               VEC_free (int, heap, else_regs);
2778               return FALSE;
2779             }
2780         }
2781     }
2782
2783   /* Finish off c for MAX_CONDITIONAL_EXECUTE.  */
2784   FOR_EACH_VEC_ELT (int, else_regs, i, reg)
2785     if (!then_vals[reg])
2786       ++c;
2787
2788   /* Make sure it is reasonable to convert this block.  What matters
2789      is the number of assignments currently made in only one of the
2790      branches, since if we convert we are going to always execute
2791      them.  */
2792   if (c > MAX_CONDITIONAL_EXECUTE)
2793     {
2794       VEC_free (int, heap, then_regs);
2795       VEC_free (int, heap, else_regs);
2796       return FALSE;
2797     }
2798
2799   /* Try to emit the conditional moves.  First do the then block,
2800      then do anything left in the else blocks.  */
2801   start_sequence ();
2802   if (!cond_move_convert_if_block (if_info, then_bb, cond,
2803                                    then_vals, else_vals, false)
2804       || (else_bb
2805           && !cond_move_convert_if_block (if_info, else_bb, cond,
2806                                           then_vals, else_vals, true)))
2807     {
2808       end_sequence ();
2809       VEC_free (int, heap, then_regs);
2810       VEC_free (int, heap, else_regs);
2811       return FALSE;
2812     }
2813   seq = end_ifcvt_sequence (if_info);
2814   if (!seq)
2815     {
2816       VEC_free (int, heap, then_regs);
2817       VEC_free (int, heap, else_regs);
2818       return FALSE;
2819     }
2820
2821   loc_insn = first_active_insn (then_bb);
2822   if (!loc_insn)
2823     {
2824       loc_insn = first_active_insn (else_bb);
2825       gcc_assert (loc_insn);
2826     }
2827   emit_insn_before_setloc (seq, jump, INSN_LOCATOR (loc_insn));
2828
2829   if (else_bb)
2830     {
2831       delete_basic_block (else_bb);
2832       num_true_changes++;
2833     }
2834   else
2835     remove_edge (find_edge (test_bb, join_bb));
2836
2837   remove_edge (find_edge (then_bb, join_bb));
2838   redirect_edge_and_branch_force (single_succ_edge (test_bb), join_bb);
2839   delete_basic_block (then_bb);
2840   num_true_changes++;
2841
2842   if (can_merge_blocks_p (test_bb, join_bb))
2843     {
2844       merge_blocks (test_bb, join_bb);
2845       num_true_changes++;
2846     }
2847
2848   num_updated_if_blocks++;
2849
2850   VEC_free (int, heap, then_regs);
2851   VEC_free (int, heap, else_regs);
2852   return TRUE;
2853 }
2854
2855 \f
2856 /* Determine if a given basic block heads a simple IF-THEN-JOIN or an
2857    IF-THEN-ELSE-JOIN block.
2858
2859    If so, we'll try to convert the insns to not require the branch,
2860    using only transformations that do not require conditional execution.
2861
2862    Return TRUE if we were successful at converting the block.  */
2863
2864 static int
2865 noce_find_if_block (basic_block test_bb, edge then_edge, edge else_edge,
2866                     int pass)
2867 {
2868   basic_block then_bb, else_bb, join_bb;
2869   bool then_else_reversed = false;
2870   rtx jump, cond;
2871   rtx cond_earliest;
2872   struct noce_if_info if_info;
2873
2874   /* We only ever should get here before reload.  */
2875   gcc_assert (!reload_completed);
2876
2877   /* Recognize an IF-THEN-ELSE-JOIN block.  */
2878   if (single_pred_p (then_edge->dest)
2879       && single_succ_p (then_edge->dest)
2880       && single_pred_p (else_edge->dest)
2881       && single_succ_p (else_edge->dest)
2882       && single_succ (then_edge->dest) == single_succ (else_edge->dest))
2883     {
2884       then_bb = then_edge->dest;
2885       else_bb = else_edge->dest;
2886       join_bb = single_succ (then_bb);
2887     }
2888   /* Recognize an IF-THEN-JOIN block.  */
2889   else if (single_pred_p (then_edge->dest)
2890            && single_succ_p (then_edge->dest)
2891            && single_succ (then_edge->dest) == else_edge->dest)
2892     {
2893       then_bb = then_edge->dest;
2894       else_bb = NULL_BLOCK;
2895       join_bb = else_edge->dest;
2896     }
2897   /* Recognize an IF-ELSE-JOIN block.  We can have those because the order
2898      of basic blocks in cfglayout mode does not matter, so the fallthrough
2899      edge can go to any basic block (and not just to bb->next_bb, like in
2900      cfgrtl mode).  */
2901   else if (single_pred_p (else_edge->dest)
2902            && single_succ_p (else_edge->dest)
2903            && single_succ (else_edge->dest) == then_edge->dest)
2904     {
2905       /* The noce transformations do not apply to IF-ELSE-JOIN blocks.
2906          To make this work, we have to invert the THEN and ELSE blocks
2907          and reverse the jump condition.  */
2908       then_bb = else_edge->dest;
2909       else_bb = NULL_BLOCK;
2910       join_bb = single_succ (then_bb);
2911       then_else_reversed = true;
2912     }
2913   else
2914     /* Not a form we can handle.  */
2915     return FALSE;
2916
2917   /* The edges of the THEN and ELSE blocks cannot have complex edges.  */
2918   if (single_succ_edge (then_bb)->flags & EDGE_COMPLEX)
2919     return FALSE;
2920   if (else_bb
2921       && single_succ_edge (else_bb)->flags & EDGE_COMPLEX)
2922     return FALSE;
2923
2924   num_possible_if_blocks++;
2925
2926   if (dump_file)
2927     {
2928       fprintf (dump_file,
2929                "\nIF-THEN%s-JOIN block found, pass %d, test %d, then %d",
2930                (else_bb) ? "-ELSE" : "",
2931                pass, test_bb->index, then_bb->index);
2932
2933       if (else_bb)
2934         fprintf (dump_file, ", else %d", else_bb->index);
2935
2936       fprintf (dump_file, ", join %d\n", join_bb->index);
2937     }
2938
2939   /* If the conditional jump is more than just a conditional
2940      jump, then we can not do if-conversion on this block.  */
2941   jump = BB_END (test_bb);
2942   if (! onlyjump_p (jump))
2943     return FALSE;
2944
2945   /* If this is not a standard conditional jump, we can't parse it.  */
2946   cond = noce_get_condition (jump, &cond_earliest, then_else_reversed);
2947   if (!cond)
2948     return FALSE;
2949
2950   /* We must be comparing objects whose modes imply the size.  */
2951   if (GET_MODE (XEXP (cond, 0)) == BLKmode)
2952     return FALSE;
2953
2954   /* Initialize an IF_INFO struct to pass around.  */
2955   memset (&if_info, 0, sizeof if_info);
2956   if_info.test_bb = test_bb;
2957   if_info.then_bb = then_bb;
2958   if_info.else_bb = else_bb;
2959   if_info.join_bb = join_bb;
2960   if_info.cond = cond;
2961   if_info.cond_earliest = cond_earliest;
2962   if_info.jump = jump;
2963   if_info.then_else_reversed = then_else_reversed;
2964   if_info.branch_cost = BRANCH_COST (optimize_bb_for_speed_p (test_bb),
2965                                      predictable_edge_p (then_edge));
2966
2967   /* Do the real work.  */
2968
2969   if (noce_process_if_block (&if_info))
2970     return TRUE;
2971
2972   if (HAVE_conditional_move
2973       && cond_move_process_if_block (&if_info))
2974     return TRUE;
2975
2976   return FALSE;
2977 }
2978 \f
2979
2980 /* Merge the blocks and mark for local life update.  */
2981
2982 static void
2983 merge_if_block (struct ce_if_block * ce_info)
2984 {
2985   basic_block test_bb = ce_info->test_bb;       /* last test block */
2986   basic_block then_bb = ce_info->then_bb;       /* THEN */
2987   basic_block else_bb = ce_info->else_bb;       /* ELSE or NULL */
2988   basic_block join_bb = ce_info->join_bb;       /* join block */
2989   basic_block combo_bb;
2990
2991   /* All block merging is done into the lower block numbers.  */
2992
2993   combo_bb = test_bb;
2994   df_set_bb_dirty (test_bb);
2995
2996   /* Merge any basic blocks to handle && and || subtests.  Each of
2997      the blocks are on the fallthru path from the predecessor block.  */
2998   if (ce_info->num_multiple_test_blocks > 0)
2999     {
3000       basic_block bb = test_bb;
3001       basic_block last_test_bb = ce_info->last_test_bb;
3002       basic_block fallthru = block_fallthru (bb);
3003
3004       do
3005         {
3006           bb = fallthru;
3007           fallthru = block_fallthru (bb);
3008           merge_blocks (combo_bb, bb);
3009           num_true_changes++;
3010         }
3011       while (bb != last_test_bb);
3012     }
3013
3014   /* Merge TEST block into THEN block.  Normally the THEN block won't have a
3015      label, but it might if there were || tests.  That label's count should be
3016      zero, and it normally should be removed.  */
3017
3018   if (then_bb)
3019     {
3020       merge_blocks (combo_bb, then_bb);
3021       num_true_changes++;
3022     }
3023
3024   /* The ELSE block, if it existed, had a label.  That label count
3025      will almost always be zero, but odd things can happen when labels
3026      get their addresses taken.  */
3027   if (else_bb)
3028     {
3029       merge_blocks (combo_bb, else_bb);
3030       num_true_changes++;
3031     }
3032
3033   /* If there was no join block reported, that means it was not adjacent
3034      to the others, and so we cannot merge them.  */
3035
3036   if (! join_bb)
3037     {
3038       rtx last = BB_END (combo_bb);
3039
3040       /* The outgoing edge for the current COMBO block should already
3041          be correct.  Verify this.  */
3042       if (EDGE_COUNT (combo_bb->succs) == 0)
3043         gcc_assert (find_reg_note (last, REG_NORETURN, NULL)
3044                     || (NONJUMP_INSN_P (last)
3045                         && GET_CODE (PATTERN (last)) == TRAP_IF
3046                         && (TRAP_CONDITION (PATTERN (last))
3047                             == const_true_rtx)));
3048
3049       else
3050       /* There should still be something at the end of the THEN or ELSE
3051          blocks taking us to our final destination.  */
3052         gcc_assert (JUMP_P (last)
3053                     || (EDGE_SUCC (combo_bb, 0)->dest == EXIT_BLOCK_PTR
3054                         && CALL_P (last)
3055                         && SIBLING_CALL_P (last))
3056                     || ((EDGE_SUCC (combo_bb, 0)->flags & EDGE_EH)
3057                         && can_throw_internal (last)));
3058     }
3059
3060   /* The JOIN block may have had quite a number of other predecessors too.
3061      Since we've already merged the TEST, THEN and ELSE blocks, we should
3062      have only one remaining edge from our if-then-else diamond.  If there
3063      is more than one remaining edge, it must come from elsewhere.  There
3064      may be zero incoming edges if the THEN block didn't actually join
3065      back up (as with a call to a non-return function).  */
3066   else if (EDGE_COUNT (join_bb->preds) < 2
3067            && join_bb != EXIT_BLOCK_PTR)
3068     {
3069       /* We can merge the JOIN cleanly and update the dataflow try
3070          again on this pass.*/
3071       merge_blocks (combo_bb, join_bb);
3072       num_true_changes++;
3073     }
3074   else
3075     {
3076       /* We cannot merge the JOIN.  */
3077
3078       /* The outgoing edge for the current COMBO block should already
3079          be correct.  Verify this.  */
3080       gcc_assert (single_succ_p (combo_bb)
3081                   && single_succ (combo_bb) == join_bb);
3082
3083       /* Remove the jump and cruft from the end of the COMBO block.  */
3084       if (join_bb != EXIT_BLOCK_PTR)
3085         tidy_fallthru_edge (single_succ_edge (combo_bb));
3086     }
3087
3088   num_updated_if_blocks++;
3089 }
3090 \f
3091 /* Find a block ending in a simple IF condition and try to transform it
3092    in some way.  When converting a multi-block condition, put the new code
3093    in the first such block and delete the rest.  Return a pointer to this
3094    first block if some transformation was done.  Return NULL otherwise.  */
3095
3096 static basic_block
3097 find_if_header (basic_block test_bb, int pass)
3098 {
3099   ce_if_block_t ce_info;
3100   edge then_edge;
3101   edge else_edge;
3102
3103   /* The kind of block we're looking for has exactly two successors.  */
3104   if (EDGE_COUNT (test_bb->succs) != 2)
3105     return NULL;
3106
3107   then_edge = EDGE_SUCC (test_bb, 0);
3108   else_edge = EDGE_SUCC (test_bb, 1);
3109
3110   if (df_get_bb_dirty (then_edge->dest))
3111     return NULL;
3112   if (df_get_bb_dirty (else_edge->dest))
3113     return NULL;
3114
3115   /* Neither edge should be abnormal.  */
3116   if ((then_edge->flags & EDGE_COMPLEX)
3117       || (else_edge->flags & EDGE_COMPLEX))
3118     return NULL;
3119
3120   /* Nor exit the loop.  */
3121   if ((then_edge->flags & EDGE_LOOP_EXIT)
3122       || (else_edge->flags & EDGE_LOOP_EXIT))
3123     return NULL;
3124
3125   /* The THEN edge is canonically the one that falls through.  */
3126   if (then_edge->flags & EDGE_FALLTHRU)
3127     ;
3128   else if (else_edge->flags & EDGE_FALLTHRU)
3129     {
3130       edge e = else_edge;
3131       else_edge = then_edge;
3132       then_edge = e;
3133     }
3134   else
3135     /* Otherwise this must be a multiway branch of some sort.  */
3136     return NULL;
3137
3138   memset (&ce_info, 0, sizeof (ce_info));
3139   ce_info.test_bb = test_bb;
3140   ce_info.then_bb = then_edge->dest;
3141   ce_info.else_bb = else_edge->dest;
3142   ce_info.pass = pass;
3143
3144 #ifdef IFCVT_INIT_EXTRA_FIELDS
3145   IFCVT_INIT_EXTRA_FIELDS (&ce_info);
3146 #endif
3147
3148   if (!reload_completed
3149       && noce_find_if_block (test_bb, then_edge, else_edge, pass))
3150     goto success;
3151
3152   if (reload_completed
3153       && targetm.have_conditional_execution ()
3154       && cond_exec_find_if_block (&ce_info))
3155     goto success;
3156
3157   if (HAVE_trap
3158       && optab_handler (ctrap_optab, word_mode) != CODE_FOR_nothing
3159       && find_cond_trap (test_bb, then_edge, else_edge))
3160     goto success;
3161
3162   if (dom_info_state (CDI_POST_DOMINATORS) >= DOM_NO_FAST_QUERY
3163       && (reload_completed || !targetm.have_conditional_execution ()))
3164     {
3165       if (find_if_case_1 (test_bb, then_edge, else_edge))
3166         goto success;
3167       if (find_if_case_2 (test_bb, then_edge, else_edge))
3168         goto success;
3169     }
3170
3171   return NULL;
3172
3173  success:
3174   if (dump_file)
3175     fprintf (dump_file, "Conversion succeeded on pass %d.\n", pass);
3176   /* Set this so we continue looking.  */
3177   cond_exec_changed_p = TRUE;
3178   return ce_info.test_bb;
3179 }
3180
3181 /* Return true if a block has two edges, one of which falls through to the next
3182    block, and the other jumps to a specific block, so that we can tell if the
3183    block is part of an && test or an || test.  Returns either -1 or the number
3184    of non-note, non-jump, non-USE/CLOBBER insns in the block.  */
3185
3186 static int
3187 block_jumps_and_fallthru_p (basic_block cur_bb, basic_block target_bb)
3188 {
3189   edge cur_edge;
3190   int fallthru_p = FALSE;
3191   int jump_p = FALSE;
3192   rtx insn;
3193   rtx end;
3194   int n_insns = 0;
3195   edge_iterator ei;
3196
3197   if (!cur_bb || !target_bb)
3198     return -1;
3199
3200   /* If no edges, obviously it doesn't jump or fallthru.  */
3201   if (EDGE_COUNT (cur_bb->succs) == 0)
3202     return FALSE;
3203
3204   FOR_EACH_EDGE (cur_edge, ei, cur_bb->succs)
3205     {
3206       if (cur_edge->flags & EDGE_COMPLEX)
3207         /* Anything complex isn't what we want.  */
3208         return -1;
3209
3210       else if (cur_edge->flags & EDGE_FALLTHRU)
3211         fallthru_p = TRUE;
3212
3213       else if (cur_edge->dest == target_bb)
3214         jump_p = TRUE;
3215
3216       else
3217         return -1;
3218     }
3219
3220   if ((jump_p & fallthru_p) == 0)
3221     return -1;
3222
3223   /* Don't allow calls in the block, since this is used to group && and ||
3224      together for conditional execution support.  ??? we should support
3225      conditional execution support across calls for IA-64 some day, but
3226      for now it makes the code simpler.  */
3227   end = BB_END (cur_bb);
3228   insn = BB_HEAD (cur_bb);
3229
3230   while (insn != NULL_RTX)
3231     {
3232       if (CALL_P (insn))
3233         return -1;
3234
3235       if (INSN_P (insn)
3236           && !JUMP_P (insn)
3237           && !DEBUG_INSN_P (insn)
3238           && GET_CODE (PATTERN (insn)) != USE
3239           && GET_CODE (PATTERN (insn)) != CLOBBER)
3240         n_insns++;
3241
3242       if (insn == end)
3243         break;
3244
3245       insn = NEXT_INSN (insn);
3246     }
3247
3248   return n_insns;
3249 }
3250
3251 /* Determine if a given basic block heads a simple IF-THEN or IF-THEN-ELSE
3252    block.  If so, we'll try to convert the insns to not require the branch.
3253    Return TRUE if we were successful at converting the block.  */
3254
3255 static int
3256 cond_exec_find_if_block (struct ce_if_block * ce_info)
3257 {
3258   basic_block test_bb = ce_info->test_bb;
3259   basic_block then_bb = ce_info->then_bb;
3260   basic_block else_bb = ce_info->else_bb;
3261   basic_block join_bb = NULL_BLOCK;
3262   edge cur_edge;
3263   basic_block next;
3264   edge_iterator ei;
3265
3266   ce_info->last_test_bb = test_bb;
3267
3268   /* We only ever should get here after reload,
3269      and if we have conditional execution.  */
3270   gcc_assert (reload_completed && targetm.have_conditional_execution ());
3271
3272   /* Discover if any fall through predecessors of the current test basic block
3273      were && tests (which jump to the else block) or || tests (which jump to
3274      the then block).  */
3275   if (single_pred_p (test_bb)
3276       && single_pred_edge (test_bb)->flags == EDGE_FALLTHRU)
3277     {
3278       basic_block bb = single_pred (test_bb);
3279       basic_block target_bb;
3280       int max_insns = MAX_CONDITIONAL_EXECUTE;
3281       int n_insns;
3282
3283       /* Determine if the preceding block is an && or || block.  */
3284       if ((n_insns = block_jumps_and_fallthru_p (bb, else_bb)) >= 0)
3285         {
3286           ce_info->and_and_p = TRUE;
3287           target_bb = else_bb;
3288         }
3289       else if ((n_insns = block_jumps_and_fallthru_p (bb, then_bb)) >= 0)
3290         {
3291           ce_info->and_and_p = FALSE;
3292           target_bb = then_bb;
3293         }
3294       else
3295         target_bb = NULL_BLOCK;
3296
3297       if (target_bb && n_insns <= max_insns)
3298         {
3299           int total_insns = 0;
3300           int blocks = 0;
3301
3302           ce_info->last_test_bb = test_bb;
3303
3304           /* Found at least one && or || block, look for more.  */
3305           do
3306             {
3307               ce_info->test_bb = test_bb = bb;
3308               total_insns += n_insns;
3309               blocks++;
3310
3311               if (!single_pred_p (bb))
3312                 break;
3313
3314               bb = single_pred (bb);
3315               n_insns = block_jumps_and_fallthru_p (bb, target_bb);
3316             }
3317           while (n_insns >= 0 && (total_insns + n_insns) <= max_insns);
3318
3319           ce_info->num_multiple_test_blocks = blocks;
3320           ce_info->num_multiple_test_insns = total_insns;
3321
3322           if (ce_info->and_and_p)
3323             ce_info->num_and_and_blocks = blocks;
3324           else
3325             ce_info->num_or_or_blocks = blocks;
3326         }
3327     }
3328
3329   /* The THEN block of an IF-THEN combo must have exactly one predecessor,
3330      other than any || blocks which jump to the THEN block.  */
3331   if ((EDGE_COUNT (then_bb->preds) - ce_info->num_or_or_blocks) != 1)
3332     return FALSE;
3333
3334   /* The edges of the THEN and ELSE blocks cannot have complex edges.  */
3335   FOR_EACH_EDGE (cur_edge, ei, then_bb->preds)
3336     {
3337       if (cur_edge->flags & EDGE_COMPLEX)
3338         return FALSE;
3339     }
3340
3341   FOR_EACH_EDGE (cur_edge, ei, else_bb->preds)
3342     {
3343       if (cur_edge->flags & EDGE_COMPLEX)
3344         return FALSE;
3345     }
3346
3347   /* The THEN block of an IF-THEN combo must have zero or one successors.  */
3348   if (EDGE_COUNT (then_bb->succs) > 0
3349       && (!single_succ_p (then_bb)
3350           || (single_succ_edge (then_bb)->flags & EDGE_COMPLEX)
3351           || (epilogue_completed
3352               && tablejump_p (BB_END (then_bb), NULL, NULL))))
3353     return FALSE;
3354
3355   /* If the THEN block has no successors, conditional execution can still
3356      make a conditional call.  Don't do this unless the ELSE block has
3357      only one incoming edge -- the CFG manipulation is too ugly otherwise.
3358      Check for the last insn of the THEN block being an indirect jump, which
3359      is listed as not having any successors, but confuses the rest of the CE
3360      code processing.  ??? we should fix this in the future.  */
3361   if (EDGE_COUNT (then_bb->succs) == 0)
3362     {
3363       if (single_pred_p (else_bb))
3364         {
3365           rtx last_insn = BB_END (then_bb);
3366
3367           while (last_insn
3368                  && NOTE_P (last_insn)
3369                  && last_insn != BB_HEAD (then_bb))
3370             last_insn = PREV_INSN (last_insn);
3371
3372           if (last_insn
3373               && JUMP_P (last_insn)
3374               && ! simplejump_p (last_insn))
3375             return FALSE;
3376
3377           join_bb = else_bb;
3378           else_bb = NULL_BLOCK;
3379         }
3380       else
3381         return FALSE;
3382     }
3383
3384   /* If the THEN block's successor is the other edge out of the TEST block,
3385      then we have an IF-THEN combo without an ELSE.  */
3386   else if (single_succ (then_bb) == else_bb)
3387     {
3388       join_bb = else_bb;
3389       else_bb = NULL_BLOCK;
3390     }
3391
3392   /* If the THEN and ELSE block meet in a subsequent block, and the ELSE
3393      has exactly one predecessor and one successor, and the outgoing edge
3394      is not complex, then we have an IF-THEN-ELSE combo.  */
3395   else if (single_succ_p (else_bb)
3396            && single_succ (then_bb) == single_succ (else_bb)
3397            && single_pred_p (else_bb)
3398            && !(single_succ_edge (else_bb)->flags & EDGE_COMPLEX)
3399            && !(epilogue_completed
3400                 && tablejump_p (BB_END (else_bb), NULL, NULL)))
3401     join_bb = single_succ (else_bb);
3402
3403   /* Otherwise it is not an IF-THEN or IF-THEN-ELSE combination.  */
3404   else
3405     return FALSE;
3406
3407   num_possible_if_blocks++;
3408
3409   if (dump_file)
3410     {
3411       fprintf (dump_file,
3412                "\nIF-THEN%s block found, pass %d, start block %d "
3413                "[insn %d], then %d [%d]",
3414                (else_bb) ? "-ELSE" : "",
3415                ce_info->pass,
3416                test_bb->index,
3417                BB_HEAD (test_bb) ? (int)INSN_UID (BB_HEAD (test_bb)) : -1,
3418                then_bb->index,
3419                BB_HEAD (then_bb) ? (int)INSN_UID (BB_HEAD (then_bb)) : -1);
3420
3421       if (else_bb)
3422         fprintf (dump_file, ", else %d [%d]",
3423                  else_bb->index,
3424                  BB_HEAD (else_bb) ? (int)INSN_UID (BB_HEAD (else_bb)) : -1);
3425
3426       fprintf (dump_file, ", join %d [%d]",
3427                join_bb->index,
3428                BB_HEAD (join_bb) ? (int)INSN_UID (BB_HEAD (join_bb)) : -1);
3429
3430       if (ce_info->num_multiple_test_blocks > 0)
3431         fprintf (dump_file, ", %d %s block%s last test %d [%d]",
3432                  ce_info->num_multiple_test_blocks,
3433                  (ce_info->and_and_p) ? "&&" : "||",
3434                  (ce_info->num_multiple_test_blocks == 1) ? "" : "s",
3435                  ce_info->last_test_bb->index,
3436                  ((BB_HEAD (ce_info->last_test_bb))
3437                   ? (int)INSN_UID (BB_HEAD (ce_info->last_test_bb))
3438                   : -1));
3439
3440       fputc ('\n', dump_file);
3441     }
3442
3443   /* Make sure IF, THEN, and ELSE, blocks are adjacent.  Actually, we get the
3444      first condition for free, since we've already asserted that there's a
3445      fallthru edge from IF to THEN.  Likewise for the && and || blocks, since
3446      we checked the FALLTHRU flag, those are already adjacent to the last IF
3447      block.  */
3448   /* ??? As an enhancement, move the ELSE block.  Have to deal with
3449      BLOCK notes, if by no other means than backing out the merge if they
3450      exist.  Sticky enough I don't want to think about it now.  */
3451   next = then_bb;
3452   if (else_bb && (next = next->next_bb) != else_bb)
3453     return FALSE;
3454   if ((next = next->next_bb) != join_bb && join_bb != EXIT_BLOCK_PTR)
3455     {
3456       if (else_bb)
3457         join_bb = NULL;
3458       else
3459         return FALSE;
3460     }
3461
3462   /* Do the real work.  */
3463
3464   ce_info->else_bb = else_bb;
3465   ce_info->join_bb = join_bb;
3466
3467   /* If we have && and || tests, try to first handle combining the && and ||
3468      tests into the conditional code, and if that fails, go back and handle
3469      it without the && and ||, which at present handles the && case if there
3470      was no ELSE block.  */
3471   if (cond_exec_process_if_block (ce_info, TRUE))
3472     return TRUE;
3473
3474   if (ce_info->num_multiple_test_blocks)
3475     {
3476       cancel_changes (0);
3477
3478       if (cond_exec_process_if_block (ce_info, FALSE))
3479         return TRUE;
3480     }
3481
3482   return FALSE;
3483 }
3484
3485 /* Convert a branch over a trap, or a branch
3486    to a trap, into a conditional trap.  */
3487
3488 static int
3489 find_cond_trap (basic_block test_bb, edge then_edge, edge else_edge)
3490 {
3491   basic_block then_bb = then_edge->dest;
3492   basic_block else_bb = else_edge->dest;
3493   basic_block other_bb, trap_bb;
3494   rtx trap, jump, cond, cond_earliest, seq;
3495   enum rtx_code code;
3496
3497   /* Locate the block with the trap instruction.  */
3498   /* ??? While we look for no successors, we really ought to allow
3499      EH successors.  Need to fix merge_if_block for that to work.  */
3500   if ((trap = block_has_only_trap (then_bb)) != NULL)
3501     trap_bb = then_bb, other_bb = else_bb;
3502   else if ((trap = block_has_only_trap (else_bb)) != NULL)
3503     trap_bb = else_bb, other_bb = then_bb;
3504   else
3505     return FALSE;
3506
3507   if (dump_file)
3508     {
3509       fprintf (dump_file, "\nTRAP-IF block found, start %d, trap %d\n",
3510                test_bb->index, trap_bb->index);
3511     }
3512
3513   /* If this is not a standard conditional jump, we can't parse it.  */
3514   jump = BB_END (test_bb);
3515   cond = noce_get_condition (jump, &cond_earliest, false);
3516   if (! cond)
3517     return FALSE;
3518
3519   /* If the conditional jump is more than just a conditional jump, then
3520      we can not do if-conversion on this block.  */
3521   if (! onlyjump_p (jump))
3522     return FALSE;
3523
3524   /* We must be comparing objects whose modes imply the size.  */
3525   if (GET_MODE (XEXP (cond, 0)) == BLKmode)
3526     return FALSE;
3527
3528   /* Reverse the comparison code, if necessary.  */
3529   code = GET_CODE (cond);
3530   if (then_bb == trap_bb)
3531     {
3532       code = reversed_comparison_code (cond, jump);
3533       if (code == UNKNOWN)
3534         return FALSE;
3535     }
3536
3537   /* Attempt to generate the conditional trap.  */
3538   seq = gen_cond_trap (code, copy_rtx (XEXP (cond, 0)),
3539                        copy_rtx (XEXP (cond, 1)),
3540                        TRAP_CODE (PATTERN (trap)));
3541   if (seq == NULL)
3542     return FALSE;
3543
3544   /* Emit the new insns before cond_earliest.  */
3545   emit_insn_before_setloc (seq, cond_earliest, INSN_LOCATOR (trap));
3546
3547   /* Delete the trap block if possible.  */
3548   remove_edge (trap_bb == then_bb ? then_edge : else_edge);
3549   df_set_bb_dirty (test_bb);
3550   df_set_bb_dirty (then_bb);
3551   df_set_bb_dirty (else_bb);
3552
3553   if (EDGE_COUNT (trap_bb->preds) == 0)
3554     {
3555       delete_basic_block (trap_bb);
3556       num_true_changes++;
3557     }
3558
3559   /* Wire together the blocks again.  */
3560   if (current_ir_type () == IR_RTL_CFGLAYOUT)
3561     single_succ_edge (test_bb)->flags |= EDGE_FALLTHRU;
3562   else
3563     {
3564       rtx lab, newjump;
3565
3566       lab = JUMP_LABEL (jump);
3567       newjump = emit_jump_insn_after (gen_jump (lab), jump);
3568       LABEL_NUSES (lab) += 1;
3569       JUMP_LABEL (newjump) = lab;
3570       emit_barrier_after (newjump);
3571     }
3572   delete_insn (jump);
3573
3574   if (can_merge_blocks_p (test_bb, other_bb))
3575     {
3576       merge_blocks (test_bb, other_bb);
3577       num_true_changes++;
3578     }
3579
3580   num_updated_if_blocks++;
3581   return TRUE;
3582 }
3583
3584 /* Subroutine of find_cond_trap: if BB contains only a trap insn,
3585    return it.  */
3586
3587 static rtx
3588 block_has_only_trap (basic_block bb)
3589 {
3590   rtx trap;
3591
3592   /* We're not the exit block.  */
3593   if (bb == EXIT_BLOCK_PTR)
3594     return NULL_RTX;
3595
3596   /* The block must have no successors.  */
3597   if (EDGE_COUNT (bb->succs) > 0)
3598     return NULL_RTX;
3599
3600   /* The only instruction in the THEN block must be the trap.  */
3601   trap = first_active_insn (bb);
3602   if (! (trap == BB_END (bb)
3603          && GET_CODE (PATTERN (trap)) == TRAP_IF
3604          && TRAP_CONDITION (PATTERN (trap)) == const_true_rtx))
3605     return NULL_RTX;
3606
3607   return trap;
3608 }
3609
3610 /* Look for IF-THEN-ELSE cases in which one of THEN or ELSE is
3611    transformable, but not necessarily the other.  There need be no
3612    JOIN block.
3613
3614    Return TRUE if we were successful at converting the block.
3615
3616    Cases we'd like to look at:
3617
3618    (1)
3619         if (test) goto over; // x not live
3620         x = a;
3621         goto label;
3622         over:
3623
3624    becomes
3625
3626         x = a;
3627         if (! test) goto label;
3628
3629    (2)
3630         if (test) goto E; // x not live
3631         x = big();
3632         goto L;
3633         E:
3634         x = b;
3635         goto M;
3636
3637    becomes
3638
3639         x = b;
3640         if (test) goto M;
3641         x = big();
3642         goto L;
3643
3644    (3) // This one's really only interesting for targets that can do
3645        // multiway branching, e.g. IA-64 BBB bundles.  For other targets
3646        // it results in multiple branches on a cache line, which often
3647        // does not sit well with predictors.
3648
3649         if (test1) goto E; // predicted not taken
3650         x = a;
3651         if (test2) goto F;
3652         ...
3653         E:
3654         x = b;
3655         J:
3656
3657    becomes
3658
3659         x = a;
3660         if (test1) goto E;
3661         if (test2) goto F;
3662
3663    Notes:
3664
3665    (A) Don't do (2) if the branch is predicted against the block we're
3666    eliminating.  Do it anyway if we can eliminate a branch; this requires
3667    that the sole successor of the eliminated block postdominate the other
3668    side of the if.
3669
3670    (B) With CE, on (3) we can steal from both sides of the if, creating
3671
3672         if (test1) x = a;
3673         if (!test1) x = b;
3674         if (test1) goto J;
3675         if (test2) goto F;
3676         ...
3677         J:
3678
3679    Again, this is most useful if J postdominates.
3680
3681    (C) CE substitutes for helpful life information.
3682
3683    (D) These heuristics need a lot of work.  */
3684
3685 /* Tests for case 1 above.  */
3686
3687 static int
3688 find_if_case_1 (basic_block test_bb, edge then_edge, edge else_edge)
3689 {
3690   basic_block then_bb = then_edge->dest;
3691   basic_block else_bb = else_edge->dest;
3692   basic_block new_bb;
3693   int then_bb_index;
3694
3695   /* If we are partitioning hot/cold basic blocks, we don't want to
3696      mess up unconditional or indirect jumps that cross between hot
3697      and cold sections.
3698
3699      Basic block partitioning may result in some jumps that appear to
3700      be optimizable (or blocks that appear to be mergeable), but which really
3701      must be left untouched (they are required to make it safely across
3702      partition boundaries).  See  the comments at the top of
3703      bb-reorder.c:partition_hot_cold_basic_blocks for complete details.  */
3704
3705   if ((BB_END (then_bb)
3706        && find_reg_note (BB_END (then_bb), REG_CROSSING_JUMP, NULL_RTX))
3707       || (BB_END (test_bb)
3708           && find_reg_note (BB_END (test_bb), REG_CROSSING_JUMP, NULL_RTX))
3709       || (BB_END (else_bb)
3710           && find_reg_note (BB_END (else_bb), REG_CROSSING_JUMP,
3711                             NULL_RTX)))
3712     return FALSE;
3713
3714   /* THEN has one successor.  */
3715   if (!single_succ_p (then_bb))
3716     return FALSE;
3717
3718   /* THEN does not fall through, but is not strange either.  */
3719   if (single_succ_edge (then_bb)->flags & (EDGE_COMPLEX | EDGE_FALLTHRU))
3720     return FALSE;
3721
3722   /* THEN has one predecessor.  */
3723   if (!single_pred_p (then_bb))
3724     return FALSE;
3725
3726   /* THEN must do something.  */
3727   if (forwarder_block_p (then_bb))
3728     return FALSE;
3729
3730   num_possible_if_blocks++;
3731   if (dump_file)
3732     fprintf (dump_file,
3733              "\nIF-CASE-1 found, start %d, then %d\n",
3734              test_bb->index, then_bb->index);
3735
3736   /* THEN is small.  */
3737   if (! cheap_bb_rtx_cost_p (then_bb,
3738         COSTS_N_INSNS (BRANCH_COST (optimize_bb_for_speed_p (then_edge->src),
3739                                     predictable_edge_p (then_edge)))))
3740     return FALSE;
3741
3742   /* Registers set are dead, or are predicable.  */
3743   if (! dead_or_predicable (test_bb, then_bb, else_bb,
3744                             single_succ (then_bb), 1))
3745     return FALSE;
3746
3747   /* Conversion went ok, including moving the insns and fixing up the
3748      jump.  Adjust the CFG to match.  */
3749
3750   /* We can avoid creating a new basic block if then_bb is immediately
3751      followed by else_bb, i.e. deleting then_bb allows test_bb to fall
3752      thru to else_bb.  */
3753
3754   if (then_bb->next_bb == else_bb
3755       && then_bb->prev_bb == test_bb
3756       && else_bb != EXIT_BLOCK_PTR)
3757     {
3758       redirect_edge_succ (FALLTHRU_EDGE (test_bb), else_bb);
3759       new_bb = 0;
3760     }
3761   else
3762     new_bb = redirect_edge_and_branch_force (FALLTHRU_EDGE (test_bb),
3763                                              else_bb);
3764
3765   df_set_bb_dirty (test_bb);
3766   df_set_bb_dirty (else_bb);
3767
3768   then_bb_index = then_bb->index;
3769   delete_basic_block (then_bb);
3770
3771   /* Make rest of code believe that the newly created block is the THEN_BB
3772      block we removed.  */
3773   if (new_bb)
3774     {
3775       df_bb_replace (then_bb_index, new_bb);
3776       /* Since the fallthru edge was redirected from test_bb to new_bb,
3777          we need to ensure that new_bb is in the same partition as
3778          test bb (you can not fall through across section boundaries).  */
3779       BB_COPY_PARTITION (new_bb, test_bb);
3780     }
3781
3782   num_true_changes++;
3783   num_updated_if_blocks++;
3784
3785   return TRUE;
3786 }
3787
3788 /* Test for case 2 above.  */
3789
3790 static int
3791 find_if_case_2 (basic_block test_bb, edge then_edge, edge else_edge)
3792 {
3793   basic_block then_bb = then_edge->dest;
3794   basic_block else_bb = else_edge->dest;
3795   edge else_succ;
3796   rtx note;
3797
3798   /* If we are partitioning hot/cold basic blocks, we don't want to
3799      mess up unconditional or indirect jumps that cross between hot
3800      and cold sections.
3801
3802      Basic block partitioning may result in some jumps that appear to
3803      be optimizable (or blocks that appear to be mergeable), but which really
3804      must be left untouched (they are required to make it safely across
3805      partition boundaries).  See  the comments at the top of
3806      bb-reorder.c:partition_hot_cold_basic_blocks for complete details.  */
3807
3808   if ((BB_END (then_bb)
3809        && find_reg_note (BB_END (then_bb), REG_CROSSING_JUMP, NULL_RTX))
3810       || (BB_END (test_bb)
3811           && find_reg_note (BB_END (test_bb), REG_CROSSING_JUMP, NULL_RTX))
3812       || (BB_END (else_bb)
3813           && find_reg_note (BB_END (else_bb), REG_CROSSING_JUMP,
3814                             NULL_RTX)))
3815     return FALSE;
3816
3817   /* ELSE has one successor.  */
3818   if (!single_succ_p (else_bb))
3819     return FALSE;
3820   else
3821     else_succ = single_succ_edge (else_bb);
3822
3823   /* ELSE outgoing edge is not complex.  */
3824   if (else_succ->flags & EDGE_COMPLEX)
3825     return FALSE;
3826
3827   /* ELSE has one predecessor.  */
3828   if (!single_pred_p (else_bb))
3829     return FALSE;
3830
3831   /* THEN is not EXIT.  */
3832   if (then_bb->index < NUM_FIXED_BLOCKS)
3833     return FALSE;
3834
3835   /* ELSE is predicted or SUCC(ELSE) postdominates THEN.  */
3836   note = find_reg_note (BB_END (test_bb), REG_BR_PROB, NULL_RTX);
3837   if (note && INTVAL (XEXP (note, 0)) >= REG_BR_PROB_BASE / 2)
3838     ;
3839   else if (else_succ->dest->index < NUM_FIXED_BLOCKS
3840            || dominated_by_p (CDI_POST_DOMINATORS, then_bb,
3841                               else_succ->dest))
3842     ;
3843   else
3844     return FALSE;
3845
3846   num_possible_if_blocks++;
3847   if (dump_file)
3848     fprintf (dump_file,
3849              "\nIF-CASE-2 found, start %d, else %d\n",
3850              test_bb->index, else_bb->index);
3851
3852   /* ELSE is small.  */
3853   if (! cheap_bb_rtx_cost_p (else_bb,
3854         COSTS_N_INSNS (BRANCH_COST (optimize_bb_for_speed_p (else_edge->src),
3855                                     predictable_edge_p (else_edge)))))
3856     return FALSE;
3857
3858   /* Registers set are dead, or are predicable.  */
3859   if (! dead_or_predicable (test_bb, else_bb, then_bb, else_succ->dest, 0))
3860     return FALSE;
3861
3862   /* Conversion went ok, including moving the insns and fixing up the
3863      jump.  Adjust the CFG to match.  */
3864
3865   df_set_bb_dirty (test_bb);
3866   df_set_bb_dirty (then_bb);
3867   delete_basic_block (else_bb);
3868
3869   num_true_changes++;
3870   num_updated_if_blocks++;
3871
3872   /* ??? We may now fallthru from one of THEN's successors into a join
3873      block.  Rerun cleanup_cfg?  Examine things manually?  Wait?  */
3874
3875   return TRUE;
3876 }
3877
3878 /* A subroutine of dead_or_predicable called through for_each_rtx.
3879    Return 1 if a memory is found.  */
3880
3881 static int
3882 find_memory (rtx *px, void *data ATTRIBUTE_UNUSED)
3883 {
3884   return MEM_P (*px);
3885 }
3886
3887 /* Used by the code above to perform the actual rtl transformations.
3888    Return TRUE if successful.
3889
3890    TEST_BB is the block containing the conditional branch.  MERGE_BB
3891    is the block containing the code to manipulate.  NEW_DEST is the
3892    label TEST_BB should be branching to after the conversion.
3893    REVERSEP is true if the sense of the branch should be reversed.  */
3894
3895 static int
3896 dead_or_predicable (basic_block test_bb, basic_block merge_bb,
3897                     basic_block other_bb, basic_block new_dest, int reversep)
3898 {
3899   rtx head, end, jump, earliest = NULL_RTX, old_dest, new_label = NULL_RTX;
3900   /* Number of pending changes.  */
3901   int n_validated_changes = 0;
3902
3903   jump = BB_END (test_bb);
3904
3905   /* Find the extent of the real code in the merge block.  */
3906   head = BB_HEAD (merge_bb);
3907   end = BB_END (merge_bb);
3908
3909   while (DEBUG_INSN_P (end) && end != head)
3910     end = PREV_INSN (end);
3911
3912   /* If merge_bb ends with a tablejump, predicating/moving insn's
3913      into test_bb and then deleting merge_bb will result in the jumptable
3914      that follows merge_bb being removed along with merge_bb and then we
3915      get an unresolved reference to the jumptable.  */
3916   if (tablejump_p (end, NULL, NULL))
3917     return FALSE;
3918
3919   if (LABEL_P (head))
3920     head = NEXT_INSN (head);
3921   while (DEBUG_INSN_P (head) && head != end)
3922     head = NEXT_INSN (head);
3923   if (NOTE_P (head))
3924     {
3925       if (head == end)
3926         {
3927           head = end = NULL_RTX;
3928           goto no_body;
3929         }
3930       head = NEXT_INSN (head);
3931       while (DEBUG_INSN_P (head) && head != end)
3932         head = NEXT_INSN (head);
3933     }
3934
3935   if (JUMP_P (end))
3936     {
3937       if (head == end)
3938         {
3939           head = end = NULL_RTX;
3940           goto no_body;
3941         }
3942       end = PREV_INSN (end);
3943       while (DEBUG_INSN_P (end) && end != head)
3944         end = PREV_INSN (end);
3945     }
3946
3947   /* Disable handling dead code by conditional execution if the machine needs
3948      to do anything funny with the tests, etc.  */
3949 #ifndef IFCVT_MODIFY_TESTS
3950   if (targetm.have_conditional_execution ())
3951     {
3952       /* In the conditional execution case, we have things easy.  We know
3953          the condition is reversible.  We don't have to check life info
3954          because we're going to conditionally execute the code anyway.
3955          All that's left is making sure the insns involved can actually
3956          be predicated.  */
3957
3958       rtx cond, prob_val;
3959
3960       cond = cond_exec_get_condition (jump);
3961       if (! cond)
3962         return FALSE;
3963
3964       prob_val = find_reg_note (jump, REG_BR_PROB, NULL_RTX);
3965       if (prob_val)
3966         prob_val = XEXP (prob_val, 0);
3967
3968       if (reversep)
3969         {
3970           enum rtx_code rev = reversed_comparison_code (cond, jump);
3971           if (rev == UNKNOWN)
3972             return FALSE;
3973           cond = gen_rtx_fmt_ee (rev, GET_MODE (cond), XEXP (cond, 0),
3974                                  XEXP (cond, 1));
3975           if (prob_val)
3976             prob_val = GEN_INT (REG_BR_PROB_BASE - INTVAL (prob_val));
3977         }
3978
3979       if (cond_exec_process_insns (NULL, head, end, cond, prob_val, 0)
3980           && verify_changes (0))
3981         n_validated_changes = num_validated_changes ();
3982       else
3983         cancel_changes (0);
3984
3985       earliest = jump;
3986     }
3987 #endif
3988   /* Try the NCE path if the CE path did not result in any changes.  */
3989   if (n_validated_changes == 0)
3990     {
3991       /* In the non-conditional execution case, we have to verify that there
3992          are no trapping operations, no calls, no references to memory, and
3993          that any registers modified are dead at the branch site.  */
3994
3995       rtx insn, cond, prev;
3996       bitmap merge_set, merge_set_noclobber, test_live, test_set;
3997       unsigned i, fail = 0;
3998       bitmap_iterator bi;
3999
4000       /* Check for no calls or trapping operations.  */
4001       for (insn = head; ; insn = NEXT_INSN (insn))
4002         {
4003           if (CALL_P (insn))
4004             return FALSE;
4005           if (NONDEBUG_INSN_P (insn))
4006             {
4007               if (may_trap_p (PATTERN (insn)))
4008                 return FALSE;
4009
4010               /* ??? Even non-trapping memories such as stack frame
4011                  references must be avoided.  For stores, we collect
4012                  no lifetime info; for reads, we'd have to assert
4013                  true_dependence false against every store in the
4014                  TEST range.  */
4015               if (for_each_rtx (&PATTERN (insn), find_memory, NULL))
4016                 return FALSE;
4017             }
4018           if (insn == end)
4019             break;
4020         }
4021
4022       if (! any_condjump_p (jump))
4023         return FALSE;
4024
4025       /* Find the extent of the conditional.  */
4026       cond = noce_get_condition (jump, &earliest, false);
4027       if (! cond)
4028         return FALSE;
4029
4030       /* Collect:
4031            MERGE_SET = set of registers set in MERGE_BB
4032            MERGE_SET_NOCLOBBER = like MERGE_SET, but only includes registers
4033              that are really set, not just clobbered.
4034            TEST_LIVE = set of registers live at EARLIEST
4035            TEST_SET = set of registers set between EARLIEST and the
4036              end of the block.  */
4037
4038       merge_set = BITMAP_ALLOC (&reg_obstack);
4039       merge_set_noclobber = BITMAP_ALLOC (&reg_obstack);
4040       test_live = BITMAP_ALLOC (&reg_obstack);
4041       test_set = BITMAP_ALLOC (&reg_obstack);
4042
4043       /* ??? bb->local_set is only valid during calculate_global_regs_live,
4044          so we must recompute usage for MERGE_BB.  Not so bad, I suppose,
4045          since we've already asserted that MERGE_BB is small.  */
4046       /* If we allocated new pseudos (e.g. in the conditional move
4047          expander called from noce_emit_cmove), we must resize the
4048          array first.  */
4049       if (max_regno < max_reg_num ())
4050         max_regno = max_reg_num ();
4051
4052       FOR_BB_INSNS (merge_bb, insn)
4053         {
4054           if (NONDEBUG_INSN_P (insn))
4055             {
4056               df_simulate_find_defs (insn, merge_set);
4057               df_simulate_find_noclobber_defs (insn, merge_set_noclobber);
4058             }
4059         }
4060
4061       /* For small register class machines, don't lengthen lifetimes of
4062          hard registers before reload.  */
4063       if (! reload_completed
4064           && targetm.small_register_classes_for_mode_p (VOIDmode))
4065         {
4066           EXECUTE_IF_SET_IN_BITMAP (merge_set_noclobber, 0, i, bi)
4067             {
4068               if (i < FIRST_PSEUDO_REGISTER
4069                   && ! fixed_regs[i]
4070                   && ! global_regs[i])
4071                 fail = 1;
4072             }
4073         }
4074
4075       /* For TEST, we're interested in a range of insns, not a whole block.
4076          Moreover, we're interested in the insns live from OTHER_BB.  */
4077
4078       /* The loop below takes the set of live registers
4079          after JUMP, and calculates the live set before EARLIEST. */
4080       bitmap_copy (test_live, df_get_live_in (other_bb));
4081       df_simulate_initialize_backwards (test_bb, test_live);
4082       for (insn = jump; ; insn = prev)
4083         {
4084           if (INSN_P (insn))
4085             {
4086               df_simulate_find_defs (insn, test_set);
4087               df_simulate_one_insn_backwards (test_bb, insn, test_live);
4088             }
4089           prev = PREV_INSN (insn);
4090           if (insn == earliest)
4091             break;
4092         }
4093
4094       /* We can perform the transformation if
4095            MERGE_SET_NOCLOBBER & TEST_SET
4096          and
4097            MERGE_SET & TEST_LIVE)
4098          and
4099            TEST_SET & DF_LIVE_IN (merge_bb)
4100          are empty.  */
4101
4102       if (bitmap_intersect_p (test_set, merge_set_noclobber)
4103           || bitmap_intersect_p (test_live, merge_set)
4104           || bitmap_intersect_p (test_set, df_get_live_in (merge_bb)))
4105         fail = 1;
4106
4107       BITMAP_FREE (merge_set_noclobber);
4108       BITMAP_FREE (merge_set);
4109       BITMAP_FREE (test_live);
4110       BITMAP_FREE (test_set);
4111
4112       if (fail)
4113         return FALSE;
4114     }
4115
4116  no_body:
4117   /* We don't want to use normal invert_jump or redirect_jump because
4118      we don't want to delete_insn called.  Also, we want to do our own
4119      change group management.  */
4120
4121   old_dest = JUMP_LABEL (jump);
4122   if (other_bb != new_dest)
4123     {
4124       new_label = block_label (new_dest);
4125       if (reversep
4126           ? ! invert_jump_1 (jump, new_label)
4127           : ! redirect_jump_1 (jump, new_label))
4128         goto cancel;
4129     }
4130
4131   if (verify_changes (n_validated_changes))
4132     confirm_change_group ();
4133   else
4134     goto cancel;
4135
4136   if (other_bb != new_dest)
4137     {
4138       redirect_jump_2 (jump, old_dest, new_label, 0, reversep);
4139
4140       redirect_edge_succ (BRANCH_EDGE (test_bb), new_dest);
4141       if (reversep)
4142         {
4143           gcov_type count, probability;
4144           count = BRANCH_EDGE (test_bb)->count;
4145           BRANCH_EDGE (test_bb)->count = FALLTHRU_EDGE (test_bb)->count;
4146           FALLTHRU_EDGE (test_bb)->count = count;
4147           probability = BRANCH_EDGE (test_bb)->probability;
4148           BRANCH_EDGE (test_bb)->probability
4149             = FALLTHRU_EDGE (test_bb)->probability;
4150           FALLTHRU_EDGE (test_bb)->probability = probability;
4151           update_br_prob_note (test_bb);
4152         }
4153     }
4154
4155   /* Move the insns out of MERGE_BB to before the branch.  */
4156   if (head != NULL)
4157     {
4158       rtx insn;
4159
4160       if (end == BB_END (merge_bb))
4161         BB_END (merge_bb) = PREV_INSN (head);
4162
4163       /* PR 21767: When moving insns above a conditional branch, REG_EQUAL
4164          notes might become invalid.  */
4165       insn = head;
4166       do
4167         {
4168           rtx note, set;
4169
4170           if (! INSN_P (insn))
4171             continue;
4172           note = find_reg_note (insn, REG_EQUAL, NULL_RTX);
4173           if (! note)
4174             continue;
4175           set = single_set (insn);
4176           if (!set || !function_invariant_p (SET_SRC (set))
4177               || !function_invariant_p (XEXP (note, 0)))
4178             remove_note (insn, note);
4179         } while (insn != end && (insn = NEXT_INSN (insn)));
4180
4181       reorder_insns (head, end, PREV_INSN (earliest));
4182     }
4183
4184   /* Remove the jump and edge if we can.  */
4185   if (other_bb == new_dest)
4186     {
4187       delete_insn (jump);
4188       remove_edge (BRANCH_EDGE (test_bb));
4189       /* ??? Can't merge blocks here, as then_bb is still in use.
4190          At minimum, the merge will get done just before bb-reorder.  */
4191     }
4192
4193   return TRUE;
4194
4195  cancel:
4196   cancel_changes (0);
4197   return FALSE;
4198 }
4199 \f
4200 /* Main entry point for all if-conversion.  */
4201
4202 static void
4203 if_convert (void)
4204 {
4205   basic_block bb;
4206   int pass;
4207
4208   if (optimize == 1)
4209     {
4210       df_live_add_problem ();
4211       df_live_set_all_dirty ();
4212     }
4213
4214   num_possible_if_blocks = 0;
4215   num_updated_if_blocks = 0;
4216   num_true_changes = 0;
4217
4218   loop_optimizer_init (AVOID_CFG_MODIFICATIONS);
4219   mark_loop_exit_edges ();
4220   loop_optimizer_finalize ();
4221   free_dominance_info (CDI_DOMINATORS);
4222
4223   /* Compute postdominators.  */
4224   calculate_dominance_info (CDI_POST_DOMINATORS);
4225
4226   df_set_flags (DF_LR_RUN_DCE);
4227
4228   /* Go through each of the basic blocks looking for things to convert.  If we
4229      have conditional execution, we make multiple passes to allow us to handle
4230      IF-THEN{-ELSE} blocks within other IF-THEN{-ELSE} blocks.  */
4231   pass = 0;
4232   do
4233     {
4234       df_analyze ();
4235       /* Only need to do dce on the first pass.  */
4236       df_clear_flags (DF_LR_RUN_DCE);
4237       cond_exec_changed_p = FALSE;
4238       pass++;
4239
4240 #ifdef IFCVT_MULTIPLE_DUMPS
4241       if (dump_file && pass > 1)
4242         fprintf (dump_file, "\n\n========== Pass %d ==========\n", pass);
4243 #endif
4244
4245       FOR_EACH_BB (bb)
4246         {
4247           basic_block new_bb;
4248           while (!df_get_bb_dirty (bb)
4249                  && (new_bb = find_if_header (bb, pass)) != NULL)
4250             bb = new_bb;
4251         }
4252
4253 #ifdef IFCVT_MULTIPLE_DUMPS
4254       if (dump_file && cond_exec_changed_p)
4255         {
4256           if (dump_flags & TDF_SLIM)
4257             print_rtl_slim_with_bb (dump_file, get_insns (), dump_flags);
4258           else
4259             print_rtl_with_bb (dump_file, get_insns ());
4260         }
4261 #endif
4262     }
4263   while (cond_exec_changed_p);
4264
4265 #ifdef IFCVT_MULTIPLE_DUMPS
4266   if (dump_file)
4267     fprintf (dump_file, "\n\n========== no more changes\n");
4268 #endif
4269
4270   free_dominance_info (CDI_POST_DOMINATORS);
4271
4272   if (dump_file)
4273     fflush (dump_file);
4274
4275   clear_aux_for_blocks ();
4276
4277   /* If we allocated new pseudos, we must resize the array for sched1.  */
4278   if (max_regno < max_reg_num ())
4279     max_regno = max_reg_num ();
4280
4281   /* Write the final stats.  */
4282   if (dump_file && num_possible_if_blocks > 0)
4283     {
4284       fprintf (dump_file,
4285                "\n%d possible IF blocks searched.\n",
4286                num_possible_if_blocks);
4287       fprintf (dump_file,
4288                "%d IF blocks converted.\n",
4289                num_updated_if_blocks);
4290       fprintf (dump_file,
4291                "%d true changes made.\n\n\n",
4292                num_true_changes);
4293     }
4294
4295   if (optimize == 1)
4296     df_remove_problem (df_live);
4297
4298 #ifdef ENABLE_CHECKING
4299   verify_flow_info ();
4300 #endif
4301 }
4302 \f
4303 static bool
4304 gate_handle_if_conversion (void)
4305 {
4306   return (optimize > 0)
4307     && dbg_cnt (if_conversion);
4308 }
4309
4310 /* If-conversion and CFG cleanup.  */
4311 static unsigned int
4312 rest_of_handle_if_conversion (void)
4313 {
4314   if (flag_if_conversion)
4315     {
4316       if (dump_file)
4317         dump_flow_info (dump_file, dump_flags);
4318       cleanup_cfg (CLEANUP_EXPENSIVE);
4319       if_convert ();
4320     }
4321
4322   cleanup_cfg (0);
4323   return 0;
4324 }
4325
4326 struct rtl_opt_pass pass_rtl_ifcvt =
4327 {
4328  {
4329   RTL_PASS,
4330   "ce1",                                /* name */
4331   gate_handle_if_conversion,            /* gate */
4332   rest_of_handle_if_conversion,         /* execute */
4333   NULL,                                 /* sub */
4334   NULL,                                 /* next */
4335   0,                                    /* static_pass_number */
4336   TV_IFCVT,                             /* tv_id */
4337   0,                                    /* properties_required */
4338   0,                                    /* properties_provided */
4339   0,                                    /* properties_destroyed */
4340   0,                                    /* todo_flags_start */
4341   TODO_df_finish | TODO_verify_rtl_sharing |
4342   TODO_dump_func                        /* todo_flags_finish */
4343  }
4344 };
4345
4346 static bool
4347 gate_handle_if_after_combine (void)
4348 {
4349   return optimize > 0 && flag_if_conversion
4350     && dbg_cnt (if_after_combine);
4351 }
4352
4353
4354 /* Rerun if-conversion, as combine may have simplified things enough
4355    to now meet sequence length restrictions.  */
4356 static unsigned int
4357 rest_of_handle_if_after_combine (void)
4358 {
4359   if_convert ();
4360   return 0;
4361 }
4362
4363 struct rtl_opt_pass pass_if_after_combine =
4364 {
4365  {
4366   RTL_PASS,
4367   "ce2",                                /* name */
4368   gate_handle_if_after_combine,         /* gate */
4369   rest_of_handle_if_after_combine,      /* execute */
4370   NULL,                                 /* sub */
4371   NULL,                                 /* next */
4372   0,                                    /* static_pass_number */
4373   TV_IFCVT,                             /* tv_id */
4374   0,                                    /* properties_required */
4375   0,                                    /* properties_provided */
4376   0,                                    /* properties_destroyed */
4377   0,                                    /* todo_flags_start */
4378   TODO_df_finish | TODO_verify_rtl_sharing |
4379   TODO_dump_func |
4380   TODO_ggc_collect                      /* todo_flags_finish */
4381  }
4382 };
4383
4384
4385 static bool
4386 gate_handle_if_after_reload (void)
4387 {
4388   return optimize > 0 && flag_if_conversion2
4389     && dbg_cnt (if_after_reload);
4390 }
4391
4392 static unsigned int
4393 rest_of_handle_if_after_reload (void)
4394 {
4395   if_convert ();
4396   return 0;
4397 }
4398
4399
4400 struct rtl_opt_pass pass_if_after_reload =
4401 {
4402  {
4403   RTL_PASS,
4404   "ce3",                                /* name */
4405   gate_handle_if_after_reload,          /* gate */
4406   rest_of_handle_if_after_reload,       /* execute */
4407   NULL,                                 /* sub */
4408   NULL,                                 /* next */
4409   0,                                    /* static_pass_number */
4410   TV_IFCVT2,                            /* tv_id */
4411   0,                                    /* properties_required */
4412   0,                                    /* properties_provided */
4413   0,                                    /* properties_destroyed */
4414   0,                                    /* todo_flags_start */
4415   TODO_df_finish | TODO_verify_rtl_sharing |
4416   TODO_dump_func |
4417   TODO_ggc_collect                      /* todo_flags_finish */
4418  }
4419 };