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