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