Fix up handling of __builtin_apply in ipa-pure-const (PR tree-optimization/92930)
diff mbox series

Message ID 20191214082121.GS10088@tucnak
State New
Headers show
Series
  • Fix up handling of __builtin_apply in ipa-pure-const (PR tree-optimization/92930)
Related show

Commit Message

Jakub Jelinek Dec. 14, 2019, 8:21 a.m. UTC
Hi!

__builtin_apply calls some other function, so whether it is const, pure or
none of that, whether it can throw or not etc. depends on whether that
called function is const or pure or none of that, whether it can throw etc.
So, assuming __builtin_apply is const is wrong.  The following patch
looks larger due to reformatting, but basically took the case BUILT_IN_APPLY:
line out.

Bootstrapped/regtested on x86_64-linux and i686-linux, ok for trunk?

If we really cared that much about a builtin almost nobody uses, we could
analyze the called function, but this stuff is called from two different
spots and I think from the other one the arguments of the __builtin_apply
call aren't available.

2019-12-14  Jakub Jelinek  <jakub@redhat.com>

	PR tree-optimization/92930
	* ipa-pure-const.c (special_builtin_state): Don't handle
	BUILT_IN_APPLY.  Formatting fixes.
	(check_call): Formatting fixes.

	* gcc.dg/tree-ssa/pr92930.c: New test.


	Jakub

Comments

Richard Biener Dec. 14, 2019, 11:15 a.m. UTC | #1
On December 14, 2019 9:21:21 AM GMT+01:00, Jakub Jelinek <jakub@redhat.com> wrote:
>Hi!
>
>__builtin_apply calls some other function, so whether it is const, pure
>or
>none of that, whether it can throw or not etc. depends on whether that
>called function is const or pure or none of that, whether it can throw
>etc.
>So, assuming __builtin_apply is const is wrong.  The following patch
>looks larger due to reformatting, but basically took the case
>BUILT_IN_APPLY:
>line out.
>
>Bootstrapped/regtested on x86_64-linux and i686-linux, ok for trunk?

Ok. 

Richard. 

