*
* Determines if we can inline a function call using ir_function_inlining.cpp.
*
- * The primary restriction is that we can't return from the function
- * other than as the last instruction. We could potentially work
- * around this for some constructs by flattening control flow and
- * moving the return to the end, or by using breaks from a do {} while
- * (0) loop surrounding the function body.
+ * The primary restriction is that we can't return from the function other
+ * than as the last instruction. In lower_jumps.cpp, we can lower return
+ * statements not at the end of the function to other control flow in order to
+ * deal with this restriction.
*/
#include "ir.h"
can_inline(ir_call *call)
{
ir_function_can_inline_visitor v;
- const ir_function_signature *callee = call->get_callee();
+ const ir_function_signature *callee = call->callee;
+ if (!callee->is_defined)
+ return false;
v.run((exec_list *) &callee->body);
+ /* If the function is empty (no last instruction) or does not end with a
+ * return statement, we need to count the implicit return.
+ */
ir_instruction *last = (ir_instruction *)callee->body.get_tail();
- if (last && !last->as_return())
+ if (last == NULL || !last->as_return())
v.num_returns++;
return v.num_returns == 1;