1e8e97487223aa71ced5d519c15ca0d21e8d28da5Eric Anholt/* 2e8e97487223aa71ced5d519c15ca0d21e8d28da5Eric Anholt * Copyright © 2010 Intel Corporation 3e8e97487223aa71ced5d519c15ca0d21e8d28da5Eric Anholt * 4e8e97487223aa71ced5d519c15ca0d21e8d28da5Eric Anholt * Permission is hereby granted, free of charge, to any person obtaining a 5e8e97487223aa71ced5d519c15ca0d21e8d28da5Eric Anholt * copy of this software and associated documentation files (the "Software"), 6e8e97487223aa71ced5d519c15ca0d21e8d28da5Eric Anholt * to deal in the Software without restriction, including without limitation 7e8e97487223aa71ced5d519c15ca0d21e8d28da5Eric Anholt * the rights to use, copy, modify, merge, publish, distribute, sublicense, 8e8e97487223aa71ced5d519c15ca0d21e8d28da5Eric Anholt * and/or sell copies of the Software, and to permit persons to whom the 9e8e97487223aa71ced5d519c15ca0d21e8d28da5Eric Anholt * Software is furnished to do so, subject to the following conditions: 10e8e97487223aa71ced5d519c15ca0d21e8d28da5Eric Anholt * 11e8e97487223aa71ced5d519c15ca0d21e8d28da5Eric Anholt * The above copyright notice and this permission notice (including the next 12e8e97487223aa71ced5d519c15ca0d21e8d28da5Eric Anholt * paragraph) shall be included in all copies or substantial portions of the 13e8e97487223aa71ced5d519c15ca0d21e8d28da5Eric Anholt * Software. 14e8e97487223aa71ced5d519c15ca0d21e8d28da5Eric Anholt * 15e8e97487223aa71ced5d519c15ca0d21e8d28da5Eric Anholt * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16e8e97487223aa71ced5d519c15ca0d21e8d28da5Eric Anholt * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17e8e97487223aa71ced5d519c15ca0d21e8d28da5Eric Anholt * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL 18e8e97487223aa71ced5d519c15ca0d21e8d28da5Eric Anholt * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19e8e97487223aa71ced5d519c15ca0d21e8d28da5Eric Anholt * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING 20e8e97487223aa71ced5d519c15ca0d21e8d28da5Eric Anholt * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER 21e8e97487223aa71ced5d519c15ca0d21e8d28da5Eric Anholt * DEALINGS IN THE SOFTWARE. 22e8e97487223aa71ced5d519c15ca0d21e8d28da5Eric Anholt */ 23e8e97487223aa71ced5d519c15ca0d21e8d28da5Eric Anholt 24e8e97487223aa71ced5d519c15ca0d21e8d28da5Eric Anholt/** 25e8e97487223aa71ced5d519c15ca0d21e8d28da5Eric Anholt * \file ir_function_can_inline.cpp 26e8e97487223aa71ced5d519c15ca0d21e8d28da5Eric Anholt * 27e8e97487223aa71ced5d519c15ca0d21e8d28da5Eric Anholt * Determines if we can inline a function call using ir_function_inlining.cpp. 28e8e97487223aa71ced5d519c15ca0d21e8d28da5Eric Anholt * 29e8e97487223aa71ced5d519c15ca0d21e8d28da5Eric Anholt * The primary restriction is that we can't return from the function 30e8e97487223aa71ced5d519c15ca0d21e8d28da5Eric Anholt * other than as the last instruction. We could potentially work 31e8e97487223aa71ced5d519c15ca0d21e8d28da5Eric Anholt * around this for some constructs by flattening control flow and 32e8e97487223aa71ced5d519c15ca0d21e8d28da5Eric Anholt * moving the return to the end, or by using breaks from a do {} while 33e8e97487223aa71ced5d519c15ca0d21e8d28da5Eric Anholt * (0) loop surrounding the function body. 34e8e97487223aa71ced5d519c15ca0d21e8d28da5Eric Anholt */ 35e8e97487223aa71ced5d519c15ca0d21e8d28da5Eric Anholt 36e8e97487223aa71ced5d519c15ca0d21e8d28da5Eric Anholt#include "ir.h" 37e8e97487223aa71ced5d519c15ca0d21e8d28da5Eric Anholt 38671e4f6321ce173b97fdbb459778df0bc9625b9bIan Romanickclass ir_function_can_inline_visitor : public ir_hierarchical_visitor { 39e8e97487223aa71ced5d519c15ca0d21e8d28da5Eric Anholtpublic: 40e8e97487223aa71ced5d519c15ca0d21e8d28da5Eric Anholt ir_function_can_inline_visitor() 41e8e97487223aa71ced5d519c15ca0d21e8d28da5Eric Anholt { 42e8e97487223aa71ced5d519c15ca0d21e8d28da5Eric Anholt this->num_returns = 0; 43e8e97487223aa71ced5d519c15ca0d21e8d28da5Eric Anholt } 44e8e97487223aa71ced5d519c15ca0d21e8d28da5Eric Anholt 45671e4f6321ce173b97fdbb459778df0bc9625b9bIan Romanick virtual ir_visitor_status visit_enter(ir_return *); 46e8e97487223aa71ced5d519c15ca0d21e8d28da5Eric Anholt 47e8e97487223aa71ced5d519c15ca0d21e8d28da5Eric Anholt int num_returns; 48e8e97487223aa71ced5d519c15ca0d21e8d28da5Eric Anholt}; 49e8e97487223aa71ced5d519c15ca0d21e8d28da5Eric Anholt 50671e4f6321ce173b97fdbb459778df0bc9625b9bIan Romanickir_visitor_status 51671e4f6321ce173b97fdbb459778df0bc9625b9bIan Romanickir_function_can_inline_visitor::visit_enter(ir_return *ir) 52e8e97487223aa71ced5d519c15ca0d21e8d28da5Eric Anholt{ 53e8e97487223aa71ced5d519c15ca0d21e8d28da5Eric Anholt (void) ir; 54e8e97487223aa71ced5d519c15ca0d21e8d28da5Eric Anholt this->num_returns++; 55671e4f6321ce173b97fdbb459778df0bc9625b9bIan Romanick return visit_continue; 56e8e97487223aa71ced5d519c15ca0d21e8d28da5Eric Anholt} 57e8e97487223aa71ced5d519c15ca0d21e8d28da5Eric Anholt 58e8e97487223aa71ced5d519c15ca0d21e8d28da5Eric Anholtbool 59e8e97487223aa71ced5d519c15ca0d21e8d28da5Eric Anholtcan_inline(ir_call *call) 60e8e97487223aa71ced5d519c15ca0d21e8d28da5Eric Anholt{ 61e8e97487223aa71ced5d519c15ca0d21e8d28da5Eric Anholt ir_function_can_inline_visitor v; 6282065fa20ee3f2880a070f1f4f75509b910ceddeKenneth Graunke const ir_function_signature *callee = call->callee; 63e8a24c65bc06a2a098c05728df0da1e5ed61b1deKenneth Graunke if (!callee->is_defined) 64e8a24c65bc06a2a098c05728df0da1e5ed61b1deKenneth Graunke return false; 65e8e97487223aa71ced5d519c15ca0d21e8d28da5Eric Anholt 66671e4f6321ce173b97fdbb459778df0bc9625b9bIan Romanick v.run((exec_list *) &callee->body); 67e8e97487223aa71ced5d519c15ca0d21e8d28da5Eric Anholt 6819f8f32a967fbe376ca0aae9be12100f4cdf9d31Tilman Sauerbeck /* If the function is empty (no last instruction) or does not end with a 6919f8f32a967fbe376ca0aae9be12100f4cdf9d31Tilman Sauerbeck * return statement, we need to count the implicit return. 7019f8f32a967fbe376ca0aae9be12100f4cdf9d31Tilman Sauerbeck */ 71e8e97487223aa71ced5d519c15ca0d21e8d28da5Eric Anholt ir_instruction *last = (ir_instruction *)callee->body.get_tail(); 7219f8f32a967fbe376ca0aae9be12100f4cdf9d31Tilman Sauerbeck if (last == NULL || !last->as_return()) 73e8e97487223aa71ced5d519c15ca0d21e8d28da5Eric Anholt v.num_returns++; 74e8e97487223aa71ced5d519c15ca0d21e8d28da5Eric Anholt 758006576b3646f3ee621b38b5f27a138a50d073bfEric Anholt return v.num_returns == 1; 76e8e97487223aa71ced5d519c15ca0d21e8d28da5Eric Anholt} 77