OSDN Git Service

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