OSDN Git Service

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