1 /* GIMPLE lowering pass. Converts High GIMPLE into Low GIMPLE.
3 Copyright (C) 2003-2014 Free Software Foundation, Inc.
5 This file is part of GCC.
7 GCC is free software; you can redistribute it and/or modify it under
8 the terms of the GNU General Public License as published by the Free
9 Software Foundation; either version 3, or (at your option) any later
12 GCC is distributed in the hope that it will be useful, but WITHOUT ANY
13 WARRANTY; without even the implied warranty of MERCHANTABILITY or
14 FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
17 You should have received a copy of the GNU General Public License
18 along with GCC; see the file COPYING3. If not see
19 <http://www.gnu.org/licenses/>. */
23 #include "coretypes.h"
26 #include "tree-nested.h"
33 #include "hard-reg-set.h"
36 #include "basic-block.h"
37 #include "tree-ssa-alias.h"
38 #include "internal-fn.h"
39 #include "gimple-expr.h"
42 #include "gimple-iterator.h"
43 #include "tree-iterator.h"
44 #include "tree-inline.h"
46 #include "diagnostic-core.h"
47 #include "tree-pass.h"
48 #include "langhooks.h"
49 #include "gimple-low.h"
50 #include "tree-nested.h"
52 /* The differences between High GIMPLE and Low GIMPLE are the
55 1- Lexical scopes are removed (i.e., GIMPLE_BIND disappears).
57 2- GIMPLE_TRY and GIMPLE_CATCH are converted to abnormal control
58 flow and exception regions are built as an on-the-side region
59 hierarchy (See tree-eh.c:lower_eh_constructs).
61 3- Multiple identical return statements are grouped into a single
62 return and gotos to the unique return site. */
64 /* Match a return statement with a label. During lowering, we identify
65 identical return statements and replace duplicates with a jump to
66 the corresponding label. */
67 struct return_statements_t
72 typedef struct return_statements_t return_statements_t
;
77 /* Block the current statement belongs to. */
80 /* A vector of label and return statements to be moved to the end
82 vec
<return_statements_t
> return_statements
;
84 /* True if the current statement cannot fall through. */
88 static void lower_stmt (gimple_stmt_iterator
*, struct lower_data
*);
89 static void lower_gimple_bind (gimple_stmt_iterator
*, struct lower_data
*);
90 static void lower_try_catch (gimple_stmt_iterator
*, struct lower_data
*);
91 static void lower_gimple_return (gimple_stmt_iterator
*, struct lower_data
*);
92 static void lower_builtin_setjmp (gimple_stmt_iterator
*);
93 static void lower_builtin_posix_memalign (gimple_stmt_iterator
*);
96 /* Lower the body of current_function_decl from High GIMPLE into Low
100 lower_function_body (void)
102 struct lower_data data
;
103 gimple_seq body
= gimple_body (current_function_decl
);
104 gimple_seq lowered_body
;
105 gimple_stmt_iterator i
;
109 /* The gimplifier should've left a body of exactly one statement,
110 namely a GIMPLE_BIND. */
111 gcc_assert (gimple_seq_first (body
) == gimple_seq_last (body
)
112 && gimple_code (gimple_seq_first_stmt (body
)) == GIMPLE_BIND
);
114 memset (&data
, 0, sizeof (data
));
115 data
.block
= DECL_INITIAL (current_function_decl
);
116 BLOCK_SUBBLOCKS (data
.block
) = NULL_TREE
;
117 BLOCK_CHAIN (data
.block
) = NULL_TREE
;
118 TREE_ASM_WRITTEN (data
.block
) = 1;
119 data
.return_statements
.create (8);
121 bind
= gimple_seq_first_stmt (body
);
123 gimple_seq_add_stmt (&lowered_body
, bind
);
124 i
= gsi_start (lowered_body
);
125 lower_gimple_bind (&i
, &data
);
127 i
= gsi_last (lowered_body
);
129 /* If the function falls off the end, we need a null return statement.
130 If we've already got one in the return_statements vector, we don't
131 need to do anything special. Otherwise build one by hand. */
132 bool may_fallthru
= gimple_seq_may_fallthru (lowered_body
);
134 && (data
.return_statements
.is_empty ()
135 || (gimple_return_retval (data
.return_statements
.last().stmt
)
138 x
= gimple_build_return (NULL
);
139 gimple_set_location (x
, cfun
->function_end_locus
);
140 gimple_set_block (x
, DECL_INITIAL (current_function_decl
));
141 gsi_insert_after (&i
, x
, GSI_CONTINUE_LINKING
);
142 may_fallthru
= false;
145 /* If we lowered any return statements, emit the representative
146 at the end of the function. */
147 while (!data
.return_statements
.is_empty ())
149 return_statements_t t
= data
.return_statements
.pop ();
150 x
= gimple_build_label (t
.label
);
151 gsi_insert_after (&i
, x
, GSI_CONTINUE_LINKING
);
152 gsi_insert_after (&i
, t
.stmt
, GSI_CONTINUE_LINKING
);
155 /* Remove the line number from the representative return statement.
156 It now fills in for the fallthru too. Failure to remove this
157 will result in incorrect results for coverage analysis. */
158 gimple_set_location (t
.stmt
, UNKNOWN_LOCATION
);
159 may_fallthru
= false;
163 /* Once the old body has been lowered, replace it with the new
165 gimple_set_body (current_function_decl
, lowered_body
);
167 gcc_assert (data
.block
== DECL_INITIAL (current_function_decl
));
168 BLOCK_SUBBLOCKS (data
.block
)
169 = blocks_nreverse (BLOCK_SUBBLOCKS (data
.block
));
171 clear_block_marks (data
.block
);
172 data
.return_statements
.release ();
178 const pass_data pass_data_lower_cf
=
180 GIMPLE_PASS
, /* type */
182 OPTGROUP_NONE
, /* optinfo_flags */
184 PROP_gimple_any
, /* properties_required */
185 PROP_gimple_lcf
, /* properties_provided */
186 0, /* properties_destroyed */
187 0, /* todo_flags_start */
188 0, /* todo_flags_finish */
191 class pass_lower_cf
: public gimple_opt_pass
194 pass_lower_cf (gcc::context
*ctxt
)
195 : gimple_opt_pass (pass_data_lower_cf
, ctxt
)
198 /* opt_pass methods: */
199 virtual unsigned int execute (function
*) { return lower_function_body (); }
201 }; // class pass_lower_cf
206 make_pass_lower_cf (gcc::context
*ctxt
)
208 return new pass_lower_cf (ctxt
);
211 /* Lower sequence SEQ. Unlike gimplification the statements are not relowered
212 when they are changed -- if this has to be done, the lowering routine must
213 do it explicitly. DATA is passed through the recursion. */
216 lower_sequence (gimple_seq
*seq
, struct lower_data
*data
)
218 gimple_stmt_iterator gsi
;
220 for (gsi
= gsi_start (*seq
); !gsi_end_p (gsi
); )
221 lower_stmt (&gsi
, data
);
225 /* Lower the OpenMP directive statement pointed by GSI. DATA is
226 passed through the recursion. */
229 lower_omp_directive (gimple_stmt_iterator
*gsi
, struct lower_data
*data
)
233 stmt
= gsi_stmt (*gsi
);
235 lower_sequence (gimple_omp_body_ptr (stmt
), data
);
236 gsi_insert_seq_after (gsi
, gimple_omp_body (stmt
), GSI_CONTINUE_LINKING
);
237 gimple_omp_set_body (stmt
, NULL
);
242 /* Lower statement GSI. DATA is passed through the recursion. We try to
243 track the fallthruness of statements and get rid of unreachable return
244 statements in order to prevent the EH lowering pass from adding useless
245 edges that can cause bogus warnings to be issued later; this guess need
246 not be 100% accurate, simply be conservative and reset cannot_fallthru
247 to false if we don't know. */
250 lower_stmt (gimple_stmt_iterator
*gsi
, struct lower_data
*data
)
252 gimple stmt
= gsi_stmt (*gsi
);
254 gimple_set_block (stmt
, data
->block
);
256 switch (gimple_code (stmt
))
259 lower_gimple_bind (gsi
, data
);
260 /* Propagate fallthruness. */
266 data
->cannot_fallthru
= true;
271 if (data
->cannot_fallthru
)
273 gsi_remove (gsi
, false);
274 /* Propagate fallthruness. */
278 lower_gimple_return (gsi
, data
);
279 data
->cannot_fallthru
= true;
284 if (gimple_try_kind (stmt
) == GIMPLE_TRY_CATCH
)
285 lower_try_catch (gsi
, data
);
288 /* It must be a GIMPLE_TRY_FINALLY. */
289 bool cannot_fallthru
;
290 lower_sequence (gimple_try_eval_ptr (stmt
), data
);
291 cannot_fallthru
= data
->cannot_fallthru
;
293 /* The finally clause is always executed after the try clause,
294 so if it does not fall through, then the try-finally will not
295 fall through. Otherwise, if the try clause does not fall
296 through, then when the finally clause falls through it will
297 resume execution wherever the try clause was going. So the
298 whole try-finally will only fall through if both the try
299 clause and the finally clause fall through. */
300 data
->cannot_fallthru
= false;
301 lower_sequence (gimple_try_cleanup_ptr (stmt
), data
);
302 data
->cannot_fallthru
|= cannot_fallthru
;
309 geh_else
*eh_else_stmt
= as_a
<geh_else
*> (stmt
);
310 lower_sequence (gimple_eh_else_n_body_ptr (eh_else_stmt
), data
);
311 lower_sequence (gimple_eh_else_e_body_ptr (eh_else_stmt
), data
);
320 case GIMPLE_EH_MUST_NOT_THROW
:
322 case GIMPLE_OMP_SECTIONS
:
323 case GIMPLE_OMP_SECTIONS_SWITCH
:
324 case GIMPLE_OMP_SECTION
:
325 case GIMPLE_OMP_SINGLE
:
326 case GIMPLE_OMP_MASTER
:
327 case GIMPLE_OMP_TASKGROUP
:
328 case GIMPLE_OMP_ORDERED
:
329 case GIMPLE_OMP_CRITICAL
:
330 case GIMPLE_OMP_RETURN
:
331 case GIMPLE_OMP_ATOMIC_LOAD
:
332 case GIMPLE_OMP_ATOMIC_STORE
:
333 case GIMPLE_OMP_CONTINUE
:
338 tree decl
= gimple_call_fndecl (stmt
);
341 for (i
= 0; i
< gimple_call_num_args (stmt
); i
++)
343 tree arg
= gimple_call_arg (stmt
, i
);
345 TREE_SET_BLOCK (arg
, data
->block
);
349 && DECL_BUILT_IN_CLASS (decl
) == BUILT_IN_NORMAL
)
351 if (DECL_FUNCTION_CODE (decl
) == BUILT_IN_SETJMP
)
353 lower_builtin_setjmp (gsi
);
354 data
->cannot_fallthru
= false;
357 else if (DECL_FUNCTION_CODE (decl
) == BUILT_IN_POSIX_MEMALIGN
358 && flag_tree_bit_ccp
)
360 lower_builtin_posix_memalign (gsi
);
365 if (decl
&& (flags_from_decl_or_type (decl
) & ECF_NORETURN
))
367 data
->cannot_fallthru
= true;
374 case GIMPLE_OMP_PARALLEL
:
375 case GIMPLE_OMP_TASK
:
376 case GIMPLE_OMP_TARGET
:
377 case GIMPLE_OMP_TEAMS
:
378 data
->cannot_fallthru
= false;
379 lower_omp_directive (gsi
, data
);
380 data
->cannot_fallthru
= false;
383 case GIMPLE_TRANSACTION
:
384 lower_sequence (gimple_transaction_body_ptr (
385 as_a
<gtransaction
*> (stmt
)),
393 data
->cannot_fallthru
= false;
397 /* Lower a bind_expr TSI. DATA is passed through the recursion. */
400 lower_gimple_bind (gimple_stmt_iterator
*gsi
, struct lower_data
*data
)
402 tree old_block
= data
->block
;
403 gbind
*stmt
= as_a
<gbind
*> (gsi_stmt (*gsi
));
404 tree new_block
= gimple_bind_block (stmt
);
408 if (new_block
== old_block
)
410 /* The outermost block of the original function may not be the
411 outermost statement chain of the gimplified function. So we
412 may see the outermost block just inside the function. */
413 gcc_assert (new_block
== DECL_INITIAL (current_function_decl
));
418 /* We do not expect to handle duplicate blocks. */
419 gcc_assert (!TREE_ASM_WRITTEN (new_block
));
420 TREE_ASM_WRITTEN (new_block
) = 1;
422 /* Block tree may get clobbered by inlining. Normally this would
423 be fixed in rest_of_decl_compilation using block notes, but
424 since we are not going to emit them, it is up to us. */
425 BLOCK_CHAIN (new_block
) = BLOCK_SUBBLOCKS (old_block
);
426 BLOCK_SUBBLOCKS (old_block
) = new_block
;
427 BLOCK_SUBBLOCKS (new_block
) = NULL_TREE
;
428 BLOCK_SUPERCONTEXT (new_block
) = old_block
;
430 data
->block
= new_block
;
434 record_vars (gimple_bind_vars (stmt
));
435 lower_sequence (gimple_bind_body_ptr (stmt
), data
);
439 gcc_assert (data
->block
== new_block
);
441 BLOCK_SUBBLOCKS (new_block
)
442 = blocks_nreverse (BLOCK_SUBBLOCKS (new_block
));
443 data
->block
= old_block
;
446 /* The GIMPLE_BIND no longer carries any useful information -- kill it. */
447 gsi_insert_seq_before (gsi
, gimple_bind_body (stmt
), GSI_SAME_STMT
);
448 gsi_remove (gsi
, false);
451 /* Same as above, but for a GIMPLE_TRY_CATCH. */
454 lower_try_catch (gimple_stmt_iterator
*gsi
, struct lower_data
*data
)
456 bool cannot_fallthru
;
457 gimple stmt
= gsi_stmt (*gsi
);
458 gimple_stmt_iterator i
;
460 /* We don't handle GIMPLE_TRY_FINALLY. */
461 gcc_assert (gimple_try_kind (stmt
) == GIMPLE_TRY_CATCH
);
463 lower_sequence (gimple_try_eval_ptr (stmt
), data
);
464 cannot_fallthru
= data
->cannot_fallthru
;
466 i
= gsi_start (*gimple_try_cleanup_ptr (stmt
));
467 switch (gimple_code (gsi_stmt (i
)))
470 /* We expect to see a sequence of GIMPLE_CATCH stmts, each with a
471 catch expression and a body. The whole try/catch may fall
472 through iff any of the catch bodies falls through. */
473 for (; !gsi_end_p (i
); gsi_next (&i
))
475 data
->cannot_fallthru
= false;
476 lower_sequence (gimple_catch_handler_ptr (
477 as_a
<gcatch
*> (gsi_stmt (i
))),
479 if (!data
->cannot_fallthru
)
480 cannot_fallthru
= false;
484 case GIMPLE_EH_FILTER
:
485 /* The exception filter expression only matters if there is an
486 exception. If the exception does not match EH_FILTER_TYPES,
487 we will execute EH_FILTER_FAILURE, and we will fall through
488 if that falls through. If the exception does match
489 EH_FILTER_TYPES, the stack unwinder will continue up the
490 stack, so we will not fall through. We don't know whether we
491 will throw an exception which matches EH_FILTER_TYPES or not,
492 so we just ignore EH_FILTER_TYPES and assume that we might
493 throw an exception which doesn't match. */
494 data
->cannot_fallthru
= false;
495 lower_sequence (gimple_eh_filter_failure_ptr (gsi_stmt (i
)), data
);
496 if (!data
->cannot_fallthru
)
497 cannot_fallthru
= false;
501 /* This case represents statements to be executed when an
502 exception occurs. Those statements are implicitly followed
503 by a GIMPLE_RESX to resume execution after the exception. So
504 in this case the try/catch never falls through. */
505 data
->cannot_fallthru
= false;
506 lower_sequence (gimple_try_cleanup_ptr (stmt
), data
);
510 data
->cannot_fallthru
= cannot_fallthru
;
515 /* Try to determine whether a TRY_CATCH expression can fall through.
516 This is a subroutine of gimple_stmt_may_fallthru. */
519 gimple_try_catch_may_fallthru (gtry
*stmt
)
521 gimple_stmt_iterator i
;
523 /* We don't handle GIMPLE_TRY_FINALLY. */
524 gcc_assert (gimple_try_kind (stmt
) == GIMPLE_TRY_CATCH
);
526 /* If the TRY block can fall through, the whole TRY_CATCH can
528 if (gimple_seq_may_fallthru (gimple_try_eval (stmt
)))
531 i
= gsi_start (*gimple_try_cleanup_ptr (stmt
));
532 switch (gimple_code (gsi_stmt (i
)))
535 /* We expect to see a sequence of GIMPLE_CATCH stmts, each with a
536 catch expression and a body. The whole try/catch may fall
537 through iff any of the catch bodies falls through. */
538 for (; !gsi_end_p (i
); gsi_next (&i
))
540 if (gimple_seq_may_fallthru (gimple_catch_handler (
541 as_a
<gcatch
*> (gsi_stmt (i
)))))
546 case GIMPLE_EH_FILTER
:
547 /* The exception filter expression only matters if there is an
548 exception. If the exception does not match EH_FILTER_TYPES,
549 we will execute EH_FILTER_FAILURE, and we will fall through
550 if that falls through. If the exception does match
551 EH_FILTER_TYPES, the stack unwinder will continue up the
552 stack, so we will not fall through. We don't know whether we
553 will throw an exception which matches EH_FILTER_TYPES or not,
554 so we just ignore EH_FILTER_TYPES and assume that we might
555 throw an exception which doesn't match. */
556 return gimple_seq_may_fallthru (gimple_eh_filter_failure (gsi_stmt (i
)));
559 /* This case represents statements to be executed when an
560 exception occurs. Those statements are implicitly followed
561 by a GIMPLE_RESX to resume execution after the exception. So
562 in this case the try/catch never falls through. */
568 /* Try to determine if we can continue executing the statement
569 immediately following STMT. This guess need not be 100% accurate;
570 simply be conservative and return true if we don't know. This is
571 used only to avoid stupidly generating extra code. If we're wrong,
572 we'll just delete the extra code later. */
575 gimple_stmt_may_fallthru (gimple stmt
)
580 switch (gimple_code (stmt
))
585 /* Easy cases. If the last statement of the seq implies
586 control transfer, then we can't fall through. */
590 /* Switch has already been lowered and represents a branch
591 to a selected label and hence can't fall through. */
595 /* GIMPLE_COND's are already lowered into a two-way branch. They
596 can't fall through. */
600 return gimple_seq_may_fallthru (
601 gimple_bind_body (as_a
<gbind
*> (stmt
)));
604 if (gimple_try_kind (stmt
) == GIMPLE_TRY_CATCH
)
605 return gimple_try_catch_may_fallthru (as_a
<gtry
*> (stmt
));
607 /* It must be a GIMPLE_TRY_FINALLY. */
609 /* The finally clause is always executed after the try clause,
610 so if it does not fall through, then the try-finally will not
611 fall through. Otherwise, if the try clause does not fall
612 through, then when the finally clause falls through it will
613 resume execution wherever the try clause was going. So the
614 whole try-finally will only fall through if both the try
615 clause and the finally clause fall through. */
616 return (gimple_seq_may_fallthru (gimple_try_eval (stmt
))
617 && gimple_seq_may_fallthru (gimple_try_cleanup (stmt
)));
621 geh_else
*eh_else_stmt
= as_a
<geh_else
*> (stmt
);
622 return (gimple_seq_may_fallthru (gimple_eh_else_n_body (eh_else_stmt
))
623 || gimple_seq_may_fallthru (gimple_eh_else_e_body (
628 /* Functions that do not return do not fall through. */
629 return (gimple_call_flags (stmt
) & ECF_NORETURN
) == 0;
637 /* Same as gimple_stmt_may_fallthru, but for the gimple sequence SEQ. */
640 gimple_seq_may_fallthru (gimple_seq seq
)
642 return gimple_stmt_may_fallthru (gimple_seq_last_stmt (seq
));
646 /* Lower a GIMPLE_RETURN GSI. DATA is passed through the recursion. */
649 lower_gimple_return (gimple_stmt_iterator
*gsi
, struct lower_data
*data
)
651 greturn
*stmt
= as_a
<greturn
*> (gsi_stmt (*gsi
));
654 return_statements_t tmp_rs
;
656 /* Match this up with an existing return statement that's been created. */
657 for (i
= data
->return_statements
.length () - 1;
660 tmp_rs
= data
->return_statements
[i
];
662 if (gimple_return_retval (stmt
) == gimple_return_retval (tmp_rs
.stmt
))
664 /* Remove the line number from the representative return statement.
665 It now fills in for many such returns. Failure to remove this
666 will result in incorrect results for coverage analysis. */
667 gimple_set_location (tmp_rs
.stmt
, UNKNOWN_LOCATION
);
673 /* Not found. Create a new label and record the return statement. */
674 tmp_rs
.label
= create_artificial_label (cfun
->function_end_locus
);
676 data
->return_statements
.safe_push (tmp_rs
);
678 /* Generate a goto statement and remove the return statement. */
680 /* When not optimizing, make sure user returns are preserved. */
681 if (!optimize
&& gimple_has_location (stmt
))
682 DECL_ARTIFICIAL (tmp_rs
.label
) = 0;
683 t
= gimple_build_goto (tmp_rs
.label
);
684 gimple_set_location (t
, gimple_location (stmt
));
685 gimple_set_block (t
, gimple_block (stmt
));
686 gsi_insert_before (gsi
, t
, GSI_SAME_STMT
);
687 gsi_remove (gsi
, false);
690 /* Lower a __builtin_setjmp GSI.
692 __builtin_setjmp is passed a pointer to an array of five words (not
693 all will be used on all machines). It operates similarly to the C
694 library function of the same name, but is more efficient.
696 It is lowered into 2 other builtins, namely __builtin_setjmp_setup,
697 __builtin_setjmp_receiver.
699 After full lowering, the body of the function should look like:
707 __builtin_setjmp_setup (&buf, &<D1847>);
711 __builtin_setjmp_receiver (&<D1847>);
714 if (D.1844 == 0) goto <D1848>; else goto <D1849>;
718 __builtin_setjmp_setup (&buf, &<D2847>);
722 __builtin_setjmp_receiver (&<D2847>);
725 if (D.2844 == 0) goto <D2848>; else goto <D2849>;
733 During cfg creation an extra per-function (or per-OpenMP region)
734 block with ABNORMAL_DISPATCHER internal call will be added, unique
735 destination of all the abnormal call edges and the unique source of
736 all the abnormal edges to the receivers, thus keeping the complexity
737 explosion localized. */
740 lower_builtin_setjmp (gimple_stmt_iterator
*gsi
)
742 gimple stmt
= gsi_stmt (*gsi
);
743 location_t loc
= gimple_location (stmt
);
744 tree cont_label
= create_artificial_label (loc
);
745 tree next_label
= create_artificial_label (loc
);
749 /* __builtin_setjmp_{setup,receiver} aren't ECF_RETURNS_TWICE and for RTL
750 these builtins are modelled as non-local label jumps to the label
751 that is passed to these two builtins, so pretend we have a non-local
752 label during GIMPLE passes too. See PR60003. */
753 cfun
->has_nonlocal_label
= 1;
755 /* NEXT_LABEL is the label __builtin_longjmp will jump to. Its address is
756 passed to both __builtin_setjmp_setup and __builtin_setjmp_receiver. */
757 FORCED_LABEL (next_label
) = 1;
759 dest
= gimple_call_lhs (stmt
);
761 /* Build '__builtin_setjmp_setup (BUF, NEXT_LABEL)' and insert. */
762 arg
= build_addr (next_label
, current_function_decl
);
763 t
= builtin_decl_implicit (BUILT_IN_SETJMP_SETUP
);
764 g
= gimple_build_call (t
, 2, gimple_call_arg (stmt
, 0), arg
);
765 gimple_set_location (g
, loc
);
766 gimple_set_block (g
, gimple_block (stmt
));
767 gsi_insert_before (gsi
, g
, GSI_SAME_STMT
);
769 /* Build 'DEST = 0' and insert. */
772 g
= gimple_build_assign (dest
, build_zero_cst (TREE_TYPE (dest
)));
773 gimple_set_location (g
, loc
);
774 gimple_set_block (g
, gimple_block (stmt
));
775 gsi_insert_before (gsi
, g
, GSI_SAME_STMT
);
778 /* Build 'goto CONT_LABEL' and insert. */
779 g
= gimple_build_goto (cont_label
);
780 gsi_insert_before (gsi
, g
, GSI_SAME_STMT
);
782 /* Build 'NEXT_LABEL:' and insert. */
783 g
= gimple_build_label (next_label
);
784 gsi_insert_before (gsi
, g
, GSI_SAME_STMT
);
786 /* Build '__builtin_setjmp_receiver (NEXT_LABEL)' and insert. */
787 arg
= build_addr (next_label
, current_function_decl
);
788 t
= builtin_decl_implicit (BUILT_IN_SETJMP_RECEIVER
);
789 g
= gimple_build_call (t
, 1, arg
);
790 gimple_set_location (g
, loc
);
791 gimple_set_block (g
, gimple_block (stmt
));
792 gsi_insert_before (gsi
, g
, GSI_SAME_STMT
);
794 /* Build 'DEST = 1' and insert. */
797 g
= gimple_build_assign (dest
, fold_convert_loc (loc
, TREE_TYPE (dest
),
799 gimple_set_location (g
, loc
);
800 gimple_set_block (g
, gimple_block (stmt
));
801 gsi_insert_before (gsi
, g
, GSI_SAME_STMT
);
804 /* Build 'CONT_LABEL:' and insert. */
805 g
= gimple_build_label (cont_label
);
806 gsi_insert_before (gsi
, g
, GSI_SAME_STMT
);
808 /* Remove the call to __builtin_setjmp. */
809 gsi_remove (gsi
, false);
812 /* Lower calls to posix_memalign to
813 res = posix_memalign (ptr, align, size);
815 *ptr = __builtin_assume_aligned (*ptr, align);
818 res = posix_memalign (&tem, align, size);
820 ptr = __builtin_assume_aligned (tem, align);
821 in case the first argument was &ptr. That way we can get at the
822 alignment of the heap pointer in CCP. */
825 lower_builtin_posix_memalign (gimple_stmt_iterator
*gsi
)
827 gimple stmt
, call
= gsi_stmt (*gsi
);
828 tree pptr
= gimple_call_arg (call
, 0);
829 tree align
= gimple_call_arg (call
, 1);
830 tree res
= gimple_call_lhs (call
);
831 tree ptr
= create_tmp_reg (ptr_type_node
, NULL
);
832 if (TREE_CODE (pptr
) == ADDR_EXPR
)
834 tree tem
= create_tmp_var (ptr_type_node
, NULL
);
835 TREE_ADDRESSABLE (tem
) = 1;
836 gimple_call_set_arg (call
, 0, build_fold_addr_expr (tem
));
837 stmt
= gimple_build_assign (ptr
, tem
);
840 stmt
= gimple_build_assign (ptr
,
841 fold_build2 (MEM_REF
, ptr_type_node
, pptr
,
842 build_int_cst (ptr_type_node
, 0)));
843 if (res
== NULL_TREE
)
845 res
= create_tmp_reg (integer_type_node
, NULL
);
846 gimple_call_set_lhs (call
, res
);
848 tree align_label
= create_artificial_label (UNKNOWN_LOCATION
);
849 tree noalign_label
= create_artificial_label (UNKNOWN_LOCATION
);
850 gimple cond
= gimple_build_cond (EQ_EXPR
, res
, integer_zero_node
,
851 align_label
, noalign_label
);
852 gsi_insert_after (gsi
, cond
, GSI_NEW_STMT
);
853 gsi_insert_after (gsi
, gimple_build_label (align_label
), GSI_NEW_STMT
);
854 gsi_insert_after (gsi
, stmt
, GSI_NEW_STMT
);
855 stmt
= gimple_build_call (builtin_decl_implicit (BUILT_IN_ASSUME_ALIGNED
),
857 gimple_call_set_lhs (stmt
, ptr
);
858 gsi_insert_after (gsi
, stmt
, GSI_NEW_STMT
);
859 stmt
= gimple_build_assign (fold_build2 (MEM_REF
, ptr_type_node
, pptr
,
860 build_int_cst (ptr_type_node
, 0)),
862 gsi_insert_after (gsi
, stmt
, GSI_NEW_STMT
);
863 gsi_insert_after (gsi
, gimple_build_label (noalign_label
), GSI_NEW_STMT
);
867 /* Record the variables in VARS into function FN. */
870 record_vars_into (tree vars
, tree fn
)
872 for (; vars
; vars
= DECL_CHAIN (vars
))
876 /* BIND_EXPRs contains also function/type/constant declarations
877 we don't need to care about. */
878 if (TREE_CODE (var
) != VAR_DECL
)
881 /* Nothing to do in this case. */
882 if (DECL_EXTERNAL (var
))
885 /* Record the variable. */
886 add_local_decl (DECL_STRUCT_FUNCTION (fn
), var
);
891 /* Record the variables in VARS into current_function_decl. */
894 record_vars (tree vars
)
896 record_vars_into (vars
, current_function_decl
);