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