Author: pallavimathew Date: 2011-06-24 13:30:15 -0400 (Fri, 24 Jun 2011) New Revision: 3662
Modified: trunk/osprey/ipa/main/optimize/ipo_inline.cxx trunk/osprey/ipa/main/optimize/ipo_inline_util.h Log: Testcase #include <stdio.h> typedef void (*inlinedFuncPtr)(char *, int, ...); void inlined_subr(char *str, int i, ...) { int idx; if( i == 0 ) return; printf( "%s=%d\n", str, i); } void inliner_subr( inlinedFuncPtr fcn) { (*fcn)("i", 3); } int main() { inliner_subr(inlined_subr); return 1; } Problem/Fix Description Open64 bug #726. When above testcase is compiled with 'opencc -Ofast', ipa_link segfaults or produces the internal error: Invalid argument for ST_type() The problem occurs when IPA tries to inline a function pointer that: - has varargs, - is determined to be partially inlinable (see Identify_Partial_Inline_Candiate() and Has_Partial_Inline_Attrib()), and - has a void return type. The assert failure occurs in function ST_Type when called from ipo_inline.cxx:IPO_INLINE::Post_Process_Caller because it is not recognized that the callee has a void return type. Note that a fix for this problem was introduced at revision 3480. This fix backs out the previous change for bug #726 and implements a new fix for the original problem affecting partial inlining of a smaller set of functions (only those that have void return type). The new fix, in routine IPO_INLINE::Post_Process_Caller, is to add checks for the opcodes OPR_VICALL (void return indirect call) and OPR_VINTRINSIC_CALL (void return intrinsic call) to the existing check for OPR_VCALL. C.R. by Michael Lai Modified: trunk/osprey/ipa/main/optimize/ipo_inline.cxx =================================================================== --- trunk/osprey/ipa/main/optimize/ipo_inline.cxx 2011-06-23 15:57:41 UTC (rev 3661) +++ trunk/osprey/ipa/main/optimize/ipo_inline.cxx 2011-06-24 17:30:15 UTC (rev 3662) @@ -4643,7 +4643,8 @@ WN_next (call) = NULL; // Check to see if "call" has a return value. - if (aux.rp.size () > 0 && WN_opcode (call) != OPC_VCALL) { + if (aux.rp.size () > 0 && WN_opcode (call) != OPC_VCALL && + WN_opcode (call) != OPC_VICALL && WN_opcode (call) != OPC_VINTRINSIC_CALL) { // Place the call site in a block. LWN_Insert_Block_Before(aux.part_inl_leftover_call_site, NULL, call); WN_Set_Parent(call, aux.part_inl_leftover_call_site, Parent_Map, Current_Map_Tab); Modified: trunk/osprey/ipa/main/optimize/ipo_inline_util.h =================================================================== --- trunk/osprey/ipa/main/optimize/ipo_inline_util.h 2011-06-23 15:57:41 UTC (rev 3661) +++ trunk/osprey/ipa/main/optimize/ipo_inline_util.h 2011-06-24 17:30:15 UTC (rev 3662) @@ -126,7 +126,7 @@ public: - RETURN_PREG () : use_return_val (FALSE) { + RETURN_PREG () : use_return_val (TRUE) { _u.old_style.num_pregs = 0; } ------------------------------------------------------------------------------ All the data continuously generated in your IT infrastructure contains a definitive record of customers, application performance, security threats, fraudulent activity and more. Splunk takes this data and makes sense of it. Business sense. IT sense. Common sense.. http://p.sf.net/sfu/splunk-d2d-c1 _______________________________________________ Open64-devel mailing list Open64-devel@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/open64-devel