OSDN Git Service

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