OSDN Git Service

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