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