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