OSDN Git Service

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