0be64727d350d58df41bcfaffcdd2d77ccdaf44e
[platform/upstream/gcc.git] / gcc / ifcvt.c
1 /* If-conversion support.
2    Copyright (C) 2000, 2001, 2002, 2003, 2004 Free Software Foundation, Inc.
3
4    This file is part of GCC.
5
6    GCC is free software; you can redistribute it and/or modify it
7    under the terms of the GNU General Public License as published by
8    the Free Software Foundation; either version 2, or (at your option)
9    any later version.
10
11    GCC is distributed in the hope that it will be useful, but WITHOUT
12    ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
13    or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public
14    License for more details.
15
16    You should have received a copy of the GNU General Public License
17    along with GCC; see the file COPYING.  If not, write to the Free
18    Software Foundation, 59 Temple Place - Suite 330, Boston, MA
19    02111-1307, USA.  */
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
44
45 #ifndef HAVE_conditional_execution
46 #define HAVE_conditional_execution 0
47 #endif
48 #ifndef HAVE_conditional_move
49 #define HAVE_conditional_move 0
50 #endif
51 #ifndef HAVE_incscc
52 #define HAVE_incscc 0
53 #endif
54 #ifndef HAVE_decscc
55 #define HAVE_decscc 0
56 #endif
57 #ifndef HAVE_trap
58 #define HAVE_trap 0
59 #endif
60 #ifndef HAVE_conditional_trap
61 #define HAVE_conditional_trap 0
62 #endif
63
64 #ifndef MAX_CONDITIONAL_EXECUTE
65 #define MAX_CONDITIONAL_EXECUTE   (BRANCH_COST + 1)
66 #endif
67
68 #define NULL_EDGE       ((struct edge_def *)NULL)
69 #define NULL_BLOCK      ((struct basic_block_def *)NULL)
70
71 /* # of IF-THEN or IF-THEN-ELSE blocks we looked at  */
72 static int num_possible_if_blocks;
73
74 /* # of IF-THEN or IF-THEN-ELSE blocks were converted to conditional
75    execution.  */
76 static int num_updated_if_blocks;
77
78 /* # of changes made which require life information to be updated.  */
79 static int num_true_changes;
80
81 /* Whether conditional execution changes were made.  */
82 static int cond_exec_changed_p;
83
84 /* True if life data ok at present.  */
85 static bool life_data_ok;
86
87 /* Forward references.  */
88 static int count_bb_insns (basic_block);
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 int cond_exec_process_if_block (ce_if_block_t *, int);
95 static rtx noce_get_condition (rtx, rtx *);
96 static int noce_operand_ok (rtx);
97 static int noce_process_if_block (ce_if_block_t *);
98 static int process_if_block (ce_if_block_t *);
99 static void merge_if_block (ce_if_block_t *);
100 static int find_cond_trap (basic_block, edge, edge);
101 static basic_block find_if_header (basic_block, int);
102 static int block_jumps_and_fallthru_p (basic_block, basic_block);
103 static int find_if_block (ce_if_block_t *);
104 static int find_if_case_1 (basic_block, edge, edge);
105 static int find_if_case_2 (basic_block, edge, edge);
106 static int find_memory (rtx *, void *);
107 static int dead_or_predicable (basic_block, basic_block, basic_block,
108                                basic_block, int);
109 static void noce_emit_move_insn (rtx, rtx);
110 static rtx block_has_only_trap (basic_block);
111 static void mark_loop_exit_edges (void);
112 \f
113 /* Sets EDGE_LOOP_EXIT flag for all loop exits.  */
114 static void
115 mark_loop_exit_edges (void)
116 {
117   struct loops loops;
118   basic_block bb;
119   edge e;
120   
121   flow_loops_find (&loops, LOOP_TREE);
122   free_dominance_info (CDI_DOMINATORS);
123   
124   if (loops.num > 1)
125     {
126       FOR_EACH_BB (bb)
127         {
128           for (e = bb->succ; e; e = e->succ_next)
129             {
130               if (find_common_loop (bb->loop_father, e->dest->loop_father)
131                   != bb->loop_father)
132                 e->flags |= EDGE_LOOP_EXIT;
133               else
134                 e->flags &= ~EDGE_LOOP_EXIT;
135             }
136         }
137     }
138
139   flow_loops_free (&loops);
140 }
141
142 /* Count the number of non-jump active insns in BB.  */
143
144 static int
145 count_bb_insns (basic_block bb)
146 {
147   int count = 0;
148   rtx insn = BB_HEAD (bb);
149
150   while (1)
151     {
152       if (GET_CODE (insn) == CALL_INSN || GET_CODE (insn) == INSN)
153         count++;
154
155       if (insn == BB_END (bb))
156         break;
157       insn = NEXT_INSN (insn);
158     }
159
160   return count;
161 }
162
163 /* Return the first non-jump active insn in the basic block.  */
164
165 static rtx
166 first_active_insn (basic_block bb)
167 {
168   rtx insn = BB_HEAD (bb);
169
170   if (GET_CODE (insn) == CODE_LABEL)
171     {
172       if (insn == BB_END (bb))
173         return NULL_RTX;
174       insn = NEXT_INSN (insn);
175     }
176
177   while (GET_CODE (insn) == NOTE)
178     {
179       if (insn == BB_END (bb))
180         return NULL_RTX;
181       insn = NEXT_INSN (insn);
182     }
183
184   if (GET_CODE (insn) == JUMP_INSN)
185     return NULL_RTX;
186
187   return insn;
188 }
189
190 /* Return the last non-jump active (non-jump) insn in the basic block.  */
191
192 static rtx
193 last_active_insn (basic_block bb, int skip_use_p)
194 {
195   rtx insn = BB_END (bb);
196   rtx head = BB_HEAD (bb);
197
198   while (GET_CODE (insn) == NOTE
199          || GET_CODE (insn) == JUMP_INSN
200          || (skip_use_p
201              && GET_CODE (insn) == INSN
202              && GET_CODE (PATTERN (insn)) == USE))
203     {
204       if (insn == head)
205         return NULL_RTX;
206       insn = PREV_INSN (insn);
207     }
208
209   if (GET_CODE (insn) == CODE_LABEL)
210     return NULL_RTX;
211
212   return insn;
213 }
214
215 /* Return the basic block reached by falling though the basic block BB.  */
216
217 static basic_block
218 block_fallthru (basic_block bb)
219 {
220   edge e;
221
222   for (e = bb->succ;
223        e != NULL_EDGE && (e->flags & EDGE_FALLTHRU) == 0;
224        e = e->succ_next)
225     ;
226
227   return (e) ? e->dest : NULL_BLOCK;
228 }
229 \f
230 /* Go through a bunch of insns, converting them to conditional
231    execution format if possible.  Return TRUE if all of the non-note
232    insns were processed.  */
233
234 static int
235 cond_exec_process_insns (ce_if_block_t *ce_info ATTRIBUTE_UNUSED,
236                          /* if block information */rtx start,
237                          /* first insn to look at */rtx end,
238                          /* last insn to look at */rtx test,
239                          /* conditional execution test */rtx prob_val,
240                          /* probability of branch taken. */int mod_ok)
241 {
242   int must_be_last = FALSE;
243   rtx insn;
244   rtx xtest;
245   rtx pattern;
246
247   if (!start || !end)
248     return FALSE;
249
250   for (insn = start; ; insn = NEXT_INSN (insn))
251     {
252       if (GET_CODE (insn) == NOTE)
253         goto insn_done;
254
255       if (GET_CODE (insn) != INSN && GET_CODE (insn) != CALL_INSN)
256         abort ();
257
258       /* Remove USE insns that get in the way.  */
259       if (reload_completed && GET_CODE (PATTERN (insn)) == USE)
260         {
261           /* ??? Ug.  Actually unlinking the thing is problematic,
262              given what we'd have to coordinate with our callers.  */
263           SET_INSN_DELETED (insn);
264           goto insn_done;
265         }
266
267       /* Last insn wasn't last?  */
268       if (must_be_last)
269         return FALSE;
270
271       if (modified_in_p (test, insn))
272         {
273           if (!mod_ok)
274             return FALSE;
275           must_be_last = TRUE;
276         }
277
278       /* Now build the conditional form of the instruction.  */
279       pattern = PATTERN (insn);
280       xtest = copy_rtx (test);
281
282       /* If this is already a COND_EXEC, rewrite the test to be an AND of the
283          two conditions.  */
284       if (GET_CODE (pattern) == COND_EXEC)
285         {
286           if (GET_MODE (xtest) != GET_MODE (COND_EXEC_TEST (pattern)))
287             return FALSE;
288
289           xtest = gen_rtx_AND (GET_MODE (xtest), xtest,
290                                COND_EXEC_TEST (pattern));
291           pattern = COND_EXEC_CODE (pattern);
292         }
293
294       pattern = gen_rtx_COND_EXEC (VOIDmode, xtest, pattern);
295
296       /* If the machine needs to modify the insn being conditionally executed,
297          say for example to force a constant integer operand into a temp
298          register, do so here.  */
299 #ifdef IFCVT_MODIFY_INSN
300       IFCVT_MODIFY_INSN (ce_info, pattern, insn);
301       if (! pattern)
302         return FALSE;
303 #endif
304
305       validate_change (insn, &PATTERN (insn), pattern, 1);
306
307       if (GET_CODE (insn) == CALL_INSN && prob_val)
308         validate_change (insn, &REG_NOTES (insn),
309                          alloc_EXPR_LIST (REG_BR_PROB, prob_val,
310                                           REG_NOTES (insn)), 1);
311
312     insn_done:
313       if (insn == end)
314         break;
315     }
316
317   return TRUE;
318 }
319
320 /* Return the condition for a jump.  Do not do any special processing.  */
321
322 static rtx
323 cond_exec_get_condition (rtx jump)
324 {
325   rtx test_if, cond;
326
327   if (any_condjump_p (jump))
328     test_if = SET_SRC (pc_set (jump));
329   else
330     return NULL_RTX;
331   cond = XEXP (test_if, 0);
332
333   /* If this branches to JUMP_LABEL when the condition is false,
334      reverse the condition.  */
335   if (GET_CODE (XEXP (test_if, 2)) == LABEL_REF
336       && XEXP (XEXP (test_if, 2), 0) == JUMP_LABEL (jump))
337     {
338       enum rtx_code rev = reversed_comparison_code (cond, jump);
339       if (rev == UNKNOWN)
340         return NULL_RTX;
341
342       cond = gen_rtx_fmt_ee (rev, GET_MODE (cond), XEXP (cond, 0),
343                              XEXP (cond, 1));
344     }
345
346   return cond;
347 }
348
349 /* Given a simple IF-THEN or IF-THEN-ELSE block, attempt to convert it
350    to conditional execution.  Return TRUE if we were successful at
351    converting the block.  */
352
353 static int
354 cond_exec_process_if_block (ce_if_block_t * ce_info,
355                             /* if block information */int do_multiple_p)
356 {
357   basic_block test_bb = ce_info->test_bb;       /* last test block */
358   basic_block then_bb = ce_info->then_bb;       /* THEN */
359   basic_block else_bb = ce_info->else_bb;       /* ELSE or NULL */
360   rtx test_expr;                /* expression in IF_THEN_ELSE that is tested */
361   rtx then_start;               /* first insn in THEN block */
362   rtx then_end;                 /* last insn + 1 in THEN block */
363   rtx else_start = NULL_RTX;    /* first insn in ELSE block or NULL */
364   rtx else_end = NULL_RTX;      /* last insn + 1 in ELSE block */
365   int max;                      /* max # of insns to convert.  */
366   int then_mod_ok;              /* whether conditional mods are ok in THEN */
367   rtx true_expr;                /* test for else block insns */
368   rtx false_expr;               /* test for then block insns */
369   rtx true_prob_val;            /* probability of else block */
370   rtx false_prob_val;           /* probability of then block */
371   int n_insns;
372   enum rtx_code false_code;
373
374   /* If test is comprised of && or || elements, and we've failed at handling
375      all of them together, just use the last test if it is the special case of
376      && elements without an ELSE block.  */
377   if (!do_multiple_p && ce_info->num_multiple_test_blocks)
378     {
379       if (else_bb || ! ce_info->and_and_p)
380         return FALSE;
381
382       ce_info->test_bb = test_bb = ce_info->last_test_bb;
383       ce_info->num_multiple_test_blocks = 0;
384       ce_info->num_and_and_blocks = 0;
385       ce_info->num_or_or_blocks = 0;
386     }
387
388   /* Find the conditional jump to the ELSE or JOIN part, and isolate
389      the test.  */
390   test_expr = cond_exec_get_condition (BB_END (test_bb));
391   if (! test_expr)
392     return FALSE;
393
394   /* If the conditional jump is more than just a conditional jump,
395      then we can not do conditional execution conversion on this block.  */
396   if (! onlyjump_p (BB_END (test_bb)))
397     return FALSE;
398
399   /* Collect the bounds of where we're to search, skipping any labels, jumps
400      and notes at the beginning and end of the block.  Then count the total
401      number of insns and see if it is small enough to convert.  */
402   then_start = first_active_insn (then_bb);
403   then_end = last_active_insn (then_bb, TRUE);
404   n_insns = ce_info->num_then_insns = count_bb_insns (then_bb);
405   max = MAX_CONDITIONAL_EXECUTE;
406
407   if (else_bb)
408     {
409       max *= 2;
410       else_start = first_active_insn (else_bb);
411       else_end = last_active_insn (else_bb, TRUE);
412       n_insns += ce_info->num_else_insns = count_bb_insns (else_bb);
413     }
414
415   if (n_insns > max)
416     return FALSE;
417
418   /* Map test_expr/test_jump into the appropriate MD tests to use on
419      the conditionally executed code.  */
420
421   true_expr = test_expr;
422
423   false_code = reversed_comparison_code (true_expr, BB_END (test_bb));
424   if (false_code != UNKNOWN)
425     false_expr = gen_rtx_fmt_ee (false_code, GET_MODE (true_expr),
426                                  XEXP (true_expr, 0), XEXP (true_expr, 1));
427   else
428     false_expr = NULL_RTX;
429
430 #ifdef IFCVT_MODIFY_TESTS
431   /* If the machine description needs to modify the tests, such as setting a
432      conditional execution register from a comparison, it can do so here.  */
433   IFCVT_MODIFY_TESTS (ce_info, true_expr, false_expr);
434
435   /* See if the conversion failed.  */
436   if (!true_expr || !false_expr)
437     goto fail;
438 #endif
439
440   true_prob_val = find_reg_note (BB_END (test_bb), REG_BR_PROB, NULL_RTX);
441   if (true_prob_val)
442     {
443       true_prob_val = XEXP (true_prob_val, 0);
444       false_prob_val = GEN_INT (REG_BR_PROB_BASE - INTVAL (true_prob_val));
445     }
446   else
447     false_prob_val = NULL_RTX;
448
449   /* If we have && or || tests, do them here.  These tests are in the adjacent
450      blocks after the first block containing the test.  */
451   if (ce_info->num_multiple_test_blocks > 0)
452     {
453       basic_block bb = test_bb;
454       basic_block last_test_bb = ce_info->last_test_bb;
455
456       if (! false_expr)
457         goto fail;
458
459       do
460         {
461           rtx start, end;
462           rtx t, f;
463
464           bb = block_fallthru (bb);
465           start = first_active_insn (bb);
466           end = last_active_insn (bb, TRUE);
467           if (start
468               && ! cond_exec_process_insns (ce_info, start, end, false_expr,
469                                             false_prob_val, FALSE))
470             goto fail;
471
472           /* If the conditional jump is more than just a conditional jump, then
473              we can not do conditional execution conversion on this block.  */
474           if (! onlyjump_p (BB_END (bb)))
475             goto fail;
476
477           /* Find the conditional jump and isolate the test.  */
478           t = cond_exec_get_condition (BB_END (bb));
479           if (! t)
480             goto fail;
481
482           f = gen_rtx_fmt_ee (reverse_condition (GET_CODE (t)),
483                               GET_MODE (t),
484                               XEXP (t, 0),
485                               XEXP (t, 1));
486
487           if (ce_info->and_and_p)
488             {
489               t = gen_rtx_AND (GET_MODE (t), true_expr, t);
490               f = gen_rtx_IOR (GET_MODE (t), false_expr, f);
491             }
492           else
493             {
494               t = gen_rtx_IOR (GET_MODE (t), true_expr, t);
495               f = gen_rtx_AND (GET_MODE (t), false_expr, f);
496             }
497
498           /* If the machine description needs to modify the tests, such as
499              setting a conditional execution register from a comparison, it can
500              do so here.  */
501 #ifdef IFCVT_MODIFY_MULTIPLE_TESTS
502           IFCVT_MODIFY_MULTIPLE_TESTS (ce_info, bb, t, f);
503
504           /* See if the conversion failed.  */
505           if (!t || !f)
506             goto fail;
507 #endif
508
509           true_expr = t;
510           false_expr = f;
511         }
512       while (bb != last_test_bb);
513     }
514
515   /* For IF-THEN-ELSE blocks, we don't allow modifications of the test
516      on then THEN block.  */
517   then_mod_ok = (else_bb == NULL_BLOCK);
518
519   /* Go through the THEN and ELSE blocks converting the insns if possible
520      to conditional execution.  */
521
522   if (then_end
523       && (! false_expr
524           || ! cond_exec_process_insns (ce_info, then_start, then_end,
525                                         false_expr, false_prob_val,
526                                         then_mod_ok)))
527     goto fail;
528
529   if (else_bb && else_end
530       && ! cond_exec_process_insns (ce_info, else_start, else_end,
531                                     true_expr, true_prob_val, TRUE))
532     goto fail;
533
534   /* If we cannot apply the changes, fail.  Do not go through the normal fail
535      processing, since apply_change_group will call cancel_changes.  */
536   if (! apply_change_group ())
537     {
538 #ifdef IFCVT_MODIFY_CANCEL
539       /* Cancel any machine dependent changes.  */
540       IFCVT_MODIFY_CANCEL (ce_info);
541 #endif
542       return FALSE;
543     }
544
545 #ifdef IFCVT_MODIFY_FINAL
546   /* Do any machine dependent final modifications.  */
547   IFCVT_MODIFY_FINAL (ce_info);
548 #endif
549
550   /* Conversion succeeded.  */
551   if (dump_file)
552     fprintf (dump_file, "%d insn%s converted to conditional execution.\n",
553              n_insns, (n_insns == 1) ? " was" : "s were");
554
555   /* Merge the blocks!  */
556   merge_if_block (ce_info);
557   cond_exec_changed_p = TRUE;
558   return TRUE;
559
560  fail:
561 #ifdef IFCVT_MODIFY_CANCEL
562   /* Cancel any machine dependent changes.  */
563   IFCVT_MODIFY_CANCEL (ce_info);
564 #endif
565
566   cancel_changes (0);
567   return FALSE;
568 }
569 \f
570 /* Used by noce_process_if_block to communicate with its subroutines.
571
572    The subroutines know that A and B may be evaluated freely.  They
573    know that X is a register.  They should insert new instructions
574    before cond_earliest.  */
575
576 struct noce_if_info
577 {
578   basic_block test_bb;
579   rtx insn_a, insn_b;
580   rtx x, a, b;
581   rtx jump, cond, cond_earliest;
582 };
583
584 static rtx noce_emit_store_flag (struct noce_if_info *, rtx, int, int);
585 static int noce_try_move (struct noce_if_info *);
586 static int noce_try_store_flag (struct noce_if_info *);
587 static int noce_try_addcc (struct noce_if_info *);
588 static int noce_try_store_flag_constants (struct noce_if_info *);
589 static int noce_try_store_flag_mask (struct noce_if_info *);
590 static rtx noce_emit_cmove (struct noce_if_info *, rtx, enum rtx_code, rtx,
591                             rtx, rtx, rtx);
592 static int noce_try_cmove (struct noce_if_info *);
593 static int noce_try_cmove_arith (struct noce_if_info *);
594 static rtx noce_get_alt_condition (struct noce_if_info *, rtx, rtx *);
595 static int noce_try_minmax (struct noce_if_info *);
596 static int noce_try_abs (struct noce_if_info *);
597 static int noce_try_sign_mask (struct noce_if_info *);
598
599 /* Helper function for noce_try_store_flag*.  */
600
601 static rtx
602 noce_emit_store_flag (struct noce_if_info *if_info, rtx x, int reversep,
603                       int normalize)
604 {
605   rtx cond = if_info->cond;
606   int cond_complex;
607   enum rtx_code code;
608
609   cond_complex = (! general_operand (XEXP (cond, 0), VOIDmode)
610                   || ! general_operand (XEXP (cond, 1), VOIDmode));
611
612   /* If earliest == jump, or when the condition is complex, try to
613      build the store_flag insn directly.  */
614
615   if (cond_complex)
616     cond = XEXP (SET_SRC (pc_set (if_info->jump)), 0);
617
618   if (reversep)
619     code = reversed_comparison_code (cond, if_info->jump);
620   else
621     code = GET_CODE (cond);
622
623   if ((if_info->cond_earliest == if_info->jump || cond_complex)
624       && (normalize == 0 || STORE_FLAG_VALUE == normalize))
625     {
626       rtx tmp;
627
628       tmp = gen_rtx_fmt_ee (code, GET_MODE (x), XEXP (cond, 0),
629                             XEXP (cond, 1));
630       tmp = gen_rtx_SET (VOIDmode, x, tmp);
631
632       start_sequence ();
633       tmp = emit_insn (tmp);
634
635       if (recog_memoized (tmp) >= 0)
636         {
637           tmp = get_insns ();
638           end_sequence ();
639           emit_insn (tmp);
640
641           if_info->cond_earliest = if_info->jump;
642
643           return x;
644         }
645
646       end_sequence ();
647     }
648
649   /* Don't even try if the comparison operands or the mode of X are weird.  */
650   if (cond_complex || !SCALAR_INT_MODE_P (GET_MODE (x)))
651     return NULL_RTX;
652
653   return emit_store_flag (x, code, XEXP (cond, 0),
654                           XEXP (cond, 1), VOIDmode,
655                           (code == LTU || code == LEU
656                            || code == GEU || code == GTU), normalize);
657 }
658
659 /* Emit instruction to move an rtx, possibly into STRICT_LOW_PART.
660    X is the destination/target and Y is the value to copy.  */
661
662 static void
663 noce_emit_move_insn (rtx x, rtx y)
664 {
665   enum machine_mode outmode, inmode;
666   rtx outer, inner;
667   int bitpos;
668
669   if (GET_CODE (x) != STRICT_LOW_PART)
670     {
671       emit_move_insn (x, y);
672       return;
673     }
674
675   outer = XEXP (x, 0);
676   inner = XEXP (outer, 0);
677   outmode = GET_MODE (outer);
678   inmode = GET_MODE (inner);
679   bitpos = SUBREG_BYTE (outer) * BITS_PER_UNIT;
680   store_bit_field (inner, GET_MODE_BITSIZE (outmode), bitpos, outmode, y,
681                    GET_MODE_BITSIZE (inmode));
682 }
683
684 /* Return sequence of instructions generated by if conversion.  This
685    function calls end_sequence() to end the current stream, ensures
686    that are instructions are unshared, recognizable non-jump insns.
687    On failure, this function returns a NULL_RTX.  */
688
689 static rtx
690 end_ifcvt_sequence (struct noce_if_info *if_info)
691 {
692   rtx insn;
693   rtx seq = get_insns ();
694
695   set_used_flags (if_info->x);
696   set_used_flags (if_info->cond);
697   unshare_all_rtl_in_chain (seq);
698   end_sequence ();
699
700   /* Make sure that all of the instructions emitted are recognizable,
701      and that we haven't introduced a new jump instruction.
702      As an exercise for the reader, build a general mechanism that
703      allows proper placement of required clobbers.  */
704   for (insn = seq; insn; insn = NEXT_INSN (insn))
705     if (GET_CODE (insn) == JUMP_INSN
706         || recog_memoized (insn) == -1)
707       return NULL_RTX;
708
709   return seq;
710 }
711
712 /* Convert "if (a != b) x = a; else x = b" into "x = a" and
713    "if (a == b) x = a; else x = b" into "x = b".  */
714
715 static int
716 noce_try_move (struct noce_if_info *if_info)
717 {
718   rtx cond = if_info->cond;
719   enum rtx_code code = GET_CODE (cond);
720   rtx y, seq;
721
722   if (code != NE && code != EQ)
723     return FALSE;
724
725   /* This optimization isn't valid if either A or B could be a NaN
726      or a signed zero.  */
727   if (HONOR_NANS (GET_MODE (if_info->x))
728       || HONOR_SIGNED_ZEROS (GET_MODE (if_info->x)))
729     return FALSE;
730
731   /* Check whether the operands of the comparison are A and in
732      either order.  */
733   if ((rtx_equal_p (if_info->a, XEXP (cond, 0))
734        && rtx_equal_p (if_info->b, XEXP (cond, 1)))
735       || (rtx_equal_p (if_info->a, XEXP (cond, 1))
736           && rtx_equal_p (if_info->b, XEXP (cond, 0))))
737     {
738       y = (code == EQ) ? if_info->a : if_info->b;
739
740       /* Avoid generating the move if the source is the destination.  */
741       if (! rtx_equal_p (if_info->x, y))
742         {
743           start_sequence ();
744           noce_emit_move_insn (if_info->x, y);
745           seq = end_ifcvt_sequence (if_info);
746           if (!seq)
747             return FALSE;
748
749           emit_insn_before_setloc (seq, if_info->jump,
750                                    INSN_LOCATOR (if_info->insn_a));
751         }
752       return TRUE;
753     }
754   return FALSE;
755 }
756
757 /* Convert "if (test) x = 1; else x = 0".
758
759    Only try 0 and STORE_FLAG_VALUE here.  Other combinations will be
760    tried in noce_try_store_flag_constants after noce_try_cmove has had
761    a go at the conversion.  */
762
763 static int
764 noce_try_store_flag (struct noce_if_info *if_info)
765 {
766   int reversep;
767   rtx target, seq;
768
769   if (GET_CODE (if_info->b) == CONST_INT
770       && INTVAL (if_info->b) == STORE_FLAG_VALUE
771       && if_info->a == const0_rtx)
772     reversep = 0;
773   else if (if_info->b == const0_rtx
774            && GET_CODE (if_info->a) == CONST_INT
775            && INTVAL (if_info->a) == STORE_FLAG_VALUE
776            && (reversed_comparison_code (if_info->cond, if_info->jump)
777                != UNKNOWN))
778     reversep = 1;
779   else
780     return FALSE;
781
782   start_sequence ();
783
784   target = noce_emit_store_flag (if_info, if_info->x, reversep, 0);
785   if (target)
786     {
787       if (target != if_info->x)
788         noce_emit_move_insn (if_info->x, target);
789
790       seq = end_ifcvt_sequence (if_info);
791       if (! seq)
792         return FALSE;
793
794       emit_insn_before_setloc (seq, if_info->jump,
795                                INSN_LOCATOR (if_info->insn_a));
796       return TRUE;
797     }
798   else
799     {
800       end_sequence ();
801       return FALSE;
802     }
803 }
804
805 /* Convert "if (test) x = a; else x = b", for A and B constant.  */
806
807 static int
808 noce_try_store_flag_constants (struct noce_if_info *if_info)
809 {
810   rtx target, seq;
811   int reversep;
812   HOST_WIDE_INT itrue, ifalse, diff, tmp;
813   int normalize, can_reverse;
814   enum machine_mode mode;
815
816   if (! no_new_pseudos
817       && GET_CODE (if_info->a) == CONST_INT
818       && GET_CODE (if_info->b) == CONST_INT)
819     {
820       mode = GET_MODE (if_info->x);
821       ifalse = INTVAL (if_info->a);
822       itrue = INTVAL (if_info->b);
823
824       /* Make sure we can represent the difference between the two values.  */
825       if ((itrue - ifalse > 0)
826           != ((ifalse < 0) != (itrue < 0) ? ifalse < 0 : ifalse < itrue))
827         return FALSE;
828
829       diff = trunc_int_for_mode (itrue - ifalse, mode);
830
831       can_reverse = (reversed_comparison_code (if_info->cond, if_info->jump)
832                      != UNKNOWN);
833
834       reversep = 0;
835       if (diff == STORE_FLAG_VALUE || diff == -STORE_FLAG_VALUE)
836         normalize = 0;
837       else if (ifalse == 0 && exact_log2 (itrue) >= 0
838                && (STORE_FLAG_VALUE == 1
839                    || BRANCH_COST >= 2))
840         normalize = 1;
841       else if (itrue == 0 && exact_log2 (ifalse) >= 0 && can_reverse
842                && (STORE_FLAG_VALUE == 1 || BRANCH_COST >= 2))
843         normalize = 1, reversep = 1;
844       else if (itrue == -1
845                && (STORE_FLAG_VALUE == -1
846                    || BRANCH_COST >= 2))
847         normalize = -1;
848       else if (ifalse == -1 && can_reverse
849                && (STORE_FLAG_VALUE == -1 || BRANCH_COST >= 2))
850         normalize = -1, reversep = 1;
851       else if ((BRANCH_COST >= 2 && STORE_FLAG_VALUE == -1)
852                || BRANCH_COST >= 3)
853         normalize = -1;
854       else
855         return FALSE;
856
857       if (reversep)
858         {
859           tmp = itrue; itrue = ifalse; ifalse = tmp;
860           diff = trunc_int_for_mode (-diff, mode);
861         }
862
863       start_sequence ();
864       target = noce_emit_store_flag (if_info, if_info->x, reversep, normalize);
865       if (! target)
866         {
867           end_sequence ();
868           return FALSE;
869         }
870
871       /* if (test) x = 3; else x = 4;
872          =>   x = 3 + (test == 0);  */
873       if (diff == STORE_FLAG_VALUE || diff == -STORE_FLAG_VALUE)
874         {
875           target = expand_simple_binop (mode,
876                                         (diff == STORE_FLAG_VALUE
877                                          ? PLUS : MINUS),
878                                         GEN_INT (ifalse), target, if_info->x, 0,
879                                         OPTAB_WIDEN);
880         }
881
882       /* if (test) x = 8; else x = 0;
883          =>   x = (test != 0) << 3;  */
884       else if (ifalse == 0 && (tmp = exact_log2 (itrue)) >= 0)
885         {
886           target = expand_simple_binop (mode, ASHIFT,
887                                         target, GEN_INT (tmp), if_info->x, 0,
888                                         OPTAB_WIDEN);
889         }
890
891       /* if (test) x = -1; else x = b;
892          =>   x = -(test != 0) | b;  */
893       else if (itrue == -1)
894         {
895           target = expand_simple_binop (mode, IOR,
896                                         target, GEN_INT (ifalse), if_info->x, 0,
897                                         OPTAB_WIDEN);
898         }
899
900       /* if (test) x = a; else x = b;
901          =>   x = (-(test != 0) & (b - a)) + a;  */
902       else
903         {
904           target = expand_simple_binop (mode, AND,
905                                         target, GEN_INT (diff), if_info->x, 0,
906                                         OPTAB_WIDEN);
907           if (target)
908             target = expand_simple_binop (mode, PLUS,
909                                           target, GEN_INT (ifalse),
910                                           if_info->x, 0, OPTAB_WIDEN);
911         }
912
913       if (! target)
914         {
915           end_sequence ();
916           return FALSE;
917         }
918
919       if (target != if_info->x)
920         noce_emit_move_insn (if_info->x, target);
921
922       seq = end_ifcvt_sequence (if_info);
923       if (!seq)
924         return FALSE;
925
926       emit_insn_before_setloc (seq, if_info->jump,
927                                INSN_LOCATOR (if_info->insn_a));
928       return TRUE;
929     }
930
931   return FALSE;
932 }
933
934 /* Convert "if (test) foo++" into "foo += (test != 0)", and
935    similarly for "foo--".  */
936
937 static int
938 noce_try_addcc (struct noce_if_info *if_info)
939 {
940   rtx target, seq;
941   int subtract, normalize;
942
943   if (! no_new_pseudos
944       && GET_CODE (if_info->a) == PLUS
945       && rtx_equal_p (XEXP (if_info->a, 0), if_info->b)
946       && (reversed_comparison_code (if_info->cond, if_info->jump)
947           != UNKNOWN))
948     {
949       rtx cond = if_info->cond;
950       enum rtx_code code = reversed_comparison_code (cond, if_info->jump);
951
952       /* First try to use addcc pattern.  */
953       if (general_operand (XEXP (cond, 0), VOIDmode)
954           && general_operand (XEXP (cond, 1), VOIDmode))
955         {
956           start_sequence ();
957           target = emit_conditional_add (if_info->x, code,
958                                          XEXP (cond, 0),
959                                          XEXP (cond, 1),
960                                          VOIDmode,
961                                          if_info->b,
962                                          XEXP (if_info->a, 1),
963                                          GET_MODE (if_info->x),
964                                          (code == LTU || code == GEU
965                                           || code == LEU || code == GTU));
966           if (target)
967             {
968               if (target != if_info->x)
969                 noce_emit_move_insn (if_info->x, target);
970
971               seq = end_ifcvt_sequence (if_info);
972               if (!seq)
973                 return FALSE;
974
975               emit_insn_before_setloc (seq, if_info->jump,
976                                        INSN_LOCATOR (if_info->insn_a));
977               return TRUE;
978             }
979           end_sequence ();
980         }
981
982       /* If that fails, construct conditional increment or decrement using
983          setcc.  */
984       if (BRANCH_COST >= 2
985           && (XEXP (if_info->a, 1) == const1_rtx
986               || XEXP (if_info->a, 1) == constm1_rtx))
987         {
988           start_sequence ();
989           if (STORE_FLAG_VALUE == INTVAL (XEXP (if_info->a, 1)))
990             subtract = 0, normalize = 0;
991           else if (-STORE_FLAG_VALUE == INTVAL (XEXP (if_info->a, 1)))
992             subtract = 1, normalize = 0;
993           else
994             subtract = 0, normalize = INTVAL (XEXP (if_info->a, 1));
995
996
997           target = noce_emit_store_flag (if_info,
998                                          gen_reg_rtx (GET_MODE (if_info->x)),
999                                          1, normalize);
1000
1001           if (target)
1002             target = expand_simple_binop (GET_MODE (if_info->x),
1003                                           subtract ? MINUS : PLUS,
1004                                           if_info->b, target, if_info->x,
1005                                           0, OPTAB_WIDEN);
1006           if (target)
1007             {
1008               if (target != if_info->x)
1009                 noce_emit_move_insn (if_info->x, target);
1010
1011               seq = end_ifcvt_sequence (if_info);
1012               if (!seq)
1013                 return FALSE;
1014
1015               emit_insn_before_setloc (seq, if_info->jump,
1016                                        INSN_LOCATOR (if_info->insn_a));
1017               return TRUE;
1018             }
1019           end_sequence ();
1020         }
1021     }
1022
1023   return FALSE;
1024 }
1025
1026 /* Convert "if (test) x = 0;" to "x &= -(test == 0);"  */
1027
1028 static int
1029 noce_try_store_flag_mask (struct noce_if_info *if_info)
1030 {
1031   rtx target, seq;
1032   int reversep;
1033
1034   reversep = 0;
1035   if (! no_new_pseudos
1036       && (BRANCH_COST >= 2
1037           || STORE_FLAG_VALUE == -1)
1038       && ((if_info->a == const0_rtx
1039            && rtx_equal_p (if_info->b, if_info->x))
1040           || ((reversep = (reversed_comparison_code (if_info->cond,
1041                                                      if_info->jump)
1042                            != UNKNOWN))
1043               && if_info->b == const0_rtx
1044               && rtx_equal_p (if_info->a, if_info->x))))
1045     {
1046       start_sequence ();
1047       target = noce_emit_store_flag (if_info,
1048                                      gen_reg_rtx (GET_MODE (if_info->x)),
1049                                      reversep, -1);
1050       if (target)
1051         target = expand_simple_binop (GET_MODE (if_info->x), AND,
1052                                       if_info->x,
1053                                       target, if_info->x, 0,
1054                                       OPTAB_WIDEN);
1055
1056       if (target)
1057         {
1058           if (target != if_info->x)
1059             noce_emit_move_insn (if_info->x, target);
1060
1061           seq = end_ifcvt_sequence (if_info);
1062           if (!seq)
1063             return FALSE;
1064
1065           emit_insn_before_setloc (seq, if_info->jump,
1066                                    INSN_LOCATOR (if_info->insn_a));
1067           return TRUE;
1068         }
1069
1070       end_sequence ();
1071     }
1072
1073   return FALSE;
1074 }
1075
1076 /* Helper function for noce_try_cmove and noce_try_cmove_arith.  */
1077
1078 static rtx
1079 noce_emit_cmove (struct noce_if_info *if_info, rtx x, enum rtx_code code,
1080                  rtx cmp_a, rtx cmp_b, rtx vfalse, rtx vtrue)
1081 {
1082   /* If earliest == jump, try to build the cmove insn directly.
1083      This is helpful when combine has created some complex condition
1084      (like for alpha's cmovlbs) that we can't hope to regenerate
1085      through the normal interface.  */
1086
1087   if (if_info->cond_earliest == if_info->jump)
1088     {
1089       rtx tmp;
1090
1091       tmp = gen_rtx_fmt_ee (code, GET_MODE (if_info->cond), cmp_a, cmp_b);
1092       tmp = gen_rtx_IF_THEN_ELSE (GET_MODE (x), tmp, vtrue, vfalse);
1093       tmp = gen_rtx_SET (VOIDmode, x, tmp);
1094
1095       start_sequence ();
1096       tmp = emit_insn (tmp);
1097
1098       if (recog_memoized (tmp) >= 0)
1099         {
1100           tmp = get_insns ();
1101           end_sequence ();
1102           emit_insn (tmp);
1103
1104           return x;
1105         }
1106
1107       end_sequence ();
1108     }
1109
1110   /* Don't even try if the comparison operands are weird.  */
1111   if (! general_operand (cmp_a, GET_MODE (cmp_a))
1112       || ! general_operand (cmp_b, GET_MODE (cmp_b)))
1113     return NULL_RTX;
1114
1115 #if HAVE_conditional_move
1116   return emit_conditional_move (x, code, cmp_a, cmp_b, VOIDmode,
1117                                 vtrue, vfalse, GET_MODE (x),
1118                                 (code == LTU || code == GEU
1119                                  || code == LEU || code == GTU));
1120 #else
1121   /* We'll never get here, as noce_process_if_block doesn't call the
1122      functions involved.  Ifdef code, however, should be discouraged
1123      because it leads to typos in the code not selected.  However,
1124      emit_conditional_move won't exist either.  */
1125   return NULL_RTX;
1126 #endif
1127 }
1128
1129 /* Try only simple constants and registers here.  More complex cases
1130    are handled in noce_try_cmove_arith after noce_try_store_flag_arith
1131    has had a go at it.  */
1132
1133 static int
1134 noce_try_cmove (struct noce_if_info *if_info)
1135 {
1136   enum rtx_code code;
1137   rtx target, seq;
1138
1139   if ((CONSTANT_P (if_info->a) || register_operand (if_info->a, VOIDmode))
1140       && (CONSTANT_P (if_info->b) || register_operand (if_info->b, VOIDmode)))
1141     {
1142       start_sequence ();
1143
1144       code = GET_CODE (if_info->cond);
1145       target = noce_emit_cmove (if_info, if_info->x, code,
1146                                 XEXP (if_info->cond, 0),
1147                                 XEXP (if_info->cond, 1),
1148                                 if_info->a, if_info->b);
1149
1150       if (target)
1151         {
1152           if (target != if_info->x)
1153             noce_emit_move_insn (if_info->x, target);
1154
1155           seq = end_ifcvt_sequence (if_info);
1156           if (!seq)
1157             return FALSE;
1158
1159           emit_insn_before_setloc (seq, if_info->jump,
1160                                    INSN_LOCATOR (if_info->insn_a));
1161           return TRUE;
1162         }
1163       else
1164         {
1165           end_sequence ();
1166           return FALSE;
1167         }
1168     }
1169
1170   return FALSE;
1171 }
1172
1173 /* Try more complex cases involving conditional_move.  */
1174
1175 static int
1176 noce_try_cmove_arith (struct noce_if_info *if_info)
1177 {
1178   rtx a = if_info->a;
1179   rtx b = if_info->b;
1180   rtx x = if_info->x;
1181   rtx insn_a, insn_b;
1182   rtx tmp, target;
1183   int is_mem = 0;
1184   enum rtx_code code;
1185
1186   /* A conditional move from two memory sources is equivalent to a
1187      conditional on their addresses followed by a load.  Don't do this
1188      early because it'll screw alias analysis.  Note that we've
1189      already checked for no side effects.  */
1190   if (! no_new_pseudos && cse_not_expected
1191       && MEM_P (a) && MEM_P (b)
1192       && BRANCH_COST >= 5)
1193     {
1194       a = XEXP (a, 0);
1195       b = XEXP (b, 0);
1196       x = gen_reg_rtx (Pmode);
1197       is_mem = 1;
1198     }
1199
1200   /* ??? We could handle this if we knew that a load from A or B could
1201      not fault.  This is also true if we've already loaded
1202      from the address along the path from ENTRY.  */
1203   else if (may_trap_p (a) || may_trap_p (b))
1204     return FALSE;
1205
1206   /* if (test) x = a + b; else x = c - d;
1207      => y = a + b;
1208         x = c - d;
1209         if (test)
1210           x = y;
1211   */
1212
1213   code = GET_CODE (if_info->cond);
1214   insn_a = if_info->insn_a;
1215   insn_b = if_info->insn_b;
1216
1217   /* Possibly rearrange operands to make things come out more natural.  */
1218   if (reversed_comparison_code (if_info->cond, if_info->jump) != UNKNOWN)
1219     {
1220       int reversep = 0;
1221       if (rtx_equal_p (b, x))
1222         reversep = 1;
1223       else if (general_operand (b, GET_MODE (b)))
1224         reversep = 1;
1225
1226       if (reversep)
1227         {
1228           code = reversed_comparison_code (if_info->cond, if_info->jump);
1229           tmp = a, a = b, b = tmp;
1230           tmp = insn_a, insn_a = insn_b, insn_b = tmp;
1231         }
1232     }
1233
1234   start_sequence ();
1235
1236   /* If either operand is complex, load it into a register first.
1237      The best way to do this is to copy the original insn.  In this
1238      way we preserve any clobbers etc that the insn may have had.
1239      This is of course not possible in the IS_MEM case.  */
1240   if (! general_operand (a, GET_MODE (a)))
1241     {
1242       rtx set;
1243
1244       if (no_new_pseudos)
1245         goto end_seq_and_fail;
1246
1247       if (is_mem)
1248         {
1249           tmp = gen_reg_rtx (GET_MODE (a));
1250           tmp = emit_insn (gen_rtx_SET (VOIDmode, tmp, a));
1251         }
1252       else if (! insn_a)
1253         goto end_seq_and_fail;
1254       else
1255         {
1256           a = gen_reg_rtx (GET_MODE (a));
1257           tmp = copy_rtx (insn_a);
1258           set = single_set (tmp);
1259           SET_DEST (set) = a;
1260           tmp = emit_insn (PATTERN (tmp));
1261         }
1262       if (recog_memoized (tmp) < 0)
1263         goto end_seq_and_fail;
1264     }
1265   if (! general_operand (b, GET_MODE (b)))
1266     {
1267       rtx set;
1268
1269       if (no_new_pseudos)
1270         goto end_seq_and_fail;
1271
1272       if (is_mem)
1273         {
1274           tmp = gen_reg_rtx (GET_MODE (b));
1275           tmp = emit_insn (gen_rtx_SET (VOIDmode,
1276                                         tmp,
1277                                         b));
1278         }
1279       else if (! insn_b)
1280         goto end_seq_and_fail;
1281       else
1282         {
1283           b = gen_reg_rtx (GET_MODE (b));
1284           tmp = copy_rtx (insn_b);
1285           set = single_set (tmp);
1286           SET_DEST (set) = b;
1287           tmp = emit_insn (PATTERN (tmp));
1288         }
1289       if (recog_memoized (tmp) < 0)
1290         goto end_seq_and_fail;
1291     }
1292
1293   target = noce_emit_cmove (if_info, x, code, XEXP (if_info->cond, 0),
1294                             XEXP (if_info->cond, 1), a, b);
1295
1296   if (! target)
1297     goto end_seq_and_fail;
1298
1299   /* If we're handling a memory for above, emit the load now.  */
1300   if (is_mem)
1301     {
1302       tmp = gen_rtx_MEM (GET_MODE (if_info->x), target);
1303
1304       /* Copy over flags as appropriate.  */
1305       if (MEM_VOLATILE_P (if_info->a) || MEM_VOLATILE_P (if_info->b))
1306         MEM_VOLATILE_P (tmp) = 1;
1307       if (MEM_IN_STRUCT_P (if_info->a) && MEM_IN_STRUCT_P (if_info->b))
1308         MEM_IN_STRUCT_P (tmp) = 1;
1309       if (MEM_SCALAR_P (if_info->a) && MEM_SCALAR_P (if_info->b))
1310         MEM_SCALAR_P (tmp) = 1;
1311       if (MEM_ALIAS_SET (if_info->a) == MEM_ALIAS_SET (if_info->b))
1312         set_mem_alias_set (tmp, MEM_ALIAS_SET (if_info->a));
1313       set_mem_align (tmp,
1314                      MIN (MEM_ALIGN (if_info->a), MEM_ALIGN (if_info->b)));
1315
1316       noce_emit_move_insn (if_info->x, tmp);
1317     }
1318   else if (target != x)
1319     noce_emit_move_insn (x, target);
1320
1321   tmp = end_ifcvt_sequence (if_info);
1322   if (!tmp)
1323     return FALSE;
1324
1325   emit_insn_before_setloc (tmp, if_info->jump, INSN_LOCATOR (if_info->insn_a));
1326   return TRUE;
1327
1328  end_seq_and_fail:
1329   end_sequence ();
1330   return FALSE;
1331 }
1332
1333 /* For most cases, the simplified condition we found is the best
1334    choice, but this is not the case for the min/max/abs transforms.
1335    For these we wish to know that it is A or B in the condition.  */
1336
1337 static rtx
1338 noce_get_alt_condition (struct noce_if_info *if_info, rtx target,
1339                         rtx *earliest)
1340 {
1341   rtx cond, set, insn;
1342   int reverse;
1343
1344   /* If target is already mentioned in the known condition, return it.  */
1345   if (reg_mentioned_p (target, if_info->cond))
1346     {
1347       *earliest = if_info->cond_earliest;
1348       return if_info->cond;
1349     }
1350
1351   set = pc_set (if_info->jump);
1352   cond = XEXP (SET_SRC (set), 0);
1353   reverse
1354     = GET_CODE (XEXP (SET_SRC (set), 2)) == LABEL_REF
1355       && XEXP (XEXP (SET_SRC (set), 2), 0) == JUMP_LABEL (if_info->jump);
1356
1357   /* If we're looking for a constant, try to make the conditional
1358      have that constant in it.  There are two reasons why it may
1359      not have the constant we want:
1360
1361      1. GCC may have needed to put the constant in a register, because
1362         the target can't compare directly against that constant.  For
1363         this case, we look for a SET immediately before the comparison
1364         that puts a constant in that register.
1365
1366      2. GCC may have canonicalized the conditional, for example
1367         replacing "if x < 4" with "if x <= 3".  We can undo that (or
1368         make equivalent types of changes) to get the constants we need
1369         if they're off by one in the right direction.  */
1370
1371   if (GET_CODE (target) == CONST_INT)
1372     {
1373       enum rtx_code code = GET_CODE (if_info->cond);
1374       rtx op_a = XEXP (if_info->cond, 0);
1375       rtx op_b = XEXP (if_info->cond, 1);
1376       rtx prev_insn;
1377
1378       /* First, look to see if we put a constant in a register.  */
1379       prev_insn = PREV_INSN (if_info->cond_earliest);
1380       if (prev_insn
1381           && INSN_P (prev_insn)
1382           && GET_CODE (PATTERN (prev_insn)) == SET)
1383         {
1384           rtx src = find_reg_equal_equiv_note (prev_insn);
1385           if (!src)
1386             src = SET_SRC (PATTERN (prev_insn));
1387           if (GET_CODE (src) == CONST_INT)
1388             {
1389               if (rtx_equal_p (op_a, SET_DEST (PATTERN (prev_insn))))
1390                 op_a = src;
1391               else if (rtx_equal_p (op_b, SET_DEST (PATTERN (prev_insn))))
1392                 op_b = src;
1393
1394               if (GET_CODE (op_a) == CONST_INT)
1395                 {
1396                   rtx tmp = op_a;
1397                   op_a = op_b;
1398                   op_b = tmp;
1399                   code = swap_condition (code);
1400                 }
1401             }
1402         }
1403
1404       /* Now, look to see if we can get the right constant by
1405          adjusting the conditional.  */
1406       if (GET_CODE (op_b) == CONST_INT)
1407         {
1408           HOST_WIDE_INT desired_val = INTVAL (target);
1409           HOST_WIDE_INT actual_val = INTVAL (op_b);
1410
1411           switch (code)
1412             {
1413             case LT:
1414               if (actual_val == desired_val + 1)
1415                 {
1416                   code = LE;
1417                   op_b = GEN_INT (desired_val);
1418                 }
1419               break;
1420             case LE:
1421               if (actual_val == desired_val - 1)
1422                 {
1423                   code = LT;
1424                   op_b = GEN_INT (desired_val);
1425                 }
1426               break;
1427             case GT:
1428               if (actual_val == desired_val - 1)
1429                 {
1430                   code = GE;
1431                   op_b = GEN_INT (desired_val);
1432                 }
1433               break;
1434             case GE:
1435               if (actual_val == desired_val + 1)
1436                 {
1437                   code = GT;
1438                   op_b = GEN_INT (desired_val);
1439                 }
1440               break;
1441             default:
1442               break;
1443             }
1444         }
1445
1446       /* If we made any changes, generate a new conditional that is
1447          equivalent to what we started with, but has the right
1448          constants in it.  */
1449       if (code != GET_CODE (if_info->cond)
1450           || op_a != XEXP (if_info->cond, 0)
1451           || op_b != XEXP (if_info->cond, 1))
1452         {
1453           cond = gen_rtx_fmt_ee (code, GET_MODE (cond), op_a, op_b);
1454           *earliest = if_info->cond_earliest;
1455           return cond;
1456         }
1457     }
1458
1459   cond = canonicalize_condition (if_info->jump, cond, reverse,
1460                                  earliest, target, false);
1461   if (! cond || ! reg_mentioned_p (target, cond))
1462     return NULL;
1463
1464   /* We almost certainly searched back to a different place.
1465      Need to re-verify correct lifetimes.  */
1466
1467   /* X may not be mentioned in the range (cond_earliest, jump].  */
1468   for (insn = if_info->jump; insn != *earliest; insn = PREV_INSN (insn))
1469     if (INSN_P (insn) && reg_overlap_mentioned_p (if_info->x, PATTERN (insn)))
1470       return NULL;
1471
1472   /* A and B may not be modified in the range [cond_earliest, jump).  */
1473   for (insn = *earliest; insn != if_info->jump; insn = NEXT_INSN (insn))
1474     if (INSN_P (insn)
1475         && (modified_in_p (if_info->a, insn)
1476             || modified_in_p (if_info->b, insn)))
1477       return NULL;
1478
1479   return cond;
1480 }
1481
1482 /* Convert "if (a < b) x = a; else x = b;" to "x = min(a, b);", etc.  */
1483
1484 static int
1485 noce_try_minmax (struct noce_if_info *if_info)
1486 {
1487   rtx cond, earliest, target, seq;
1488   enum rtx_code code, op;
1489   int unsignedp;
1490
1491   /* ??? Can't guarantee that expand_binop won't create pseudos.  */
1492   if (no_new_pseudos)
1493     return FALSE;
1494
1495   /* ??? Reject modes with NaNs or signed zeros since we don't know how
1496      they will be resolved with an SMIN/SMAX.  It wouldn't be too hard
1497      to get the target to tell us...  */
1498   if (HONOR_SIGNED_ZEROS (GET_MODE (if_info->x))
1499       || HONOR_NANS (GET_MODE (if_info->x)))
1500     return FALSE;
1501
1502   cond = noce_get_alt_condition (if_info, if_info->a, &earliest);
1503   if (!cond)
1504     return FALSE;
1505
1506   /* Verify the condition is of the form we expect, and canonicalize
1507      the comparison code.  */
1508   code = GET_CODE (cond);
1509   if (rtx_equal_p (XEXP (cond, 0), if_info->a))
1510     {
1511       if (! rtx_equal_p (XEXP (cond, 1), if_info->b))
1512         return FALSE;
1513     }
1514   else if (rtx_equal_p (XEXP (cond, 1), if_info->a))
1515     {
1516       if (! rtx_equal_p (XEXP (cond, 0), if_info->b))
1517         return FALSE;
1518       code = swap_condition (code);
1519     }
1520   else
1521     return FALSE;
1522
1523   /* Determine what sort of operation this is.  Note that the code is for
1524      a taken branch, so the code->operation mapping appears backwards.  */
1525   switch (code)
1526     {
1527     case LT:
1528     case LE:
1529     case UNLT:
1530     case UNLE:
1531       op = SMAX;
1532       unsignedp = 0;
1533       break;
1534     case GT:
1535     case GE:
1536     case UNGT:
1537     case UNGE:
1538       op = SMIN;
1539       unsignedp = 0;
1540       break;
1541     case LTU:
1542     case LEU:
1543       op = UMAX;
1544       unsignedp = 1;
1545       break;
1546     case GTU:
1547     case GEU:
1548       op = UMIN;
1549       unsignedp = 1;
1550       break;
1551     default:
1552       return FALSE;
1553     }
1554
1555   start_sequence ();
1556
1557   target = expand_simple_binop (GET_MODE (if_info->x), op,
1558                                 if_info->a, if_info->b,
1559                                 if_info->x, unsignedp, OPTAB_WIDEN);
1560   if (! target)
1561     {
1562       end_sequence ();
1563       return FALSE;
1564     }
1565   if (target != if_info->x)
1566     noce_emit_move_insn (if_info->x, target);
1567
1568   seq = end_ifcvt_sequence (if_info);
1569   if (!seq)
1570     return FALSE;
1571
1572   emit_insn_before_setloc (seq, if_info->jump, INSN_LOCATOR (if_info->insn_a));
1573   if_info->cond = cond;
1574   if_info->cond_earliest = earliest;
1575
1576   return TRUE;
1577 }
1578
1579 /* Convert "if (a < 0) x = -a; else x = a;" to "x = abs(a);", etc.  */
1580
1581 static int
1582 noce_try_abs (struct noce_if_info *if_info)
1583 {
1584   rtx cond, earliest, target, seq, a, b, c;
1585   int negate;
1586
1587   /* ??? Can't guarantee that expand_binop won't create pseudos.  */
1588   if (no_new_pseudos)
1589     return FALSE;
1590
1591   /* Recognize A and B as constituting an ABS or NABS.  */
1592   a = if_info->a;
1593   b = if_info->b;
1594   if (GET_CODE (a) == NEG && rtx_equal_p (XEXP (a, 0), b))
1595     negate = 0;
1596   else if (GET_CODE (b) == NEG && rtx_equal_p (XEXP (b, 0), a))
1597     {
1598       c = a; a = b; b = c;
1599       negate = 1;
1600     }
1601   else
1602     return FALSE;
1603
1604   cond = noce_get_alt_condition (if_info, b, &earliest);
1605   if (!cond)
1606     return FALSE;
1607
1608   /* Verify the condition is of the form we expect.  */
1609   if (rtx_equal_p (XEXP (cond, 0), b))
1610     c = XEXP (cond, 1);
1611   else if (rtx_equal_p (XEXP (cond, 1), b))
1612     c = XEXP (cond, 0);
1613   else
1614     return FALSE;
1615
1616   /* Verify that C is zero.  Search backward through the block for
1617      a REG_EQUAL note if necessary.  */
1618   if (REG_P (c))
1619     {
1620       rtx insn, note = NULL;
1621       for (insn = earliest;
1622            insn != BB_HEAD (if_info->test_bb);
1623            insn = PREV_INSN (insn))
1624         if (INSN_P (insn)
1625             && ((note = find_reg_note (insn, REG_EQUAL, c))
1626                 || (note = find_reg_note (insn, REG_EQUIV, c))))
1627           break;
1628       if (! note)
1629         return FALSE;
1630       c = XEXP (note, 0);
1631     }
1632   if (MEM_P (c)
1633       && GET_CODE (XEXP (c, 0)) == SYMBOL_REF
1634       && CONSTANT_POOL_ADDRESS_P (XEXP (c, 0)))
1635     c = get_pool_constant (XEXP (c, 0));
1636
1637   /* Work around funny ideas get_condition has wrt canonicalization.
1638      Note that these rtx constants are known to be CONST_INT, and
1639      therefore imply integer comparisons.  */
1640   if (c == constm1_rtx && GET_CODE (cond) == GT)
1641     ;
1642   else if (c == const1_rtx && GET_CODE (cond) == LT)
1643     ;
1644   else if (c != CONST0_RTX (GET_MODE (b)))
1645     return FALSE;
1646
1647   /* Determine what sort of operation this is.  */
1648   switch (GET_CODE (cond))
1649     {
1650     case LT:
1651     case LE:
1652     case UNLT:
1653     case UNLE:
1654       negate = !negate;
1655       break;
1656     case GT:
1657     case GE:
1658     case UNGT:
1659     case UNGE:
1660       break;
1661     default:
1662       return FALSE;
1663     }
1664
1665   start_sequence ();
1666
1667   target = expand_abs_nojump (GET_MODE (if_info->x), b, if_info->x, 1);
1668
1669   /* ??? It's a quandary whether cmove would be better here, especially
1670      for integers.  Perhaps combine will clean things up.  */
1671   if (target && negate)
1672     target = expand_simple_unop (GET_MODE (target), NEG, target, if_info->x, 0);
1673
1674   if (! target)
1675     {
1676       end_sequence ();
1677       return FALSE;
1678     }
1679
1680   if (target != if_info->x)
1681     noce_emit_move_insn (if_info->x, target);
1682
1683   seq = end_ifcvt_sequence (if_info);
1684   if (!seq)
1685     return FALSE;
1686
1687   emit_insn_before_setloc (seq, if_info->jump, INSN_LOCATOR (if_info->insn_a));
1688   if_info->cond = cond;
1689   if_info->cond_earliest = earliest;
1690
1691   return TRUE;
1692 }
1693
1694 /* Convert "if (m < 0) x = b; else x = 0;" to "x = (m >> C) & b;".  */
1695
1696 static int
1697 noce_try_sign_mask (struct noce_if_info *if_info)
1698 {
1699   rtx cond, t, m, c, seq;
1700   enum machine_mode mode;
1701   enum rtx_code code;
1702
1703   if (no_new_pseudos)
1704     return FALSE;
1705
1706   cond = if_info->cond;
1707   code = GET_CODE (cond);
1708   m = XEXP (cond, 0);
1709   c = XEXP (cond, 1);
1710
1711   t = NULL_RTX;
1712   if (if_info->a == const0_rtx)
1713     {
1714       if ((code == LT && c == const0_rtx)
1715           || (code == LE && c == constm1_rtx))
1716         t = if_info->b;
1717     }
1718   else if (if_info->b == const0_rtx)
1719     {
1720       if ((code == GE && c == const0_rtx)
1721           || (code == GT && c == constm1_rtx))
1722         t = if_info->a;
1723     }
1724
1725   if (! t || side_effects_p (t))
1726     return FALSE;
1727
1728   /* We currently don't handle different modes.  */
1729   mode = GET_MODE (t);
1730   if (GET_MODE (m) != mode)
1731     return FALSE;
1732
1733   /* This is only profitable if T is cheap.  */
1734   if (rtx_cost (t, SET) >= COSTS_N_INSNS (2))
1735     return FALSE;
1736
1737   start_sequence ();
1738   /* Use emit_store_flag to generate "m < 0 ? -1 : 0" instead of expanding
1739      "(signed) m >> 31" directly.  This benefits targets with specialized
1740      insns to obtain the signmask, but still uses ashr_optab otherwise.  */
1741   m = emit_store_flag (gen_reg_rtx (mode), LT, m, const0_rtx, mode, 0, -1);
1742   t = m ? expand_binop (mode, and_optab, m, t, NULL_RTX, 0, OPTAB_DIRECT)
1743         : NULL_RTX;
1744
1745   if (!t)
1746     {
1747       end_sequence ();
1748       return FALSE;
1749     }
1750
1751   noce_emit_move_insn (if_info->x, t);
1752
1753   seq = end_ifcvt_sequence (if_info);
1754   if (!seq)
1755     return FALSE;
1756
1757   emit_insn_before_setloc (seq, if_info->jump, INSN_LOCATOR (if_info->insn_a));
1758   return TRUE;
1759 }
1760
1761
1762 /* Similar to get_condition, only the resulting condition must be
1763    valid at JUMP, instead of at EARLIEST.  */
1764
1765 static rtx
1766 noce_get_condition (rtx jump, rtx *earliest)
1767 {
1768   rtx cond, set, tmp, insn;
1769   bool reverse;
1770
1771   if (! any_condjump_p (jump))
1772     return NULL_RTX;
1773
1774   set = pc_set (jump);
1775
1776   /* If this branches to JUMP_LABEL when the condition is false,
1777      reverse the condition.  */
1778   reverse = (GET_CODE (XEXP (SET_SRC (set), 2)) == LABEL_REF
1779              && XEXP (XEXP (SET_SRC (set), 2), 0) == JUMP_LABEL (jump));
1780
1781   /* If the condition variable is a register and is MODE_INT, accept it.  */
1782
1783   cond = XEXP (SET_SRC (set), 0);
1784   tmp = XEXP (cond, 0);
1785   if (REG_P (tmp) && GET_MODE_CLASS (GET_MODE (tmp)) == MODE_INT)
1786     {
1787       *earliest = jump;
1788
1789       if (reverse)
1790         cond = gen_rtx_fmt_ee (reverse_condition (GET_CODE (cond)),
1791                                GET_MODE (cond), tmp, XEXP (cond, 1));
1792       return cond;
1793     }
1794
1795   /* Otherwise, fall back on canonicalize_condition to do the dirty
1796      work of manipulating MODE_CC values and COMPARE rtx codes.  */
1797
1798   tmp = canonicalize_condition (jump, cond, reverse, earliest, NULL_RTX,
1799                                 false);
1800   if (!tmp)
1801     return NULL_RTX;
1802
1803   /* We are going to insert code before JUMP, not before EARLIEST.
1804      We must therefore be certain that the given condition is valid
1805      at JUMP by virtue of not having been modified since.  */
1806   for (insn = *earliest; insn != jump; insn = NEXT_INSN (insn))
1807     if (INSN_P (insn) && modified_in_p (tmp, insn))
1808       break;
1809   if (insn == jump)
1810     return tmp;
1811
1812   /* The condition was modified.  See if we can get a partial result
1813      that doesn't follow all the reversals.  Perhaps combine can fold
1814      them together later.  */
1815   tmp = XEXP (tmp, 0);
1816   if (!REG_P (tmp) || GET_MODE_CLASS (GET_MODE (tmp)) != MODE_INT)
1817     return NULL_RTX;
1818   tmp = canonicalize_condition (jump, cond, reverse, earliest, tmp,
1819                                 false);
1820   if (!tmp)
1821     return NULL_RTX;
1822
1823   /* For sanity's sake, re-validate the new result.  */
1824   for (insn = *earliest; insn != jump; insn = NEXT_INSN (insn))
1825     if (INSN_P (insn) && modified_in_p (tmp, insn))
1826       return NULL_RTX;
1827
1828   return tmp;
1829 }
1830
1831 /* Return true if OP is ok for if-then-else processing.  */
1832
1833 static int
1834 noce_operand_ok (rtx op)
1835 {
1836   /* We special-case memories, so handle any of them with
1837      no address side effects.  */
1838   if (MEM_P (op))
1839     return ! side_effects_p (XEXP (op, 0));
1840
1841   if (side_effects_p (op))
1842     return FALSE;
1843
1844   return ! may_trap_p (op);
1845 }
1846
1847 /* Given a simple IF-THEN or IF-THEN-ELSE block, attempt to convert it
1848    without using conditional execution.  Return TRUE if we were
1849    successful at converting the block.  */
1850
1851 static int
1852 noce_process_if_block (struct ce_if_block * ce_info)
1853 {
1854   basic_block test_bb = ce_info->test_bb;       /* test block */
1855   basic_block then_bb = ce_info->then_bb;       /* THEN */
1856   basic_block else_bb = ce_info->else_bb;       /* ELSE or NULL */
1857   struct noce_if_info if_info;
1858   rtx insn_a, insn_b;
1859   rtx set_a, set_b;
1860   rtx orig_x, x, a, b;
1861   rtx jump, cond;
1862
1863   /* We're looking for patterns of the form
1864
1865      (1) if (...) x = a; else x = b;
1866      (2) x = b; if (...) x = a;
1867      (3) if (...) x = a;   // as if with an initial x = x.
1868
1869      The later patterns require jumps to be more expensive.
1870
1871      ??? For future expansion, look for multiple X in such patterns.  */
1872
1873   /* If test is comprised of && or || elements, don't handle it unless it is
1874      the special case of && elements without an ELSE block.  */
1875   if (ce_info->num_multiple_test_blocks)
1876     {
1877       if (else_bb || ! ce_info->and_and_p)
1878         return FALSE;
1879
1880       ce_info->test_bb = test_bb = ce_info->last_test_bb;
1881       ce_info->num_multiple_test_blocks = 0;
1882       ce_info->num_and_and_blocks = 0;
1883       ce_info->num_or_or_blocks = 0;
1884     }
1885
1886   /* If this is not a standard conditional jump, we can't parse it.  */
1887   jump = BB_END (test_bb);
1888   cond = noce_get_condition (jump, &if_info.cond_earliest);
1889   if (! cond)
1890     return FALSE;
1891
1892   /* If the conditional jump is more than just a conditional
1893      jump, then we can not do if-conversion on this block.  */
1894   if (! onlyjump_p (jump))
1895     return FALSE;
1896
1897   /* We must be comparing objects whose modes imply the size.  */
1898   if (GET_MODE (XEXP (cond, 0)) == BLKmode)
1899     return FALSE;
1900
1901   /* Look for one of the potential sets.  */
1902   insn_a = first_active_insn (then_bb);
1903   if (! insn_a
1904       || insn_a != last_active_insn (then_bb, FALSE)
1905       || (set_a = single_set (insn_a)) == NULL_RTX)
1906     return FALSE;
1907
1908   x = SET_DEST (set_a);
1909   a = SET_SRC (set_a);
1910
1911   /* Look for the other potential set.  Make sure we've got equivalent
1912      destinations.  */
1913   /* ??? This is overconservative.  Storing to two different mems is
1914      as easy as conditionally computing the address.  Storing to a
1915      single mem merely requires a scratch memory to use as one of the
1916      destination addresses; often the memory immediately below the
1917      stack pointer is available for this.  */
1918   set_b = NULL_RTX;
1919   if (else_bb)
1920     {
1921       insn_b = first_active_insn (else_bb);
1922       if (! insn_b
1923           || insn_b != last_active_insn (else_bb, FALSE)
1924           || (set_b = single_set (insn_b)) == NULL_RTX
1925           || ! rtx_equal_p (x, SET_DEST (set_b)))
1926         return FALSE;
1927     }
1928   else
1929     {
1930       insn_b = prev_nonnote_insn (if_info.cond_earliest);
1931       /* We're going to be moving the evaluation of B down from above
1932          COND_EARLIEST to JUMP.  Make sure the relevant data is still
1933          intact.  */
1934       if (! insn_b
1935           || GET_CODE (insn_b) != INSN
1936           || (set_b = single_set (insn_b)) == NULL_RTX
1937           || ! rtx_equal_p (x, SET_DEST (set_b))
1938           || reg_overlap_mentioned_p (x, SET_SRC (set_b))
1939           || modified_between_p (SET_SRC (set_b),
1940                                  PREV_INSN (if_info.cond_earliest), jump)
1941           /* Likewise with X.  In particular this can happen when
1942              noce_get_condition looks farther back in the instruction
1943              stream than one might expect.  */
1944           || reg_overlap_mentioned_p (x, cond)
1945           || reg_overlap_mentioned_p (x, a)
1946           || modified_between_p (x, PREV_INSN (if_info.cond_earliest), jump))
1947         insn_b = set_b = NULL_RTX;
1948     }
1949
1950   /* If x has side effects then only the if-then-else form is safe to
1951      convert.  But even in that case we would need to restore any notes
1952      (such as REG_INC) at then end.  That can be tricky if
1953      noce_emit_move_insn expands to more than one insn, so disable the
1954      optimization entirely for now if there are side effects.  */
1955   if (side_effects_p (x))
1956     return FALSE;
1957
1958   b = (set_b ? SET_SRC (set_b) : x);
1959
1960   /* Only operate on register destinations, and even then avoid extending
1961      the lifetime of hard registers on small register class machines.  */
1962   orig_x = x;
1963   if (!REG_P (x)
1964       || (SMALL_REGISTER_CLASSES
1965           && REGNO (x) < FIRST_PSEUDO_REGISTER))
1966     {
1967       if (no_new_pseudos || GET_MODE (x) == BLKmode)
1968         return FALSE;
1969       x = gen_reg_rtx (GET_MODE (GET_CODE (x) == STRICT_LOW_PART
1970                                  ? XEXP (x, 0) : x));
1971     }
1972
1973   /* Don't operate on sources that may trap or are volatile.  */
1974   if (! noce_operand_ok (a) || ! noce_operand_ok (b))
1975     return FALSE;
1976
1977   /* Set up the info block for our subroutines.  */
1978   if_info.test_bb = test_bb;
1979   if_info.cond = cond;
1980   if_info.jump = jump;
1981   if_info.insn_a = insn_a;
1982   if_info.insn_b = insn_b;
1983   if_info.x = x;
1984   if_info.a = a;
1985   if_info.b = b;
1986
1987   /* Try optimizations in some approximation of a useful order.  */
1988   /* ??? Should first look to see if X is live incoming at all.  If it
1989      isn't, we don't need anything but an unconditional set.  */
1990
1991   /* Look and see if A and B are really the same.  Avoid creating silly
1992      cmove constructs that no one will fix up later.  */
1993   if (rtx_equal_p (a, b))
1994     {
1995       /* If we have an INSN_B, we don't have to create any new rtl.  Just
1996          move the instruction that we already have.  If we don't have an
1997          INSN_B, that means that A == X, and we've got a noop move.  In
1998          that case don't do anything and let the code below delete INSN_A.  */
1999       if (insn_b && else_bb)
2000         {
2001           rtx note;
2002
2003           if (else_bb && insn_b == BB_END (else_bb))
2004             BB_END (else_bb) = PREV_INSN (insn_b);
2005           reorder_insns (insn_b, insn_b, PREV_INSN (jump));
2006
2007           /* If there was a REG_EQUAL note, delete it since it may have been
2008              true due to this insn being after a jump.  */
2009           if ((note = find_reg_note (insn_b, REG_EQUAL, NULL_RTX)) != 0)
2010             remove_note (insn_b, note);
2011
2012           insn_b = NULL_RTX;
2013         }
2014       /* If we have "x = b; if (...) x = a;", and x has side-effects, then
2015          x must be executed twice.  */
2016       else if (insn_b && side_effects_p (orig_x))
2017         return FALSE;
2018
2019       x = orig_x;
2020       goto success;
2021     }
2022
2023   /* Disallow the "if (...) x = a;" form (with an implicit "else x = x;")
2024      for most optimizations if writing to x may trap, i.e. it's a memory
2025      other than a static var or a stack slot.  */
2026   if (! set_b
2027       && MEM_P (orig_x)
2028       && ! MEM_NOTRAP_P (orig_x)
2029       && rtx_addr_can_trap_p (XEXP (orig_x, 0)))
2030     {
2031       if (HAVE_conditional_move)
2032         {
2033           if (noce_try_cmove (&if_info))
2034             goto success;
2035           if (! HAVE_conditional_execution
2036               && noce_try_cmove_arith (&if_info))
2037             goto success;
2038         }
2039       return FALSE;
2040     }
2041
2042   if (noce_try_move (&if_info))
2043     goto success;
2044   if (noce_try_store_flag (&if_info))
2045     goto success;
2046   if (noce_try_minmax (&if_info))
2047     goto success;
2048   if (noce_try_abs (&if_info))
2049     goto success;
2050   if (HAVE_conditional_move
2051       && noce_try_cmove (&if_info))
2052     goto success;
2053   if (! HAVE_conditional_execution)
2054     {
2055       if (noce_try_store_flag_constants (&if_info))
2056         goto success;
2057       if (noce_try_addcc (&if_info))
2058         goto success;
2059       if (noce_try_store_flag_mask (&if_info))
2060         goto success;
2061       if (HAVE_conditional_move
2062           && noce_try_cmove_arith (&if_info))
2063         goto success;
2064       if (noce_try_sign_mask (&if_info))
2065         goto success;
2066     }
2067
2068   return FALSE;
2069
2070  success:
2071   /* The original sets may now be killed.  */
2072   delete_insn (insn_a);
2073
2074   /* Several special cases here: First, we may have reused insn_b above,
2075      in which case insn_b is now NULL.  Second, we want to delete insn_b
2076      if it came from the ELSE block, because follows the now correct
2077      write that appears in the TEST block.  However, if we got insn_b from
2078      the TEST block, it may in fact be loading data needed for the comparison.
2079      We'll let life_analysis remove the insn if it's really dead.  */
2080   if (insn_b && else_bb)
2081     delete_insn (insn_b);
2082
2083   /* The new insns will have been inserted immediately before the jump.  We
2084      should be able to remove the jump with impunity, but the condition itself
2085      may have been modified by gcse to be shared across basic blocks.  */
2086   delete_insn (jump);
2087
2088   /* If we used a temporary, fix it up now.  */
2089   if (orig_x != x)
2090     {
2091       start_sequence ();
2092       noce_emit_move_insn (orig_x, x);
2093       insn_b = get_insns ();
2094       set_used_flags (orig_x);
2095       unshare_all_rtl_in_chain (insn_b);
2096       end_sequence ();
2097
2098       emit_insn_after_setloc (insn_b, BB_END (test_bb), INSN_LOCATOR (insn_a));
2099     }
2100
2101   /* Merge the blocks!  */
2102   merge_if_block (ce_info);
2103
2104   return TRUE;
2105 }
2106 \f
2107 /* Attempt to convert an IF-THEN or IF-THEN-ELSE block into
2108    straight line code.  Return true if successful.  */
2109
2110 static int
2111 process_if_block (struct ce_if_block * ce_info)
2112 {
2113   if (! reload_completed
2114       && noce_process_if_block (ce_info))
2115     return TRUE;
2116
2117   if (HAVE_conditional_execution && reload_completed)
2118     {
2119       /* If we have && and || tests, try to first handle combining the && and
2120          || tests into the conditional code, and if that fails, go back and
2121          handle it without the && and ||, which at present handles the && case
2122          if there was no ELSE block.  */
2123       if (cond_exec_process_if_block (ce_info, TRUE))
2124         return TRUE;
2125
2126       if (ce_info->num_multiple_test_blocks)
2127         {
2128           cancel_changes (0);
2129
2130           if (cond_exec_process_if_block (ce_info, FALSE))
2131             return TRUE;
2132         }
2133     }
2134
2135   return FALSE;
2136 }
2137
2138 /* Merge the blocks and mark for local life update.  */
2139
2140 static void
2141 merge_if_block (struct ce_if_block * ce_info)
2142 {
2143   basic_block test_bb = ce_info->test_bb;       /* last test block */
2144   basic_block then_bb = ce_info->then_bb;       /* THEN */
2145   basic_block else_bb = ce_info->else_bb;       /* ELSE or NULL */
2146   basic_block join_bb = ce_info->join_bb;       /* join block */
2147   basic_block combo_bb;
2148
2149   /* All block merging is done into the lower block numbers.  */
2150
2151   combo_bb = test_bb;
2152
2153   /* Merge any basic blocks to handle && and || subtests.  Each of
2154      the blocks are on the fallthru path from the predecessor block.  */
2155   if (ce_info->num_multiple_test_blocks > 0)
2156     {
2157       basic_block bb = test_bb;
2158       basic_block last_test_bb = ce_info->last_test_bb;
2159       basic_block fallthru = block_fallthru (bb);
2160
2161       do
2162         {
2163           bb = fallthru;
2164           fallthru = block_fallthru (bb);
2165           merge_blocks (combo_bb, bb);
2166           num_true_changes++;
2167         }
2168       while (bb != last_test_bb);
2169     }
2170
2171   /* Merge TEST block into THEN block.  Normally the THEN block won't have a
2172      label, but it might if there were || tests.  That label's count should be
2173      zero, and it normally should be removed.  */
2174
2175   if (then_bb)
2176     {
2177       if (combo_bb->global_live_at_end)
2178         COPY_REG_SET (combo_bb->global_live_at_end,
2179                       then_bb->global_live_at_end);
2180       merge_blocks (combo_bb, then_bb);
2181       num_true_changes++;
2182     }
2183
2184   /* The ELSE block, if it existed, had a label.  That label count
2185      will almost always be zero, but odd things can happen when labels
2186      get their addresses taken.  */
2187   if (else_bb)
2188     {
2189       merge_blocks (combo_bb, else_bb);
2190       num_true_changes++;
2191     }
2192
2193   /* If there was no join block reported, that means it was not adjacent
2194      to the others, and so we cannot merge them.  */
2195
2196   if (! join_bb)
2197     {
2198       rtx last = BB_END (combo_bb);
2199
2200       /* The outgoing edge for the current COMBO block should already
2201          be correct.  Verify this.  */
2202       if (combo_bb->succ == NULL_EDGE)
2203         {
2204           if (find_reg_note (last, REG_NORETURN, NULL))
2205             ;
2206           else if (GET_CODE (last) == INSN
2207                    && GET_CODE (PATTERN (last)) == TRAP_IF
2208                    && TRAP_CONDITION (PATTERN (last)) == const_true_rtx)
2209             ;
2210           else
2211             abort ();
2212         }
2213
2214       /* There should still be something at the end of the THEN or ELSE
2215          blocks taking us to our final destination.  */
2216       else if (GET_CODE (last) == JUMP_INSN)
2217         ;
2218       else if (combo_bb->succ->dest == EXIT_BLOCK_PTR
2219                && GET_CODE (last) == CALL_INSN
2220                && SIBLING_CALL_P (last))
2221         ;
2222       else if ((combo_bb->succ->flags & EDGE_EH)
2223                && can_throw_internal (last))
2224         ;
2225       else
2226         abort ();
2227     }
2228
2229   /* The JOIN block may have had quite a number of other predecessors too.
2230      Since we've already merged the TEST, THEN and ELSE blocks, we should
2231      have only one remaining edge from our if-then-else diamond.  If there
2232      is more than one remaining edge, it must come from elsewhere.  There
2233      may be zero incoming edges if the THEN block didn't actually join
2234      back up (as with a call to abort).  */
2235   else if ((join_bb->pred == NULL
2236             || join_bb->pred->pred_next == NULL)
2237            && join_bb != EXIT_BLOCK_PTR)
2238     {
2239       /* We can merge the JOIN.  */
2240       if (combo_bb->global_live_at_end)
2241         COPY_REG_SET (combo_bb->global_live_at_end,
2242                       join_bb->global_live_at_end);
2243
2244       merge_blocks (combo_bb, join_bb);
2245       num_true_changes++;
2246     }
2247   else
2248     {
2249       /* We cannot merge the JOIN.  */
2250
2251       /* The outgoing edge for the current COMBO block should already
2252          be correct.  Verify this.  */
2253       if (combo_bb->succ->succ_next != NULL_EDGE
2254           || combo_bb->succ->dest != join_bb)
2255         abort ();
2256
2257       /* Remove the jump and cruft from the end of the COMBO block.  */
2258       if (join_bb != EXIT_BLOCK_PTR)
2259         tidy_fallthru_edge (combo_bb->succ);
2260     }
2261
2262   num_updated_if_blocks++;
2263 }
2264 \f
2265 /* Find a block ending in a simple IF condition and try to transform it
2266    in some way.  When converting a multi-block condition, put the new code
2267    in the first such block and delete the rest.  Return a pointer to this
2268    first block if some transformation was done.  Return NULL otherwise.  */
2269
2270 static basic_block
2271 find_if_header (basic_block test_bb, int pass)
2272 {
2273   ce_if_block_t ce_info;
2274   edge then_edge;
2275   edge else_edge;
2276
2277   /* The kind of block we're looking for has exactly two successors.  */
2278   if ((then_edge = test_bb->succ) == NULL_EDGE
2279       || (else_edge = then_edge->succ_next) == NULL_EDGE
2280       || else_edge->succ_next != NULL_EDGE)
2281     return NULL;
2282
2283   /* Neither edge should be abnormal.  */
2284   if ((then_edge->flags & EDGE_COMPLEX)
2285       || (else_edge->flags & EDGE_COMPLEX))
2286     return NULL;
2287
2288   /* Nor exit the loop.  */
2289   if ((then_edge->flags & EDGE_LOOP_EXIT)
2290       || (else_edge->flags & EDGE_LOOP_EXIT))
2291     return NULL;
2292
2293   /* The THEN edge is canonically the one that falls through.  */
2294   if (then_edge->flags & EDGE_FALLTHRU)
2295     ;
2296   else if (else_edge->flags & EDGE_FALLTHRU)
2297     {
2298       edge e = else_edge;
2299       else_edge = then_edge;
2300       then_edge = e;
2301     }
2302   else
2303     /* Otherwise this must be a multiway branch of some sort.  */
2304     return NULL;
2305
2306   memset (&ce_info, '\0', sizeof (ce_info));
2307   ce_info.test_bb = test_bb;
2308   ce_info.then_bb = then_edge->dest;
2309   ce_info.else_bb = else_edge->dest;
2310   ce_info.pass = pass;
2311
2312 #ifdef IFCVT_INIT_EXTRA_FIELDS
2313   IFCVT_INIT_EXTRA_FIELDS (&ce_info);
2314 #endif
2315
2316   if (find_if_block (&ce_info))
2317     goto success;
2318
2319   if (HAVE_trap && HAVE_conditional_trap
2320       && find_cond_trap (test_bb, then_edge, else_edge))
2321     goto success;
2322
2323   if (dom_computed[CDI_POST_DOMINATORS] >= DOM_NO_FAST_QUERY
2324       && (! HAVE_conditional_execution || reload_completed))
2325     {
2326       if (find_if_case_1 (test_bb, then_edge, else_edge))
2327         goto success;
2328       if (find_if_case_2 (test_bb, then_edge, else_edge))
2329         goto success;
2330     }
2331
2332   return NULL;
2333
2334  success:
2335   if (dump_file)
2336     fprintf (dump_file, "Conversion succeeded on pass %d.\n", pass);
2337   return ce_info.test_bb;
2338 }
2339
2340 /* Return true if a block has two edges, one of which falls through to the next
2341    block, and the other jumps to a specific block, so that we can tell if the
2342    block is part of an && test or an || test.  Returns either -1 or the number
2343    of non-note, non-jump, non-USE/CLOBBER insns in the block.  */
2344
2345 static int
2346 block_jumps_and_fallthru_p (basic_block cur_bb, basic_block target_bb)
2347 {
2348   edge cur_edge;
2349   int fallthru_p = FALSE;
2350   int jump_p = FALSE;
2351   rtx insn;
2352   rtx end;
2353   int n_insns = 0;
2354
2355   if (!cur_bb || !target_bb)
2356     return -1;
2357
2358   /* If no edges, obviously it doesn't jump or fallthru.  */
2359   if (cur_bb->succ == NULL_EDGE)
2360     return FALSE;
2361
2362   for (cur_edge = cur_bb->succ;
2363        cur_edge != NULL_EDGE;
2364        cur_edge = cur_edge->succ_next)
2365     {
2366       if (cur_edge->flags & EDGE_COMPLEX)
2367         /* Anything complex isn't what we want.  */
2368         return -1;
2369
2370       else if (cur_edge->flags & EDGE_FALLTHRU)
2371         fallthru_p = TRUE;
2372
2373       else if (cur_edge->dest == target_bb)
2374         jump_p = TRUE;
2375
2376       else
2377         return -1;
2378     }
2379
2380   if ((jump_p & fallthru_p) == 0)
2381     return -1;
2382
2383   /* Don't allow calls in the block, since this is used to group && and ||
2384      together for conditional execution support.  ??? we should support
2385      conditional execution support across calls for IA-64 some day, but
2386      for now it makes the code simpler.  */
2387   end = BB_END (cur_bb);
2388   insn = BB_HEAD (cur_bb);
2389
2390   while (insn != NULL_RTX)
2391     {
2392       if (GET_CODE (insn) == CALL_INSN)
2393         return -1;
2394
2395       if (INSN_P (insn)
2396           && GET_CODE (insn) != JUMP_INSN
2397           && GET_CODE (PATTERN (insn)) != USE
2398           && GET_CODE (PATTERN (insn)) != CLOBBER)
2399         n_insns++;
2400
2401       if (insn == end)
2402         break;
2403
2404       insn = NEXT_INSN (insn);
2405     }
2406
2407   return n_insns;
2408 }
2409
2410 /* Determine if a given basic block heads a simple IF-THEN or IF-THEN-ELSE
2411    block.  If so, we'll try to convert the insns to not require the branch.
2412    Return TRUE if we were successful at converting the block.  */
2413
2414 static int
2415 find_if_block (struct ce_if_block * ce_info)
2416 {
2417   basic_block test_bb = ce_info->test_bb;
2418   basic_block then_bb = ce_info->then_bb;
2419   basic_block else_bb = ce_info->else_bb;
2420   basic_block join_bb = NULL_BLOCK;
2421   edge then_succ = then_bb->succ;
2422   edge else_succ = else_bb->succ;
2423   int then_predecessors;
2424   int else_predecessors;
2425   edge cur_edge;
2426   basic_block next;
2427
2428   ce_info->last_test_bb = test_bb;
2429
2430   /* Discover if any fall through predecessors of the current test basic block
2431      were && tests (which jump to the else block) or || tests (which jump to
2432      the then block).  */
2433   if (HAVE_conditional_execution && reload_completed
2434       && test_bb->pred != NULL_EDGE
2435       && test_bb->pred->pred_next == NULL_EDGE
2436       && test_bb->pred->flags == EDGE_FALLTHRU)
2437     {
2438       basic_block bb = test_bb->pred->src;
2439       basic_block target_bb;
2440       int max_insns = MAX_CONDITIONAL_EXECUTE;
2441       int n_insns;
2442
2443       /* Determine if the preceding block is an && or || block.  */
2444       if ((n_insns = block_jumps_and_fallthru_p (bb, else_bb)) >= 0)
2445         {
2446           ce_info->and_and_p = TRUE;
2447           target_bb = else_bb;
2448         }
2449       else if ((n_insns = block_jumps_and_fallthru_p (bb, then_bb)) >= 0)
2450         {
2451           ce_info->and_and_p = FALSE;
2452           target_bb = then_bb;
2453         }
2454       else
2455         target_bb = NULL_BLOCK;
2456
2457       if (target_bb && n_insns <= max_insns)
2458         {
2459           int total_insns = 0;
2460           int blocks = 0;
2461
2462           ce_info->last_test_bb = test_bb;
2463
2464           /* Found at least one && or || block, look for more.  */
2465           do
2466             {
2467               ce_info->test_bb = test_bb = bb;
2468               total_insns += n_insns;
2469               blocks++;
2470
2471               if (bb->pred == NULL_EDGE || bb->pred->pred_next != NULL_EDGE)
2472                 break;
2473
2474               bb = bb->pred->src;
2475               n_insns = block_jumps_and_fallthru_p (bb, target_bb);
2476             }
2477           while (n_insns >= 0 && (total_insns + n_insns) <= max_insns);
2478
2479           ce_info->num_multiple_test_blocks = blocks;
2480           ce_info->num_multiple_test_insns = total_insns;
2481
2482           if (ce_info->and_and_p)
2483             ce_info->num_and_and_blocks = blocks;
2484           else
2485             ce_info->num_or_or_blocks = blocks;
2486         }
2487     }
2488
2489   /* Count the number of edges the THEN and ELSE blocks have.  */
2490   then_predecessors = 0;
2491   for (cur_edge = then_bb->pred;
2492        cur_edge != NULL_EDGE;
2493        cur_edge = cur_edge->pred_next)
2494     {
2495       then_predecessors++;
2496       if (cur_edge->flags & EDGE_COMPLEX)
2497         return FALSE;
2498     }
2499
2500   else_predecessors = 0;
2501   for (cur_edge = else_bb->pred;
2502        cur_edge != NULL_EDGE;
2503        cur_edge = cur_edge->pred_next)
2504     {
2505       else_predecessors++;
2506       if (cur_edge->flags & EDGE_COMPLEX)
2507         return FALSE;
2508     }
2509
2510   /* The THEN block of an IF-THEN combo must have exactly one predecessor,
2511      other than any || blocks which jump to the THEN block.  */
2512   if ((then_predecessors - ce_info->num_or_or_blocks) != 1)
2513     return FALSE;
2514
2515   /* The THEN block of an IF-THEN combo must have zero or one successors.  */
2516   if (then_succ != NULL_EDGE
2517       && (then_succ->succ_next != NULL_EDGE
2518           || (then_succ->flags & EDGE_COMPLEX)
2519           || (flow2_completed && tablejump_p (BB_END (then_bb), NULL, NULL))))
2520     return FALSE;
2521
2522   /* If the THEN block has no successors, conditional execution can still
2523      make a conditional call.  Don't do this unless the ELSE block has
2524      only one incoming edge -- the CFG manipulation is too ugly otherwise.
2525      Check for the last insn of the THEN block being an indirect jump, which
2526      is listed as not having any successors, but confuses the rest of the CE
2527      code processing.  ??? we should fix this in the future.  */
2528   if (then_succ == NULL)
2529     {
2530       if (else_bb->pred->pred_next == NULL_EDGE)
2531         {
2532           rtx last_insn = BB_END (then_bb);
2533
2534           while (last_insn
2535                  && GET_CODE (last_insn) == NOTE
2536                  && last_insn != BB_HEAD (then_bb))
2537             last_insn = PREV_INSN (last_insn);
2538
2539           if (last_insn
2540               && GET_CODE (last_insn) == JUMP_INSN
2541               && ! simplejump_p (last_insn))
2542             return FALSE;
2543
2544           join_bb = else_bb;
2545           else_bb = NULL_BLOCK;
2546         }
2547       else
2548         return FALSE;
2549     }
2550
2551   /* If the THEN block's successor is the other edge out of the TEST block,
2552      then we have an IF-THEN combo without an ELSE.  */
2553   else if (then_succ->dest == else_bb)
2554     {
2555       join_bb = else_bb;
2556       else_bb = NULL_BLOCK;
2557     }
2558
2559   /* If the THEN and ELSE block meet in a subsequent block, and the ELSE
2560      has exactly one predecessor and one successor, and the outgoing edge
2561      is not complex, then we have an IF-THEN-ELSE combo.  */
2562   else if (else_succ != NULL_EDGE
2563            && then_succ->dest == else_succ->dest
2564            && else_bb->pred->pred_next == NULL_EDGE
2565            && else_succ->succ_next == NULL_EDGE
2566            && ! (else_succ->flags & EDGE_COMPLEX)
2567            && ! (flow2_completed && tablejump_p (BB_END (else_bb), NULL, NULL)))
2568     join_bb = else_succ->dest;
2569
2570   /* Otherwise it is not an IF-THEN or IF-THEN-ELSE combination.  */
2571   else
2572     return FALSE;
2573
2574   num_possible_if_blocks++;
2575
2576   if (dump_file)
2577     {
2578       fprintf (dump_file,
2579                "\nIF-THEN%s block found, pass %d, start block %d "
2580                "[insn %d], then %d [%d]",
2581                (else_bb) ? "-ELSE" : "",
2582                ce_info->pass,
2583                test_bb->index,
2584                BB_HEAD (test_bb) ? (int)INSN_UID (BB_HEAD (test_bb)) : -1,
2585                then_bb->index,
2586                BB_HEAD (then_bb) ? (int)INSN_UID (BB_HEAD (then_bb)) : -1);
2587
2588       if (else_bb)
2589         fprintf (dump_file, ", else %d [%d]",
2590                  else_bb->index,
2591                  BB_HEAD (else_bb) ? (int)INSN_UID (BB_HEAD (else_bb)) : -1);
2592
2593       fprintf (dump_file, ", join %d [%d]",
2594                join_bb->index,
2595                BB_HEAD (join_bb) ? (int)INSN_UID (BB_HEAD (join_bb)) : -1);
2596
2597       if (ce_info->num_multiple_test_blocks > 0)
2598         fprintf (dump_file, ", %d %s block%s last test %d [%d]",
2599                  ce_info->num_multiple_test_blocks,
2600                  (ce_info->and_and_p) ? "&&" : "||",
2601                  (ce_info->num_multiple_test_blocks == 1) ? "" : "s",
2602                  ce_info->last_test_bb->index,
2603                  ((BB_HEAD (ce_info->last_test_bb))
2604                   ? (int)INSN_UID (BB_HEAD (ce_info->last_test_bb))
2605                   : -1));
2606
2607       fputc ('\n', dump_file);
2608     }
2609
2610   /* Make sure IF, THEN, and ELSE, blocks are adjacent.  Actually, we get the
2611      first condition for free, since we've already asserted that there's a
2612      fallthru edge from IF to THEN.  Likewise for the && and || blocks, since
2613      we checked the FALLTHRU flag, those are already adjacent to the last IF
2614      block.  */
2615   /* ??? As an enhancement, move the ELSE block.  Have to deal with
2616      BLOCK notes, if by no other means than aborting the merge if they
2617      exist.  Sticky enough I don't want to think about it now.  */
2618   next = then_bb;
2619   if (else_bb && (next = next->next_bb) != else_bb)
2620     return FALSE;
2621   if ((next = next->next_bb) != join_bb && join_bb != EXIT_BLOCK_PTR)
2622     {
2623       if (else_bb)
2624         join_bb = NULL;
2625       else
2626         return FALSE;
2627     }
2628
2629   /* Do the real work.  */
2630   ce_info->else_bb = else_bb;
2631   ce_info->join_bb = join_bb;
2632
2633   return process_if_block (ce_info);
2634 }
2635
2636 /* Convert a branch over a trap, or a branch
2637    to a trap, into a conditional trap.  */
2638
2639 static int
2640 find_cond_trap (basic_block test_bb, edge then_edge, edge else_edge)
2641 {
2642   basic_block then_bb = then_edge->dest;
2643   basic_block else_bb = else_edge->dest;
2644   basic_block other_bb, trap_bb;
2645   rtx trap, jump, cond, cond_earliest, seq;
2646   enum rtx_code code;
2647
2648   /* Locate the block with the trap instruction.  */
2649   /* ??? While we look for no successors, we really ought to allow
2650      EH successors.  Need to fix merge_if_block for that to work.  */
2651   if ((trap = block_has_only_trap (then_bb)) != NULL)
2652     trap_bb = then_bb, other_bb = else_bb;
2653   else if ((trap = block_has_only_trap (else_bb)) != NULL)
2654     trap_bb = else_bb, other_bb = then_bb;
2655   else
2656     return FALSE;
2657
2658   if (dump_file)
2659     {
2660       fprintf (dump_file, "\nTRAP-IF block found, start %d, trap %d\n",
2661                test_bb->index, trap_bb->index);
2662     }
2663
2664   /* If this is not a standard conditional jump, we can't parse it.  */
2665   jump = BB_END (test_bb);
2666   cond = noce_get_condition (jump, &cond_earliest);
2667   if (! cond)
2668     return FALSE;
2669
2670   /* If the conditional jump is more than just a conditional jump, then
2671      we can not do if-conversion on this block.  */
2672   if (! onlyjump_p (jump))
2673     return FALSE;
2674
2675   /* We must be comparing objects whose modes imply the size.  */
2676   if (GET_MODE (XEXP (cond, 0)) == BLKmode)
2677     return FALSE;
2678
2679   /* Reverse the comparison code, if necessary.  */
2680   code = GET_CODE (cond);
2681   if (then_bb == trap_bb)
2682     {
2683       code = reversed_comparison_code (cond, jump);
2684       if (code == UNKNOWN)
2685         return FALSE;
2686     }
2687
2688   /* Attempt to generate the conditional trap.  */
2689   seq = gen_cond_trap (code, XEXP (cond, 0),
2690                        XEXP (cond, 1),
2691                        TRAP_CODE (PATTERN (trap)));
2692   if (seq == NULL)
2693     return FALSE;
2694
2695   num_true_changes++;
2696
2697   /* Emit the new insns before cond_earliest.  */
2698   emit_insn_before_setloc (seq, cond_earliest, INSN_LOCATOR (trap));
2699
2700   /* Delete the trap block if possible.  */
2701   remove_edge (trap_bb == then_bb ? then_edge : else_edge);
2702   if (trap_bb->pred == NULL)
2703     delete_basic_block (trap_bb);
2704
2705   /* If the non-trap block and the test are now adjacent, merge them.
2706      Otherwise we must insert a direct branch.  */
2707   if (test_bb->next_bb == other_bb)
2708     {
2709       struct ce_if_block new_ce_info;
2710       delete_insn (jump);
2711       memset (&new_ce_info, '\0', sizeof (new_ce_info));
2712       new_ce_info.test_bb = test_bb;
2713       new_ce_info.then_bb = NULL;
2714       new_ce_info.else_bb = NULL;
2715       new_ce_info.join_bb = other_bb;
2716       merge_if_block (&new_ce_info);
2717     }
2718   else
2719     {
2720       rtx lab, newjump;
2721
2722       lab = JUMP_LABEL (jump);
2723       newjump = emit_jump_insn_after (gen_jump (lab), jump);
2724       LABEL_NUSES (lab) += 1;
2725       JUMP_LABEL (newjump) = lab;
2726       emit_barrier_after (newjump);
2727
2728       delete_insn (jump);
2729     }
2730
2731   return TRUE;
2732 }
2733
2734 /* Subroutine of find_cond_trap: if BB contains only a trap insn,
2735    return it.  */
2736
2737 static rtx
2738 block_has_only_trap (basic_block bb)
2739 {
2740   rtx trap;
2741
2742   /* We're not the exit block.  */
2743   if (bb == EXIT_BLOCK_PTR)
2744     return NULL_RTX;
2745
2746   /* The block must have no successors.  */
2747   if (bb->succ)
2748     return NULL_RTX;
2749
2750   /* The only instruction in the THEN block must be the trap.  */
2751   trap = first_active_insn (bb);
2752   if (! (trap == BB_END (bb)
2753          && GET_CODE (PATTERN (trap)) == TRAP_IF
2754          && TRAP_CONDITION (PATTERN (trap)) == const_true_rtx))
2755     return NULL_RTX;
2756
2757   return trap;
2758 }
2759
2760 /* Look for IF-THEN-ELSE cases in which one of THEN or ELSE is
2761    transformable, but not necessarily the other.  There need be no
2762    JOIN block.
2763
2764    Return TRUE if we were successful at converting the block.
2765
2766    Cases we'd like to look at:
2767
2768    (1)
2769         if (test) goto over; // x not live
2770         x = a;
2771         goto label;
2772         over:
2773
2774    becomes
2775
2776         x = a;
2777         if (! test) goto label;
2778
2779    (2)
2780         if (test) goto E; // x not live
2781         x = big();
2782         goto L;
2783         E:
2784         x = b;
2785         goto M;
2786
2787    becomes
2788
2789         x = b;
2790         if (test) goto M;
2791         x = big();
2792         goto L;
2793
2794    (3) // This one's really only interesting for targets that can do
2795        // multiway branching, e.g. IA-64 BBB bundles.  For other targets
2796        // it results in multiple branches on a cache line, which often
2797        // does not sit well with predictors.
2798
2799         if (test1) goto E; // predicted not taken
2800         x = a;
2801         if (test2) goto F;
2802         ...
2803         E:
2804         x = b;
2805         J:
2806
2807    becomes
2808
2809         x = a;
2810         if (test1) goto E;
2811         if (test2) goto F;
2812
2813    Notes:
2814
2815    (A) Don't do (2) if the branch is predicted against the block we're
2816    eliminating.  Do it anyway if we can eliminate a branch; this requires
2817    that the sole successor of the eliminated block postdominate the other
2818    side of the if.
2819
2820    (B) With CE, on (3) we can steal from both sides of the if, creating
2821
2822         if (test1) x = a;
2823         if (!test1) x = b;
2824         if (test1) goto J;
2825         if (test2) goto F;
2826         ...
2827         J:
2828
2829    Again, this is most useful if J postdominates.
2830
2831    (C) CE substitutes for helpful life information.
2832
2833    (D) These heuristics need a lot of work.  */
2834
2835 /* Tests for case 1 above.  */
2836
2837 static int
2838 find_if_case_1 (basic_block test_bb, edge then_edge, edge else_edge)
2839 {
2840   basic_block then_bb = then_edge->dest;
2841   basic_block else_bb = else_edge->dest, new_bb;
2842   edge then_succ = then_bb->succ;
2843   int then_bb_index;
2844
2845   /* If we are partitioning hot/cold basic blocks, we don't want to
2846      mess up unconditional or indirect jumps that cross between hot
2847      and cold sections.  */
2848   
2849   if (flag_reorder_blocks_and_partition
2850       && ((BB_END (then_bb) 
2851            && find_reg_note (BB_END (then_bb), REG_CROSSING_JUMP, NULL_RTX))
2852           || (BB_END (else_bb)
2853               && find_reg_note (BB_END (else_bb), REG_CROSSING_JUMP, 
2854                                 NULL_RTX))))
2855     return FALSE;
2856
2857   /* THEN has one successor.  */
2858   if (!then_succ || then_succ->succ_next != NULL)
2859     return FALSE;
2860
2861   /* THEN does not fall through, but is not strange either.  */
2862   if (then_succ->flags & (EDGE_COMPLEX | EDGE_FALLTHRU))
2863     return FALSE;
2864
2865   /* THEN has one predecessor.  */
2866   if (then_bb->pred->pred_next != NULL)
2867     return FALSE;
2868
2869   /* THEN must do something.  */
2870   if (forwarder_block_p (then_bb))
2871     return FALSE;
2872
2873   num_possible_if_blocks++;
2874   if (dump_file)
2875     fprintf (dump_file,
2876              "\nIF-CASE-1 found, start %d, then %d\n",
2877              test_bb->index, then_bb->index);
2878
2879   /* THEN is small.  */
2880   if (count_bb_insns (then_bb) > BRANCH_COST)
2881     return FALSE;
2882
2883   /* Registers set are dead, or are predicable.  */
2884   if (! dead_or_predicable (test_bb, then_bb, else_bb,
2885                             then_bb->succ->dest, 1))
2886     return FALSE;
2887
2888   /* Conversion went ok, including moving the insns and fixing up the
2889      jump.  Adjust the CFG to match.  */
2890
2891   bitmap_operation (test_bb->global_live_at_end,
2892                     else_bb->global_live_at_start,
2893                     then_bb->global_live_at_end, BITMAP_IOR);
2894
2895   new_bb = redirect_edge_and_branch_force (FALLTHRU_EDGE (test_bb), else_bb);
2896   then_bb_index = then_bb->index;
2897   delete_basic_block (then_bb);
2898
2899   /* Make rest of code believe that the newly created block is the THEN_BB
2900      block we removed.  */
2901   if (new_bb)
2902     {
2903       new_bb->index = then_bb_index;
2904       BASIC_BLOCK (then_bb_index) = new_bb;
2905     }
2906   /* We've possibly created jump to next insn, cleanup_cfg will solve that
2907      later.  */
2908
2909   num_true_changes++;
2910   num_updated_if_blocks++;
2911
2912   return TRUE;
2913 }
2914
2915 /* Test for case 2 above.  */
2916
2917 static int
2918 find_if_case_2 (basic_block test_bb, edge then_edge, edge else_edge)
2919 {
2920   basic_block then_bb = then_edge->dest;
2921   basic_block else_bb = else_edge->dest;
2922   edge else_succ = else_bb->succ;
2923   rtx note;
2924
2925   /* If we are partitioning hot/cold basic blocks, we don't want to
2926      mess up unconditional or indirect jumps that cross between hot
2927      and cold sections.  */
2928   
2929   if (flag_reorder_blocks_and_partition
2930       && ((BB_END (then_bb)
2931            && find_reg_note (BB_END (then_bb), REG_CROSSING_JUMP, NULL_RTX))
2932           || (BB_END (else_bb) 
2933               && find_reg_note (BB_END (else_bb), REG_CROSSING_JUMP, 
2934                                 NULL_RTX))))
2935     return FALSE;
2936
2937   /* ELSE has one successor.  */
2938   if (!else_succ || else_succ->succ_next != NULL)
2939     return FALSE;
2940
2941   /* ELSE outgoing edge is not complex.  */
2942   if (else_succ->flags & EDGE_COMPLEX)
2943     return FALSE;
2944
2945   /* ELSE has one predecessor.  */
2946   if (else_bb->pred->pred_next != NULL)
2947     return FALSE;
2948
2949   /* THEN is not EXIT.  */
2950   if (then_bb->index < 0)
2951     return FALSE;
2952
2953   /* ELSE is predicted or SUCC(ELSE) postdominates THEN.  */
2954   note = find_reg_note (BB_END (test_bb), REG_BR_PROB, NULL_RTX);
2955   if (note && INTVAL (XEXP (note, 0)) >= REG_BR_PROB_BASE / 2)
2956     ;
2957   else if (else_succ->dest->index < 0
2958            || dominated_by_p (CDI_POST_DOMINATORS, then_bb,
2959                               else_succ->dest))
2960     ;
2961   else
2962     return FALSE;
2963
2964   num_possible_if_blocks++;
2965   if (dump_file)
2966     fprintf (dump_file,
2967              "\nIF-CASE-2 found, start %d, else %d\n",
2968              test_bb->index, else_bb->index);
2969
2970   /* ELSE is small.  */
2971   if (count_bb_insns (else_bb) > BRANCH_COST)
2972     return FALSE;
2973
2974   /* Registers set are dead, or are predicable.  */
2975   if (! dead_or_predicable (test_bb, else_bb, then_bb, else_succ->dest, 0))
2976     return FALSE;
2977
2978   /* Conversion went ok, including moving the insns and fixing up the
2979      jump.  Adjust the CFG to match.  */
2980
2981   bitmap_operation (test_bb->global_live_at_end,
2982                     then_bb->global_live_at_start,
2983                     else_bb->global_live_at_end, BITMAP_IOR);
2984
2985   delete_basic_block (else_bb);
2986
2987   num_true_changes++;
2988   num_updated_if_blocks++;
2989
2990   /* ??? We may now fallthru from one of THEN's successors into a join
2991      block.  Rerun cleanup_cfg?  Examine things manually?  Wait?  */
2992
2993   return TRUE;
2994 }
2995
2996 /* A subroutine of dead_or_predicable called through for_each_rtx.
2997    Return 1 if a memory is found.  */
2998
2999 static int
3000 find_memory (rtx *px, void *data ATTRIBUTE_UNUSED)
3001 {
3002   return MEM_P (*px);
3003 }
3004
3005 /* Used by the code above to perform the actual rtl transformations.
3006    Return TRUE if successful.
3007
3008    TEST_BB is the block containing the conditional branch.  MERGE_BB
3009    is the block containing the code to manipulate.  NEW_DEST is the
3010    label TEST_BB should be branching to after the conversion.
3011    REVERSEP is true if the sense of the branch should be reversed.  */
3012
3013 static int
3014 dead_or_predicable (basic_block test_bb, basic_block merge_bb,
3015                     basic_block other_bb, basic_block new_dest, int reversep)
3016 {
3017   rtx head, end, jump, earliest = NULL_RTX, old_dest, new_label = NULL_RTX;
3018
3019   jump = BB_END (test_bb);
3020
3021   /* Find the extent of the real code in the merge block.  */
3022   head = BB_HEAD (merge_bb);
3023   end = BB_END (merge_bb);
3024
3025   if (GET_CODE (head) == CODE_LABEL)
3026     head = NEXT_INSN (head);
3027   if (GET_CODE (head) == NOTE)
3028     {
3029       if (head == end)
3030         {
3031           head = end = NULL_RTX;
3032           goto no_body;
3033         }
3034       head = NEXT_INSN (head);
3035     }
3036
3037   if (GET_CODE (end) == JUMP_INSN)
3038     {
3039       if (head == end)
3040         {
3041           head = end = NULL_RTX;
3042           goto no_body;
3043         }
3044       end = PREV_INSN (end);
3045     }
3046
3047   /* Disable handling dead code by conditional execution if the machine needs
3048      to do anything funny with the tests, etc.  */
3049 #ifndef IFCVT_MODIFY_TESTS
3050   if (HAVE_conditional_execution)
3051     {
3052       /* In the conditional execution case, we have things easy.  We know
3053          the condition is reversible.  We don't have to check life info
3054          because we're going to conditionally execute the code anyway.
3055          All that's left is making sure the insns involved can actually
3056          be predicated.  */
3057
3058       rtx cond, prob_val;
3059
3060       cond = cond_exec_get_condition (jump);
3061       if (! cond)
3062         return FALSE;
3063
3064       prob_val = find_reg_note (jump, REG_BR_PROB, NULL_RTX);
3065       if (prob_val)
3066         prob_val = XEXP (prob_val, 0);
3067
3068       if (reversep)
3069         {
3070           enum rtx_code rev = reversed_comparison_code (cond, jump);
3071           if (rev == UNKNOWN)
3072             return FALSE;
3073           cond = gen_rtx_fmt_ee (rev, GET_MODE (cond), XEXP (cond, 0),
3074                                  XEXP (cond, 1));
3075           if (prob_val)
3076             prob_val = GEN_INT (REG_BR_PROB_BASE - INTVAL (prob_val));
3077         }
3078
3079       if (! cond_exec_process_insns ((ce_if_block_t *)0, head, end, cond,
3080                                      prob_val, 0))
3081         goto cancel;
3082
3083       earliest = jump;
3084     }
3085   else
3086 #endif
3087     {
3088       /* In the non-conditional execution case, we have to verify that there
3089          are no trapping operations, no calls, no references to memory, and
3090          that any registers modified are dead at the branch site.  */
3091
3092       rtx insn, cond, prev;
3093       regset_head merge_set_head, tmp_head, test_live_head, test_set_head;
3094       regset merge_set, tmp, test_live, test_set;
3095       struct propagate_block_info *pbi;
3096       int i, fail = 0;
3097
3098       /* Check for no calls or trapping operations.  */
3099       for (insn = head; ; insn = NEXT_INSN (insn))
3100         {
3101           if (GET_CODE (insn) == CALL_INSN)
3102             return FALSE;
3103           if (INSN_P (insn))
3104             {
3105               if (may_trap_p (PATTERN (insn)))
3106                 return FALSE;
3107
3108               /* ??? Even non-trapping memories such as stack frame
3109                  references must be avoided.  For stores, we collect
3110                  no lifetime info; for reads, we'd have to assert
3111                  true_dependence false against every store in the
3112                  TEST range.  */
3113               if (for_each_rtx (&PATTERN (insn), find_memory, NULL))
3114                 return FALSE;
3115             }
3116           if (insn == end)
3117             break;
3118         }
3119
3120       if (! any_condjump_p (jump))
3121         return FALSE;
3122
3123       /* Find the extent of the conditional.  */
3124       cond = noce_get_condition (jump, &earliest);
3125       if (! cond)
3126         return FALSE;
3127
3128       /* Collect:
3129            MERGE_SET = set of registers set in MERGE_BB
3130            TEST_LIVE = set of registers live at EARLIEST
3131            TEST_SET  = set of registers set between EARLIEST and the
3132                        end of the block.  */
3133
3134       tmp = INITIALIZE_REG_SET (tmp_head);
3135       merge_set = INITIALIZE_REG_SET (merge_set_head);
3136       test_live = INITIALIZE_REG_SET (test_live_head);
3137       test_set = INITIALIZE_REG_SET (test_set_head);
3138
3139       /* ??? bb->local_set is only valid during calculate_global_regs_live,
3140          so we must recompute usage for MERGE_BB.  Not so bad, I suppose,
3141          since we've already asserted that MERGE_BB is small.  */
3142       propagate_block (merge_bb, tmp, merge_set, merge_set, 0);
3143
3144       /* For small register class machines, don't lengthen lifetimes of
3145          hard registers before reload.  */
3146       if (SMALL_REGISTER_CLASSES && ! reload_completed)
3147         {
3148           EXECUTE_IF_SET_IN_BITMAP
3149             (merge_set, 0, i,
3150              {
3151                if (i < FIRST_PSEUDO_REGISTER
3152                    && ! fixed_regs[i]
3153                    && ! global_regs[i])
3154                 fail = 1;
3155              });
3156         }
3157
3158       /* For TEST, we're interested in a range of insns, not a whole block.
3159          Moreover, we're interested in the insns live from OTHER_BB.  */
3160
3161       COPY_REG_SET (test_live, other_bb->global_live_at_start);
3162       pbi = init_propagate_block_info (test_bb, test_live, test_set, test_set,
3163                                        0);
3164
3165       for (insn = jump; ; insn = prev)
3166         {
3167           prev = propagate_one_insn (pbi, insn);
3168           if (insn == earliest)
3169             break;
3170         }
3171
3172       free_propagate_block_info (pbi);
3173
3174       /* We can perform the transformation if
3175            MERGE_SET & (TEST_SET | TEST_LIVE)
3176          and
3177            TEST_SET & merge_bb->global_live_at_start
3178          are empty.  */
3179
3180       bitmap_operation (tmp, test_set, test_live, BITMAP_IOR);
3181       bitmap_operation (tmp, tmp, merge_set, BITMAP_AND);
3182       EXECUTE_IF_SET_IN_BITMAP(tmp, 0, i, fail = 1);
3183
3184       bitmap_operation (tmp, test_set, merge_bb->global_live_at_start,
3185                         BITMAP_AND);
3186       EXECUTE_IF_SET_IN_BITMAP(tmp, 0, i, fail = 1);
3187
3188       FREE_REG_SET (tmp);
3189       FREE_REG_SET (merge_set);
3190       FREE_REG_SET (test_live);
3191       FREE_REG_SET (test_set);
3192
3193       if (fail)
3194         return FALSE;
3195     }
3196
3197  no_body:
3198   /* We don't want to use normal invert_jump or redirect_jump because
3199      we don't want to delete_insn called.  Also, we want to do our own
3200      change group management.  */
3201
3202   old_dest = JUMP_LABEL (jump);
3203   if (other_bb != new_dest)
3204     {
3205       new_label = block_label (new_dest);
3206       if (reversep
3207           ? ! invert_jump_1 (jump, new_label)
3208           : ! redirect_jump_1 (jump, new_label))
3209         goto cancel;
3210     }
3211
3212   if (! apply_change_group ())
3213     return FALSE;
3214
3215   if (other_bb != new_dest)
3216     {
3217       if (old_dest)
3218         LABEL_NUSES (old_dest) -= 1;
3219       if (new_label)
3220         LABEL_NUSES (new_label) += 1;
3221       JUMP_LABEL (jump) = new_label;
3222       if (reversep)
3223         invert_br_probabilities (jump);
3224
3225       redirect_edge_succ (BRANCH_EDGE (test_bb), new_dest);
3226       if (reversep)
3227         {
3228           gcov_type count, probability;
3229           count = BRANCH_EDGE (test_bb)->count;
3230           BRANCH_EDGE (test_bb)->count = FALLTHRU_EDGE (test_bb)->count;
3231           FALLTHRU_EDGE (test_bb)->count = count;
3232           probability = BRANCH_EDGE (test_bb)->probability;
3233           BRANCH_EDGE (test_bb)->probability
3234             = FALLTHRU_EDGE (test_bb)->probability;
3235           FALLTHRU_EDGE (test_bb)->probability = probability;
3236           update_br_prob_note (test_bb);
3237         }
3238     }
3239
3240   /* Move the insns out of MERGE_BB to before the branch.  */
3241   if (head != NULL)
3242     {
3243       if (end == BB_END (merge_bb))
3244         BB_END (merge_bb) = PREV_INSN (head);
3245
3246       if (squeeze_notes (&head, &end))
3247         return TRUE;
3248
3249       reorder_insns (head, end, PREV_INSN (earliest));
3250     }
3251
3252   /* Remove the jump and edge if we can.  */
3253   if (other_bb == new_dest)
3254     {
3255       delete_insn (jump);
3256       remove_edge (BRANCH_EDGE (test_bb));
3257       /* ??? Can't merge blocks here, as then_bb is still in use.
3258          At minimum, the merge will get done just before bb-reorder.  */
3259     }
3260
3261   return TRUE;
3262
3263  cancel:
3264   cancel_changes (0);
3265   return FALSE;
3266 }
3267 \f
3268 /* Main entry point for all if-conversion.  */
3269
3270 void
3271 if_convert (int x_life_data_ok)
3272 {
3273   basic_block bb;
3274   int pass;
3275
3276   num_possible_if_blocks = 0;
3277   num_updated_if_blocks = 0;
3278   num_true_changes = 0;
3279   life_data_ok = (x_life_data_ok != 0);
3280
3281   if ((! targetm.cannot_modify_jumps_p ())
3282       && (!flag_reorder_blocks_and_partition || !no_new_pseudos))
3283     mark_loop_exit_edges ();
3284
3285   /* Compute postdominators if we think we'll use them.  */
3286   if (HAVE_conditional_execution || life_data_ok)
3287     calculate_dominance_info (CDI_POST_DOMINATORS);
3288
3289   if (life_data_ok)
3290     clear_bb_flags ();
3291
3292   /* Go through each of the basic blocks looking for things to convert.  If we
3293      have conditional execution, we make multiple passes to allow us to handle
3294      IF-THEN{-ELSE} blocks within other IF-THEN{-ELSE} blocks.  */
3295   pass = 0;
3296   do
3297     {
3298       cond_exec_changed_p = FALSE;
3299       pass++;
3300
3301 #ifdef IFCVT_MULTIPLE_DUMPS
3302       if (dump_file && pass > 1)
3303         fprintf (dump_file, "\n\n========== Pass %d ==========\n", pass);
3304 #endif
3305
3306       FOR_EACH_BB (bb)
3307         {
3308           basic_block new_bb;
3309           while ((new_bb = find_if_header (bb, pass)))
3310             bb = new_bb;
3311         }
3312
3313 #ifdef IFCVT_MULTIPLE_DUMPS
3314       if (dump_file && cond_exec_changed_p)
3315         print_rtl_with_bb (dump_file, get_insns ());
3316 #endif
3317     }
3318   while (cond_exec_changed_p);
3319
3320 #ifdef IFCVT_MULTIPLE_DUMPS
3321   if (dump_file)
3322     fprintf (dump_file, "\n\n========== no more changes\n");
3323 #endif
3324
3325   free_dominance_info (CDI_POST_DOMINATORS);
3326
3327   if (dump_file)
3328     fflush (dump_file);
3329
3330   clear_aux_for_blocks ();
3331
3332   /* Rebuild life info for basic blocks that require it.  */
3333   if (num_true_changes && life_data_ok)
3334     {
3335       /* If we allocated new pseudos, we must resize the array for sched1.  */
3336       if (max_regno < max_reg_num ())
3337         {
3338           max_regno = max_reg_num ();
3339           allocate_reg_info (max_regno, FALSE, FALSE);
3340         }
3341       update_life_info_in_dirty_blocks (UPDATE_LIFE_GLOBAL_RM_NOTES,
3342                                         PROP_DEATH_NOTES | PROP_SCAN_DEAD_CODE
3343                                         | PROP_KILL_DEAD_CODE);
3344     }
3345
3346   /* Write the final stats.  */
3347   if (dump_file && num_possible_if_blocks > 0)
3348     {
3349       fprintf (dump_file,
3350                "\n%d possible IF blocks searched.\n",
3351                num_possible_if_blocks);
3352       fprintf (dump_file,
3353                "%d IF blocks converted.\n",
3354                num_updated_if_blocks);
3355       fprintf (dump_file,
3356                "%d true changes made.\n\n\n",
3357                num_true_changes);
3358     }
3359
3360 #ifdef ENABLE_CHECKING
3361   verify_flow_info ();
3362 #endif
3363 }