This is the mail archive of the gcc-patches@gcc.gnu.org mailing list for the GCC project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

Re: PATCH: PR middle-end/59789: [4.9 Regression] ICE in in convert_move, at expr.c:333


> +enum cgraph_inline_failed_flag_t
> +{
> +  CIF_FINAL_NORMAL = 0,
> +  CIF_FINAL_ERROR

The difference is that some errors will never go away, while others are "temporary"
and inliner may revisit them later and inline (such as when indirect call becomes direct).
So perhaps CIF_FINAL/CIF_NORMAL?
> +};
> +
>  /* Structure containing additional information about an indirect call.  */
>  
>  struct GTY(()) cgraph_indirect_call_info
> @@ -774,6 +780,7 @@ void cgraph_unnest_node (struct cgraph_node *);
>  enum availability cgraph_function_body_availability (struct cgraph_node *);
>  void cgraph_add_new_function (tree, bool);
>  const char* cgraph_inline_failed_string (cgraph_inline_failed_t);
> +cgraph_inline_failed_flag_t cgraph_inline_failed_flag (cgraph_inline_failed_t);

When you made them enum rather than flags, lets call it cgraph_inline_failed_type

OK with these changes,
thanks!
Honza
>  
>  void cgraph_set_nothrow_flag (struct cgraph_node *, bool);
>  void cgraph_set_const_flag (struct cgraph_node *, bool, bool);
> diff --git a/gcc/cif-code.def b/gcc/cif-code.def
> index f1df5a0..5591f9a 100644
> --- a/gcc/cif-code.def
> +++ b/gcc/cif-code.def
> @@ -28,84 +28,98 @@ along with GCC see the file COPYING3.  If not see
>     which is a NULL pointer.  */
>  
>  /* Inlining successful.  This must be the first code.  */
> -DEFCIFCODE(OK , NULL)
> +DEFCIFCODE(OK, CIF_FINAL_NORMAL, NULL)
>  
>  /* Inlining failed for an unspecified reason.  */
> -DEFCIFCODE(UNSPECIFIED , "")
> +DEFCIFCODE(UNSPECIFIED, CIF_FINAL_ERROR, "")
>  
>  /* Function has not be considered for inlining.  This is the code for
>     functions that have not been rejected for inlining yet.  */
> -DEFCIFCODE(FUNCTION_NOT_CONSIDERED, N_("function not considered for inlining"))
> +DEFCIFCODE(FUNCTION_NOT_CONSIDERED, CIF_FINAL_NORMAL,
> +	   N_("function not considered for inlining"))
>  
>  /* Caller is compiled with optimizations disabled.  */
> -DEFCIFCODE(FUNCTION_NOT_OPTIMIZED, N_("caller is not optimized"))
> +DEFCIFCODE(FUNCTION_NOT_OPTIMIZED, CIF_FINAL_NORMAL,
> +	   N_("caller is not optimized"))
>  
>  /* Inlining failed owing to unavailable function body.  */
> -DEFCIFCODE(BODY_NOT_AVAILABLE, N_("function body not available"))
> +DEFCIFCODE(BODY_NOT_AVAILABLE, CIF_FINAL_ERROR,
> +	   N_("function body not available"))
>  
>  /* Extern inline function that has been redefined.  */
> -DEFCIFCODE(REDEFINED_EXTERN_INLINE,
> +DEFCIFCODE(REDEFINED_EXTERN_INLINE, CIF_FINAL_NORMAL,
>  	   N_("redefined extern inline functions are not considered for "
>  	      "inlining"))
>  
>  /* Function is not inlinable.  */
> -DEFCIFCODE(FUNCTION_NOT_INLINABLE, N_("function not inlinable"))
> +DEFCIFCODE(FUNCTION_NOT_INLINABLE, CIF_FINAL_ERROR,
> +	   N_("function not inlinable"))
>  
>  /* Function is overwritable.  */
> -DEFCIFCODE(OVERWRITABLE, N_("function body can be overwritten at link time"))
> +DEFCIFCODE(OVERWRITABLE, CIF_FINAL_ERROR,
> +	   N_("function body can be overwritten at link time"))
>  
>  /* Function is not an inlining candidate.  */
> -DEFCIFCODE(FUNCTION_NOT_INLINE_CANDIDATE, N_("function not inline candidate"))
> +DEFCIFCODE(FUNCTION_NOT_INLINE_CANDIDATE, CIF_FINAL_NORMAL,
> +	   N_("function not inline candidate"))
>  
>  /* Inlining failed because of various limit parameters.  */
> -DEFCIFCODE(LARGE_FUNCTION_GROWTH_LIMIT,
> +DEFCIFCODE(LARGE_FUNCTION_GROWTH_LIMIT, CIF_FINAL_NORMAL,
>  	   N_("--param large-function-growth limit reached"))
> -DEFCIFCODE(LARGE_STACK_FRAME_GROWTH_LIMIT,
> +DEFCIFCODE(LARGE_STACK_FRAME_GROWTH_LIMIT, CIF_FINAL_NORMAL,
>  	   N_("--param large-stack-frame-growth limit reached"))
> -DEFCIFCODE(MAX_INLINE_INSNS_SINGLE_LIMIT,
> +DEFCIFCODE(MAX_INLINE_INSNS_SINGLE_LIMIT, CIF_FINAL_NORMAL,
>  	   N_("--param max-inline-insns-single limit reached"))
> -DEFCIFCODE(MAX_INLINE_INSNS_AUTO_LIMIT,
> +DEFCIFCODE(MAX_INLINE_INSNS_AUTO_LIMIT, CIF_FINAL_NORMAL,
>  	   N_("--param max-inline-insns-auto limit reached"))
> -DEFCIFCODE(INLINE_UNIT_GROWTH_LIMIT,
> +DEFCIFCODE(INLINE_UNIT_GROWTH_LIMIT, CIF_FINAL_NORMAL,
>  	   N_("--param inline-unit-growth limit reached"))
>  
>  /* Recursive inlining.  */
> -DEFCIFCODE(RECURSIVE_INLINING, N_("recursive inlining"))
> +DEFCIFCODE(RECURSIVE_INLINING, CIF_FINAL_NORMAL,
> +	   N_("recursive inlining"))
>  
>  /* Call is unlikely.  */
> -DEFCIFCODE(UNLIKELY_CALL, N_("call is unlikely and code size would grow"))
> +DEFCIFCODE(UNLIKELY_CALL, CIF_FINAL_NORMAL,
> +	   N_("call is unlikely and code size would grow"))
>  
>  /* Function is not declared as inline.  */
> -DEFCIFCODE(NOT_DECLARED_INLINED,
> +DEFCIFCODE(NOT_DECLARED_INLINED, CIF_FINAL_NORMAL,
>  	   N_("function not declared inline and code size would grow"))
>  
>  /* Inlining suppressed due to size optimization.  */
> -DEFCIFCODE(OPTIMIZING_FOR_SIZE,
> +DEFCIFCODE(OPTIMIZING_FOR_SIZE, CIF_FINAL_NORMAL,
>  	   N_("optimizing for size and code size would grow"))
>  
>  /* Caller and callee disagree on the arguments.  */
> -DEFCIFCODE(MISMATCHED_ARGUMENTS, N_("mismatched arguments"))
> +DEFCIFCODE(MISMATCHED_ARGUMENTS, CIF_FINAL_ERROR,
> +	   N_("mismatched arguments"))
>  
>  /* Call was originally indirect.  */
> -DEFCIFCODE(ORIGINALLY_INDIRECT_CALL,
> +DEFCIFCODE(ORIGINALLY_INDIRECT_CALL, CIF_FINAL_NORMAL,
>  	   N_("originally indirect function call not considered for inlining"))
>  
>  /* Ths edge represents an indirect edge with a yet-undetermined callee .  */
> -DEFCIFCODE(INDIRECT_UNKNOWN_CALL,
> +DEFCIFCODE(INDIRECT_UNKNOWN_CALL, CIF_FINAL_NORMAL,
>  	   N_("indirect function call with a yet undetermined callee"))
>  
>  /* We can't inline different EH personalities together.  */
> -DEFCIFCODE(EH_PERSONALITY, N_("exception handling personality mismatch"))
> +DEFCIFCODE(EH_PERSONALITY, CIF_FINAL_ERROR,
> +	   N_("exception handling personality mismatch"))
>  
>  /* We can't inline if the callee can throw non-call exceptions but the
>     caller cannot.  */
> -DEFCIFCODE(NON_CALL_EXCEPTIONS, N_("non-call exception handling mismatch"))
> +DEFCIFCODE(NON_CALL_EXCEPTIONS, CIF_FINAL_ERROR,
> +	   N_("non-call exception handling mismatch"))
>  
>  /* We can't inline because of mismatched target specific options.  */
> -DEFCIFCODE(TARGET_OPTION_MISMATCH, N_("target specific option mismatch"))
> +DEFCIFCODE(TARGET_OPTION_MISMATCH, CIF_FINAL_ERROR,
> +	   N_("target specific option mismatch"))
>  
>  /* We can't inline because of mismatched optimization levels.  */
> -DEFCIFCODE(OPTIMIZATION_MISMATCH, N_("optimization level attribute mismatch"))
> +DEFCIFCODE(OPTIMIZATION_MISMATCH, CIF_FINAL_ERROR,
> +	   N_("optimization level attribute mismatch"))
>  
>  /* We can't inline because the callee refers to comdat-local symbols.  */
> -DEFCIFCODE(USES_COMDAT_LOCAL, N_("callee refers to comdat-local symbols"))
> +DEFCIFCODE(USES_COMDAT_LOCAL, CIF_FINAL_NORMAL,
> +	   N_("callee refers to comdat-local symbols"))
> diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
> index 98bc528..b11ff17 100644
> --- a/gcc/testsuite/ChangeLog
> +++ b/gcc/testsuite/ChangeLog
> @@ -1,3 +1,8 @@
> +2014-01-17  H.J. Lu  <hongjiu.lu@intel.com>
> +
> +	PR middle-end/59789
> +	* gcc.target/i386/pr59789.c: New testcase.
> +
>  2014-01-17  Paolo Carlini  <paolo.carlini@oracle.com>
>  
>  	PR c++/59269
> diff --git a/gcc/testsuite/gcc.target/i386/pr59789.c b/gcc/testsuite/gcc.target/i386/pr59789.c
> new file mode 100644
> index 0000000..b144025
> --- /dev/null
> +++ b/gcc/testsuite/gcc.target/i386/pr59789.c
> @@ -0,0 +1,22 @@
> +/* { dg-do compile } */
> +/* { dg-require-effective-target ia32 } */
> +/* { dg-options "-O -march=i686" } */
> +
> +#pragma GCC push_options
> +#pragma GCC target("sse2")
> +typedef int __v4si __attribute__ ((__vector_size__ (16)));
> +typedef long long __m128i __attribute__ ((__vector_size__ (16), __may_alias__));
> +
> +extern __inline __m128i __attribute__((__gnu_inline__, __always_inline__, __artificial__))
> +_mm_set_epi32 (int __q3, int __q2, int __q1, int __q0) /* { dg-error "target specific option mismatch" } */
> +{
> +  return __extension__ (__m128i)(__v4si){ __q0, __q1, __q2, __q3 };
> +}
> +#pragma GCC pop_options
> +
> +
> +__m128i
> +f1(void)
> +{ /* { dg-message "warning: SSE vector return without SSE enabled changes the ABI" } */
> +  return _mm_set_epi32 (0, 0, 0, 0); /* { dg-error "called from here" } */
> +}
> diff --git a/gcc/tree-inline.c b/gcc/tree-inline.c
> index 22521b1..0c6835c 100644
> --- a/gcc/tree-inline.c
> +++ b/gcc/tree-inline.c
> @@ -4116,7 +4116,8 @@ expand_call_inline (basic_block bb, gimple stmt, copy_body_data *id)
>  	  /* During early inline pass, report only when optimization is
>  	     not turned on.  */
>  	  && (cgraph_global_info_ready
> -	      || !optimize)
> +	      || !optimize
> +	      || cgraph_inline_failed_flag (reason) == CIF_FINAL_ERROR)
>  	  /* PR 20090218-1_0.c. Body can be provided by another module. */
>  	  && (reason != CIF_BODY_NOT_AVAILABLE || !flag_generate_lto))
>  	{
> -- 
> 1.8.3.1
> 


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]