>If we really cared that much about a builtin almost nobody uses, we
>could
>analyze the called function, but this stuff is called from two
>different
>spots and I think from the other one the arguments of the
>__builtin_apply
>call aren't available.
>
>2019-12-14  Jakub Jelinek  <jakub@redhat.com>
>
>	PR tree-optimization/92930
>	* ipa-pure-const.c (special_builtin_state): Don't handle
>	BUILT_IN_APPLY.  Formatting fixes.
>	(check_call): Formatting fixes.
>
>	* gcc.dg/tree-ssa/pr92930.c: New test.
>
>--- gcc/ipa-pure-const.c.jj	2019-10-30 10:49:35.075045961 +0100
>+++ gcc/ipa-pure-const.c	2019-12-13 18:52:53.822632062 +0100
>@@ -511,35 +511,34 @@ worse_state (enum pure_const_state_e *st
>    but function using them is.  */
> static bool
> special_builtin_state (enum pure_const_state_e *state, bool *looping,
>-			tree callee)
>+		       tree callee)
> {
>   if (DECL_BUILT_IN_CLASS (callee) == BUILT_IN_NORMAL)
>     switch (DECL_FUNCTION_CODE (callee))
>       {
>-	case BUILT_IN_RETURN:
>-	case BUILT_IN_UNREACHABLE:
>-	CASE_BUILT_IN_ALLOCA:
>-	case BUILT_IN_STACK_SAVE:
>-	case BUILT_IN_STACK_RESTORE:
>-	case BUILT_IN_EH_POINTER:
>-	case BUILT_IN_EH_FILTER:
>-	case BUILT_IN_UNWIND_RESUME:
>-	case BUILT_IN_CXA_END_CLEANUP:
>-	case BUILT_IN_EH_COPY_VALUES:
>-	case BUILT_IN_FRAME_ADDRESS:
>-	case BUILT_IN_APPLY:
>-	case BUILT_IN_APPLY_ARGS:
>-	case BUILT_IN_ASAN_BEFORE_DYNAMIC_INIT:
>-	case BUILT_IN_ASAN_AFTER_DYNAMIC_INIT:
>-	  *looping = false;
>-	  *state = IPA_CONST;
>-	  return true;
>-	case BUILT_IN_PREFETCH:
>-	  *looping = true;
>-	  *state = IPA_CONST;
>-	  return true;
>-	default:
>-	  break;
>+      case BUILT_IN_RETURN:
>+      case BUILT_IN_UNREACHABLE:
>+      CASE_BUILT_IN_ALLOCA:
>+      case BUILT_IN_STACK_SAVE:
>+      case BUILT_IN_STACK_RESTORE:
>+      case BUILT_IN_EH_POINTER:
>+      case BUILT_IN_EH_FILTER:
>+      case BUILT_IN_UNWIND_RESUME:
>+      case BUILT_IN_CXA_END_CLEANUP:
>+      case BUILT_IN_EH_COPY_VALUES:
>+      case BUILT_IN_FRAME_ADDRESS:
>+      case BUILT_IN_APPLY_ARGS:
>+      case BUILT_IN_ASAN_BEFORE_DYNAMIC_INIT:
>+      case BUILT_IN_ASAN_AFTER_DYNAMIC_INIT:
>+	*looping = false;
>+	*state = IPA_CONST;
>+	return true;
>+      case BUILT_IN_PREFETCH:
>+	*looping = true;
>+	*state = IPA_CONST;
>+	return true;
>+      default:
>+	break;
>       }
>   return false;
> }
>@@ -624,9 +623,10 @@ check_call (funct_state local, gcall *ca
> 	  case BUILT_IN_LONGJMP:
> 	  case BUILT_IN_NONLOCAL_GOTO:
> 	    if (dump_file)
>-	      fprintf (dump_file, "    longjmp and nonlocal goto is not
>const/pure\n");
>+	      fprintf (dump_file,
>+		       "    longjmp and nonlocal goto is not const/pure\n");
> 	    local->pure_const_state = IPA_NEITHER;
>-            local->looping = true;
>+	    local->looping = true;
> 	    break;
> 	  default:
> 	    break;
>@@ -1532,7 +1532,7 @@ propagate_pure_const (void)
> 		    }
> 		}
> 	      else if (special_builtin_state (&edge_state, &edge_looping,
>-					       y->decl))
>+					      y->decl))
> 		;
> 	      else
> 		state_from_flags (&edge_state, &edge_looping,
>--- gcc/testsuite/gcc.dg/tree-ssa/pr92930.c.jj	2019-12-13
>18:59:19.651732842 +0100
>+++ gcc/testsuite/gcc.dg/tree-ssa/pr92930.c	2019-12-13
>19:00:34.829582072 +0100
>@@ -0,0 +1,19 @@
>+/* PR tree-optimization/92930 */
>+/* { dg-do compile { target untyped_assembly } } */
>+/* { dg-options "-O2 -fdump-tree-optimized" } */
>+/* { dg-final { scan-tree-dump "__builtin_apply " "optimized" } } */
>+/* { dg-final { scan-tree-dump "__builtin_apply_args" "optimized" } }
>*/
>+
>+void foo (int a, int b, int c, int d, int e, int f, int g);
>+
>+static void bar (int a, ...)
>+{
>+  __builtin_apply (foo, __builtin_apply_args (), 20);
>+}
>+
>+int
>+main ()
>+{
>+  bar (1024, 1025, 1026, 1027, 1028, 1029, 1030);
>+  return 0;
>+}
>
>	Jakub

Patch
diff mbox series

--- gcc/ipa-pure-const.c.jj	2019-10-30 10:49:35.075045961 +0100
+++ gcc/ipa-pure-const.c	2019-12-13 18:52:53.822632062 +0100
@@ -511,35 +511,34 @@  worse_state (enum pure_const_state_e *st
    but function using them is.  */
 static bool
 special_builtin_state (enum pure_const_state_e *state, bool *looping,
-			tree callee)
+		       tree callee)
 {
   if (DECL_BUILT_IN_CLASS (callee) == BUILT_IN_NORMAL)
     switch (DECL_FUNCTION_CODE (callee))
       {
-	case BUILT_IN_RETURN:
-	case BUILT_IN_UNREACHABLE:
-	CASE_BUILT_IN_ALLOCA:
-	case BUILT_IN_STACK_SAVE:
-	case BUILT_IN_STACK_RESTORE:
-	case BUILT_IN_EH_POINTER:
-	case BUILT_IN_EH_FILTER:
-	case BUILT_IN_UNWIND_RESUME:
-	case BUILT_IN_CXA_END_CLEANUP:
-	case BUILT_IN_EH_COPY_VALUES:
-	case BUILT_IN_FRAME_ADDRESS:
-	case BUILT_IN_APPLY:
-	case BUILT_IN_APPLY_ARGS:
-	case BUILT_IN_ASAN_BEFORE_DYNAMIC_INIT:
-	case BUILT_IN_ASAN_AFTER_DYNAMIC_INIT:
-	  *looping = false;
-	  *state = IPA_CONST;
-	  return true;
-	case BUILT_IN_PREFETCH:
-	  *looping = true;
-	  *state = IPA_CONST;
-	  return true;
-	default:
-	  break;
+      case BUILT_IN_RETURN:
+      case BUILT_IN_UNREACHABLE:
+      CASE_BUILT_IN_ALLOCA:
+      case BUILT_IN_STACK_SAVE:
+      case BUILT_IN_STACK_RESTORE:
+      case BUILT_IN_EH_POINTER:
+      case BUILT_IN_EH_FILTER:
+      case BUILT_IN_UNWIND_RESUME:
+      case BUILT_IN_CXA_END_CLEANUP:
+      case BUILT_IN_EH_COPY_VALUES:
+      case BUILT_IN_FRAME_ADDRESS:
+      case BUILT_IN_APPLY_ARGS:
+      case BUILT_IN_ASAN_BEFORE_DYNAMIC_INIT:
+      case BUILT_IN_ASAN_AFTER_DYNAMIC_INIT:
+	*looping = false;
+	*state = IPA_CONST;
+	return true;
+      case BUILT_IN_PREFETCH:
+	*looping = true;
+	*state = IPA_CONST;
+	return true;
+      default:
+	break;
       }
   return false;
 }
@@ -624,9 +623,10 @@  check_call (funct_state local, gcall *ca
 	  case BUILT_IN_LONGJMP:
 	  case BUILT_IN_NONLOCAL_GOTO:
 	    if (dump_file)
-	      fprintf (dump_file, "    longjmp and nonlocal goto is not const/pure\n");
+	      fprintf (dump_file,
+		       "    longjmp and nonlocal goto is not const/pure\n");
 	    local->pure_const_state = IPA_NEITHER;
-            local->looping = true;
+	    local->looping = true;
 	    break;
 	  default:
 	    break;
@@ -1532,7 +1532,7 @@  propagate_pure_const (void)
 		    }
 		}
 	      else if (special_builtin_state (&edge_state, &edge_looping,
-					       y->decl))
+					      y->decl))
 		;
 	      else
 		state_from_flags (&edge_state, &edge_looping,
--- gcc/testsuite/gcc.dg/tree-ssa/pr92930.c.jj	2019-12-13 18:59:19.651732842 +0100
+++ gcc/testsuite/gcc.dg/tree-ssa/pr92930.c	2019-12-13 19:00:34.829582072 +0100
@@ -0,0 +1,19 @@ 
+/* PR tree-optimization/92930 */
+/* { dg-do compile { target untyped_assembly } } */
+/* { dg-options "-O2 -fdump-tree-optimized" } */
+/* { dg-final { scan-tree-dump "__builtin_apply " "optimized" } } */
+/* { dg-final { scan-tree-dump "__builtin_apply_args" "optimized" } } */
+
+void foo (int a, int b, int c, int d, int e, int f, int g);
+
+static void bar (int a, ...)
+{
+  __builtin_apply (foo, __builtin_apply_args (), 20);
+}
+
+int
+main ()
+{
+  bar (1024, 1025, 1026, 1027, 1028, 1029, 1030);
+  return 0;
+}