public inbox for gcc-patches@gcc.gnu.org
 help / color / mirror / Atom feed
* [PATCH] PR60092, add C11 aligned_alloc handling
@ 2014-02-06 13:27 Richard Biener
  2014-04-28 12:02 ` Richard Biener
  0 siblings, 1 reply; 3+ messages in thread
From: Richard Biener @ 2014-02-06 13:27 UTC (permalink / raw)
  To: gcc-patches; +Cc: Jakub Jelinek, Joseph S. Myers


This adds a builtin for C11 aligned_alloc and support for it
in the alias and alignment tracking machinery.

Bootstrap and regtest in progress on x86_64-unknown-linux-gnu.

Ok for trunk?

Thanks,
Richard.

2014-02-06  Richard Biener  <rguenther@suse.de>

	PR middle-end/60092
	* builtins.def (DEF_C11_BUILTIN): Add.
	(BUILT_IN_ALIGNED_ALLOC): Likewise.
	* coretypes.h (enum function_class): Add function_c11_misc.
	* tree-ssa-alias.c (ref_maybe_used_by_call_p_1): Handle
	BUILT_IN_ALIGNED_ALLOC like BUILT_IN_MALLOC.
	(call_may_clobber_ref_p_1): Likewise.
	* tree-ssa-dce.c (mark_stmt_if_obviously_necessary): Likewise.
	(mark_all_reaching_defs_necessary_1): Likewise.
	(propagate_necessity): Likewise.
	(eliminate_unnecessary_stmts): Likewise.
	* tree-ssa-ccp.c (evaluate_stmt): Handle BUILT_IN_ALIGNED_ALLOC.

	ada/
	* gcc-interface/utils.c: Define flag_isoc11.

	lto/
	* lto-lang.c: Define flag_isoc11.

	* gcc.dg/tree-ssa/alias-32.c: New testcase.
	* gcc.dg/vect/pr60092.c: Likewise.

Index: trunk/gcc/builtins.def
===================================================================
*** trunk.orig/gcc/builtins.def	2014-02-06 12:46:01.085000256 +0100
--- trunk/gcc/builtins.def	2014-02-06 13:13:06.499888349 +0100
*************** along with GCC; see the file COPYING3.
*** 111,116 ****
--- 111,123 ----
    DEF_BUILTIN (ENUM, "__builtin_" NAME, BUILT_IN_NORMAL, TYPE, TYPE,	\
  	       true, true, !flag_isoc99, ATTRS, targetm.libc_has_function (function_c99_misc), true)
  
+ /* Like DEF_LIB_BUILTIN, except that the function is only a part of
+    the standard in C11 or above.  */
+ #undef DEF_C11_BUILTIN
+ #define DEF_C11_BUILTIN(ENUM, NAME, TYPE, ATTRS)	\
+   DEF_BUILTIN (ENUM, "__builtin_" NAME, BUILT_IN_NORMAL, TYPE, TYPE,	\
+ 	       true, true, !flag_isoc11, ATTRS, targetm.libc_has_function (function_c11_misc), true)
+ 
  /* Like DEF_C99_BUILTIN, but for complex math functions.  */
  #undef DEF_C99_COMPL_BUILTIN
  #define DEF_C99_COMPL_BUILTIN(ENUM, NAME, TYPE, ATTRS)	\
*************** DEF_C99_BUILTIN        (BUILT_IN_ACOSH,
*** 223,228 ****
--- 230,236 ----
  DEF_C99_BUILTIN        (BUILT_IN_ACOSHF, "acoshf", BT_FN_FLOAT_FLOAT, ATTR_MATHFN_FPROUNDING_ERRNO)
  DEF_C99_BUILTIN        (BUILT_IN_ACOSHL, "acoshl", BT_FN_LONGDOUBLE_LONGDOUBLE, ATTR_MATHFN_FPROUNDING_ERRNO)
  DEF_C99_C90RES_BUILTIN (BUILT_IN_ACOSL, "acosl", BT_FN_LONGDOUBLE_LONGDOUBLE, ATTR_MATHFN_FPROUNDING_ERRNO)
+ DEF_C11_BUILTIN        (BUILT_IN_ALIGNED_ALLOC, "aligned_alloc", BT_FN_PTR_SIZE_SIZE, ATTR_MALLOC_NOTHROW_LIST)
  DEF_LIB_BUILTIN        (BUILT_IN_ASIN, "asin", BT_FN_DOUBLE_DOUBLE, ATTR_MATHFN_FPROUNDING_ERRNO)
  DEF_C99_C90RES_BUILTIN (BUILT_IN_ASINF, "asinf", BT_FN_FLOAT_FLOAT, ATTR_MATHFN_FPROUNDING_ERRNO)
  DEF_C99_BUILTIN        (BUILT_IN_ASINH, "asinh", BT_FN_DOUBLE_DOUBLE, ATTR_MATHFN_FPROUNDING)
Index: trunk/gcc/coretypes.h
===================================================================
*** trunk.orig/gcc/coretypes.h	2014-01-07 10:20:00.549453955 +0100
--- trunk/gcc/coretypes.h	2014-02-06 13:10:03.472900950 +0100
*************** enum function_class {
*** 194,200 ****
    function_c94,
    function_c99_misc,
    function_c99_math_complex,
!   function_sincos
  };
  
  /* Memory model types for the __atomic* builtins. 
--- 194,201 ----
    function_c94,
    function_c99_misc,
    function_c99_math_complex,
!   function_sincos,
!   function_c11_misc
  };
  
  /* Memory model types for the __atomic* builtins. 
Index: trunk/gcc/tree-ssa-alias.c
===================================================================
*** trunk.orig/gcc/tree-ssa-alias.c	2014-02-06 12:43:34.450010352 +0100
--- trunk/gcc/tree-ssa-alias.c	2014-02-06 13:14:08.669884068 +0100
*************** ref_maybe_used_by_call_p_1 (gimple call,
*** 1516,1521 ****
--- 1516,1522 ----
  	case BUILT_IN_FREE:
  	case BUILT_IN_MALLOC:
  	case BUILT_IN_POSIX_MEMALIGN:
+ 	case BUILT_IN_ALIGNED_ALLOC:
  	case BUILT_IN_CALLOC:
  	case BUILT_IN_ALLOCA:
  	case BUILT_IN_ALLOCA_WITH_ALIGN:
*************** call_may_clobber_ref_p_1 (gimple call, a
*** 1826,1831 ****
--- 1827,1833 ----
  	/* Allocating memory does not have any side-effects apart from
  	   being the definition point for the pointer.  */
  	case BUILT_IN_MALLOC:
+ 	case BUILT_IN_ALIGNED_ALLOC:
  	case BUILT_IN_CALLOC:
  	case BUILT_IN_STRDUP:
  	case BUILT_IN_STRNDUP:
Index: trunk/gcc/tree-ssa-dce.c
===================================================================
*** trunk.orig/gcc/tree-ssa-dce.c	2014-01-07 10:20:02.520453869 +0100
--- trunk/gcc/tree-ssa-dce.c	2014-02-06 13:16:20.570874987 +0100
*************** mark_stmt_if_obviously_necessary (gimple
*** 231,236 ****
--- 231,237 ----
  	  switch (DECL_FUNCTION_CODE (callee))
  	    {
  	    case BUILT_IN_MALLOC:
+ 	    case BUILT_IN_ALIGNED_ALLOC:
  	    case BUILT_IN_CALLOC:
  	    case BUILT_IN_ALLOCA:
  	    case BUILT_IN_ALLOCA_WITH_ALIGN:
*************** mark_all_reaching_defs_necessary_1 (ao_r
*** 573,578 ****
--- 574,580 ----
  	switch (DECL_FUNCTION_CODE (callee))
  	  {
  	  case BUILT_IN_MALLOC:
+ 	  case BUILT_IN_ALIGNED_ALLOC:
  	  case BUILT_IN_CALLOC:
  	  case BUILT_IN_ALLOCA:
  	  case BUILT_IN_ALLOCA_WITH_ALIGN:
*************** propagate_necessity (bool aggressive)
*** 776,782 ****
  		  && is_gimple_call (def_stmt = SSA_NAME_DEF_STMT (ptr))
  		  && (def_callee = gimple_call_fndecl (def_stmt))
  		  && DECL_BUILT_IN_CLASS (def_callee) == BUILT_IN_NORMAL
! 		  && (DECL_FUNCTION_CODE (def_callee) == BUILT_IN_MALLOC
  		      || DECL_FUNCTION_CODE (def_callee) == BUILT_IN_CALLOC))
  		continue;
  	    }
--- 778,785 ----
  		  && is_gimple_call (def_stmt = SSA_NAME_DEF_STMT (ptr))
  		  && (def_callee = gimple_call_fndecl (def_stmt))
  		  && DECL_BUILT_IN_CLASS (def_callee) == BUILT_IN_NORMAL
! 		  && (DECL_FUNCTION_CODE (def_callee) == BUILT_IN_ALIGNED_ALLOC
! 		      || DECL_FUNCTION_CODE (def_callee) == BUILT_IN_MALLOC
  		      || DECL_FUNCTION_CODE (def_callee) == BUILT_IN_CALLOC))
  		continue;
  	    }
*************** propagate_necessity (bool aggressive)
*** 822,827 ****
--- 825,831 ----
  		  && (DECL_FUNCTION_CODE (callee) == BUILT_IN_MEMSET
  		      || DECL_FUNCTION_CODE (callee) == BUILT_IN_MEMSET_CHK
  		      || DECL_FUNCTION_CODE (callee) == BUILT_IN_MALLOC
+ 		      || DECL_FUNCTION_CODE (callee) == BUILT_IN_ALIGNED_ALLOC
  		      || DECL_FUNCTION_CODE (callee) == BUILT_IN_CALLOC
  		      || DECL_FUNCTION_CODE (callee) == BUILT_IN_FREE
  		      || DECL_FUNCTION_CODE (callee) == BUILT_IN_VA_END
*************** eliminate_unnecessary_stmts (void)
*** 1229,1235 ****
  		     special logic we apply to malloc/free pair removal.  */
  		  && (!(call = gimple_call_fndecl (stmt))
  		      || DECL_BUILT_IN_CLASS (call) != BUILT_IN_NORMAL
! 		      || (DECL_FUNCTION_CODE (call) != BUILT_IN_MALLOC
  			  && DECL_FUNCTION_CODE (call) != BUILT_IN_CALLOC
  			  && DECL_FUNCTION_CODE (call) != BUILT_IN_ALLOCA
  			  && (DECL_FUNCTION_CODE (call)
--- 1233,1240 ----
  		     special logic we apply to malloc/free pair removal.  */
  		  && (!(call = gimple_call_fndecl (stmt))
  		      || DECL_BUILT_IN_CLASS (call) != BUILT_IN_NORMAL
! 		      || (DECL_FUNCTION_CODE (call) != BUILT_IN_ALIGNED_ALLOC
! 			  && DECL_FUNCTION_CODE (call) != BUILT_IN_MALLOC
  			  && DECL_FUNCTION_CODE (call) != BUILT_IN_CALLOC
  			  && DECL_FUNCTION_CODE (call) != BUILT_IN_ALLOCA
  			  && (DECL_FUNCTION_CODE (call)
Index: trunk/gcc/testsuite/gcc.dg/tree-ssa/alias-32.c
===================================================================
*** /dev/null	1970-01-01 00:00:00.000000000 +0000
--- trunk/gcc/testsuite/gcc.dg/tree-ssa/alias-32.c	2014-02-06 13:32:26.430808489 +0100
***************
*** 0 ****
--- 1,20 ----
+ /* { dg-do compile } */
+ /* { dg-options "-O2 -fdump-tree-cddce1" } */
+ 
+ int bar (short *p)
+ {
+   int res = *p;
+   struct { int *q1; int *q2; } q;
+   q.q1 = __builtin_aligned_alloc (128, 128 * sizeof (int));
+   q.q2 = __builtin_aligned_alloc (128, 128 * sizeof (int));
+   *q.q1 = 1;
+   *q.q2 = 2;
+   return res + *p + *q.q1 + *q.q2;
+ }
+ 
+ /* There should be only one load from *p left.  All stores and all
+    other loads should be removed.  Likewise the calls to aligned_alloc.  */
+ 
+ /* { dg-final { scan-tree-dump-times "\\\*\[^ \]" 1 "cddce1" } } */
+ /* { dg-final { scan-tree-dump-not "aligned_alloc" "cddce1" } } */
+ /* { dg-final { cleanup-tree-dump "cddce1" } } */
Index: trunk/gcc/testsuite/gcc.dg/vect/pr60092.c
===================================================================
*** /dev/null	1970-01-01 00:00:00.000000000 +0000
--- trunk/gcc/testsuite/gcc.dg/vect/pr60092.c	2014-02-06 14:13:06.902640465 +0100
***************
*** 0 ****
--- 1,18 ----
+ /* { dg-do compile } */
+ /* { dg-require-effective-target vect_int } */
+ 
+ int *foo (int n)
+ {
+   int *p = __builtin_aligned_alloc (256, n * sizeof (int));
+   int *q = __builtin_aligned_alloc (256, n * sizeof (int));
+   bar (q);
+   int i;
+   for (i = 0; i < n; ++i)
+     p[i] = q[i] + q[i];
+   return p;
+ }
+ 
+ /* { dg-final { scan-tree-dump "LOOP VECTORIZED" "vect" } } */
+ /* { dg-final { scan-tree-dump-not "Peeling for alignment will be applied" "vect" } } */
+ /* { dg-final { scan-tree-dump-not "Vectorizing an unaligned access" "vect" } } */
+ /* { dg-final { cleanup-tree-dump "vect" } } */
Index: trunk/gcc/tree-ssa-ccp.c
===================================================================
*** trunk.orig/gcc/tree-ssa-ccp.c	2014-02-06 14:01:08.558689922 +0100
--- trunk/gcc/tree-ssa-ccp.c	2014-02-06 14:01:14.286689528 +0100
*************** evaluate_stmt (gimple stmt)
*** 1711,1716 ****
--- 1711,1735 ----
  	      val = bit_value_assume_aligned (stmt);
  	      break;
  
+ 	    case BUILT_IN_ALIGNED_ALLOC:
+ 	      {
+ 		tree align = get_constant_value (gimple_call_arg (stmt, 0));
+ 		if (align
+ 		    && tree_fits_uhwi_p (align))
+ 		  {
+ 		    unsigned HOST_WIDE_INT aligni = tree_to_uhwi (align);
+ 		    if (aligni > 1
+ 			/* align must be power-of-two */
+ 			&& (aligni & (aligni - 1)) == 0)
+ 		      {
+ 			val.lattice_val = CONSTANT;
+ 			val.value = build_int_cst (ptr_type_node, 0);
+ 			val.mask = double_int::from_shwi (-aligni);
+ 		      }
+ 		  }
+ 		break;
+ 	      }
+ 
  	    default:;
  	    }
  	}
Index: trunk/gcc/ada/gcc-interface/utils.c
===================================================================
*** trunk.orig/gcc/ada/gcc-interface/utils.c	2014-01-28 10:50:00.929016277 +0100
--- trunk/gcc/ada/gcc-interface/utils.c	2014-02-06 14:24:03.248595277 +0100
*************** def_builtin_1 (enum built_in_function fn
*** 6532,6537 ****
--- 6532,6538 ----
  
  static int flag_isoc94 = 0;
  static int flag_isoc99 = 0;
+ static int flag_isoc11 = 0;
  
  /* Install what the common builtins.def offers.  */
  
Index: trunk/gcc/lto/lto-lang.c
===================================================================
*** trunk.orig/gcc/lto/lto-lang.c	2014-02-06 10:41:15.412515636 +0100
--- trunk/gcc/lto/lto-lang.c	2014-02-06 14:25:12.254590526 +0100
*************** static GTY(()) tree signed_size_type_nod
*** 192,197 ****
--- 192,198 ----
  /* Flags needed to process builtins.def.  */
  int flag_isoc94;
  int flag_isoc99;
+ int flag_isoc11;
  
  /* Attribute handlers.  */
  

^ permalink raw reply	[flat|nested] 3+ messages in thread

* Re: [PATCH] PR60092, add C11 aligned_alloc handling
  2014-02-06 13:27 [PATCH] PR60092, add C11 aligned_alloc handling Richard Biener
@ 2014-04-28 12:02 ` Richard Biener
  2014-04-28 12:16   ` Jakub Jelinek
  0 siblings, 1 reply; 3+ messages in thread
From: Richard Biener @ 2014-04-28 12:02 UTC (permalink / raw)
  To: Richard Biener; +Cc: GCC Patches, Jakub Jelinek, Joseph S. Myers

On Thu, Feb 6, 2014 at 2:26 PM, Richard Biener <rguenther@suse.de> wrote:
>
> This adds a builtin for C11 aligned_alloc and support for it
> in the alias and alignment tracking machinery.
>
> Bootstrap and regtest in progress on x86_64-unknown-linux-gnu.
>
> Ok for trunk?

Ping.

> Thanks,
> Richard.
>
> 2014-02-06  Richard Biener  <rguenther@suse.de>
>
>         PR middle-end/60092
>         * builtins.def (DEF_C11_BUILTIN): Add.
>         (BUILT_IN_ALIGNED_ALLOC): Likewise.
>         * coretypes.h (enum function_class): Add function_c11_misc.
>         * tree-ssa-alias.c (ref_maybe_used_by_call_p_1): Handle
>         BUILT_IN_ALIGNED_ALLOC like BUILT_IN_MALLOC.
>         (call_may_clobber_ref_p_1): Likewise.
>         * tree-ssa-dce.c (mark_stmt_if_obviously_necessary): Likewise.
>         (mark_all_reaching_defs_necessary_1): Likewise.
>         (propagate_necessity): Likewise.
>         (eliminate_unnecessary_stmts): Likewise.
>         * tree-ssa-ccp.c (evaluate_stmt): Handle BUILT_IN_ALIGNED_ALLOC.
>
>         ada/
>         * gcc-interface/utils.c: Define flag_isoc11.
>
>         lto/
>         * lto-lang.c: Define flag_isoc11.
>
>         * gcc.dg/tree-ssa/alias-32.c: New testcase.
>         * gcc.dg/vect/pr60092.c: Likewise.
>
> Index: trunk/gcc/builtins.def
> ===================================================================
> *** trunk.orig/gcc/builtins.def 2014-02-06 12:46:01.085000256 +0100
> --- trunk/gcc/builtins.def      2014-02-06 13:13:06.499888349 +0100
> *************** along with GCC; see the file COPYING3.
> *** 111,116 ****
> --- 111,123 ----
>     DEF_BUILTIN (ENUM, "__builtin_" NAME, BUILT_IN_NORMAL, TYPE, TYPE,  \
>                true, true, !flag_isoc99, ATTRS, targetm.libc_has_function (function_c99_misc), true)
>
> + /* Like DEF_LIB_BUILTIN, except that the function is only a part of
> +    the standard in C11 or above.  */
> + #undef DEF_C11_BUILTIN
> + #define DEF_C11_BUILTIN(ENUM, NAME, TYPE, ATTRS)      \
> +   DEF_BUILTIN (ENUM, "__builtin_" NAME, BUILT_IN_NORMAL, TYPE, TYPE,  \
> +              true, true, !flag_isoc11, ATTRS, targetm.libc_has_function (function_c11_misc), true)
> +
>   /* Like DEF_C99_BUILTIN, but for complex math functions.  */
>   #undef DEF_C99_COMPL_BUILTIN
>   #define DEF_C99_COMPL_BUILTIN(ENUM, NAME, TYPE, ATTRS)        \
> *************** DEF_C99_BUILTIN        (BUILT_IN_ACOSH,
> *** 223,228 ****
> --- 230,236 ----
>   DEF_C99_BUILTIN        (BUILT_IN_ACOSHF, "acoshf", BT_FN_FLOAT_FLOAT, ATTR_MATHFN_FPROUNDING_ERRNO)
>   DEF_C99_BUILTIN        (BUILT_IN_ACOSHL, "acoshl", BT_FN_LONGDOUBLE_LONGDOUBLE, ATTR_MATHFN_FPROUNDING_ERRNO)
>   DEF_C99_C90RES_BUILTIN (BUILT_IN_ACOSL, "acosl", BT_FN_LONGDOUBLE_LONGDOUBLE, ATTR_MATHFN_FPROUNDING_ERRNO)
> + DEF_C11_BUILTIN        (BUILT_IN_ALIGNED_ALLOC, "aligned_alloc", BT_FN_PTR_SIZE_SIZE, ATTR_MALLOC_NOTHROW_LIST)
>   DEF_LIB_BUILTIN        (BUILT_IN_ASIN, "asin", BT_FN_DOUBLE_DOUBLE, ATTR_MATHFN_FPROUNDING_ERRNO)
>   DEF_C99_C90RES_BUILTIN (BUILT_IN_ASINF, "asinf", BT_FN_FLOAT_FLOAT, ATTR_MATHFN_FPROUNDING_ERRNO)
>   DEF_C99_BUILTIN        (BUILT_IN_ASINH, "asinh", BT_FN_DOUBLE_DOUBLE, ATTR_MATHFN_FPROUNDING)
> Index: trunk/gcc/coretypes.h
> ===================================================================
> *** trunk.orig/gcc/coretypes.h  2014-01-07 10:20:00.549453955 +0100
> --- trunk/gcc/coretypes.h       2014-02-06 13:10:03.472900950 +0100
> *************** enum function_class {
> *** 194,200 ****
>     function_c94,
>     function_c99_misc,
>     function_c99_math_complex,
> !   function_sincos
>   };
>
>   /* Memory model types for the __atomic* builtins.
> --- 194,201 ----
>     function_c94,
>     function_c99_misc,
>     function_c99_math_complex,
> !   function_sincos,
> !   function_c11_misc
>   };
>
>   /* Memory model types for the __atomic* builtins.
> Index: trunk/gcc/tree-ssa-alias.c
> ===================================================================
> *** trunk.orig/gcc/tree-ssa-alias.c     2014-02-06 12:43:34.450010352 +0100
> --- trunk/gcc/tree-ssa-alias.c  2014-02-06 13:14:08.669884068 +0100
> *************** ref_maybe_used_by_call_p_1 (gimple call,
> *** 1516,1521 ****
> --- 1516,1522 ----
>         case BUILT_IN_FREE:
>         case BUILT_IN_MALLOC:
>         case BUILT_IN_POSIX_MEMALIGN:
> +       case BUILT_IN_ALIGNED_ALLOC:
>         case BUILT_IN_CALLOC:
>         case BUILT_IN_ALLOCA:
>         case BUILT_IN_ALLOCA_WITH_ALIGN:
> *************** call_may_clobber_ref_p_1 (gimple call, a
> *** 1826,1831 ****
> --- 1827,1833 ----
>         /* Allocating memory does not have any side-effects apart from
>            being the definition point for the pointer.  */
>         case BUILT_IN_MALLOC:
> +       case BUILT_IN_ALIGNED_ALLOC:
>         case BUILT_IN_CALLOC:
>         case BUILT_IN_STRDUP:
>         case BUILT_IN_STRNDUP:
> Index: trunk/gcc/tree-ssa-dce.c
> ===================================================================
> *** trunk.orig/gcc/tree-ssa-dce.c       2014-01-07 10:20:02.520453869 +0100
> --- trunk/gcc/tree-ssa-dce.c    2014-02-06 13:16:20.570874987 +0100
> *************** mark_stmt_if_obviously_necessary (gimple
> *** 231,236 ****
> --- 231,237 ----
>           switch (DECL_FUNCTION_CODE (callee))
>             {
>             case BUILT_IN_MALLOC:
> +           case BUILT_IN_ALIGNED_ALLOC:
>             case BUILT_IN_CALLOC:
>             case BUILT_IN_ALLOCA:
>             case BUILT_IN_ALLOCA_WITH_ALIGN:
> *************** mark_all_reaching_defs_necessary_1 (ao_r
> *** 573,578 ****
> --- 574,580 ----
>         switch (DECL_FUNCTION_CODE (callee))
>           {
>           case BUILT_IN_MALLOC:
> +         case BUILT_IN_ALIGNED_ALLOC:
>           case BUILT_IN_CALLOC:
>           case BUILT_IN_ALLOCA:
>           case BUILT_IN_ALLOCA_WITH_ALIGN:
> *************** propagate_necessity (bool aggressive)
> *** 776,782 ****
>                   && is_gimple_call (def_stmt = SSA_NAME_DEF_STMT (ptr))
>                   && (def_callee = gimple_call_fndecl (def_stmt))
>                   && DECL_BUILT_IN_CLASS (def_callee) == BUILT_IN_NORMAL
> !                 && (DECL_FUNCTION_CODE (def_callee) == BUILT_IN_MALLOC
>                       || DECL_FUNCTION_CODE (def_callee) == BUILT_IN_CALLOC))
>                 continue;
>             }
> --- 778,785 ----
>                   && is_gimple_call (def_stmt = SSA_NAME_DEF_STMT (ptr))
>                   && (def_callee = gimple_call_fndecl (def_stmt))
>                   && DECL_BUILT_IN_CLASS (def_callee) == BUILT_IN_NORMAL
> !                 && (DECL_FUNCTION_CODE (def_callee) == BUILT_IN_ALIGNED_ALLOC
> !                     || DECL_FUNCTION_CODE (def_callee) == BUILT_IN_MALLOC
>                       || DECL_FUNCTION_CODE (def_callee) == BUILT_IN_CALLOC))
>                 continue;
>             }
> *************** propagate_necessity (bool aggressive)
> *** 822,827 ****
> --- 825,831 ----
>                   && (DECL_FUNCTION_CODE (callee) == BUILT_IN_MEMSET
>                       || DECL_FUNCTION_CODE (callee) == BUILT_IN_MEMSET_CHK
>                       || DECL_FUNCTION_CODE (callee) == BUILT_IN_MALLOC
> +                     || DECL_FUNCTION_CODE (callee) == BUILT_IN_ALIGNED_ALLOC
>                       || DECL_FUNCTION_CODE (callee) == BUILT_IN_CALLOC
>                       || DECL_FUNCTION_CODE (callee) == BUILT_IN_FREE
>                       || DECL_FUNCTION_CODE (callee) == BUILT_IN_VA_END
> *************** eliminate_unnecessary_stmts (void)
> *** 1229,1235 ****
>                      special logic we apply to malloc/free pair removal.  */
>                   && (!(call = gimple_call_fndecl (stmt))
>                       || DECL_BUILT_IN_CLASS (call) != BUILT_IN_NORMAL
> !                     || (DECL_FUNCTION_CODE (call) != BUILT_IN_MALLOC
>                           && DECL_FUNCTION_CODE (call) != BUILT_IN_CALLOC
>                           && DECL_FUNCTION_CODE (call) != BUILT_IN_ALLOCA
>                           && (DECL_FUNCTION_CODE (call)
> --- 1233,1240 ----
>                      special logic we apply to malloc/free pair removal.  */
>                   && (!(call = gimple_call_fndecl (stmt))
>                       || DECL_BUILT_IN_CLASS (call) != BUILT_IN_NORMAL
> !                     || (DECL_FUNCTION_CODE (call) != BUILT_IN_ALIGNED_ALLOC
> !                         && DECL_FUNCTION_CODE (call) != BUILT_IN_MALLOC
>                           && DECL_FUNCTION_CODE (call) != BUILT_IN_CALLOC
>                           && DECL_FUNCTION_CODE (call) != BUILT_IN_ALLOCA
>                           && (DECL_FUNCTION_CODE (call)
> Index: trunk/gcc/testsuite/gcc.dg/tree-ssa/alias-32.c
> ===================================================================
> *** /dev/null   1970-01-01 00:00:00.000000000 +0000
> --- trunk/gcc/testsuite/gcc.dg/tree-ssa/alias-32.c      2014-02-06 13:32:26.430808489 +0100
> ***************
> *** 0 ****
> --- 1,20 ----
> + /* { dg-do compile } */
> + /* { dg-options "-O2 -fdump-tree-cddce1" } */
> +
> + int bar (short *p)
> + {
> +   int res = *p;
> +   struct { int *q1; int *q2; } q;
> +   q.q1 = __builtin_aligned_alloc (128, 128 * sizeof (int));
> +   q.q2 = __builtin_aligned_alloc (128, 128 * sizeof (int));
> +   *q.q1 = 1;
> +   *q.q2 = 2;
> +   return res + *p + *q.q1 + *q.q2;
> + }
> +
> + /* There should be only one load from *p left.  All stores and all
> +    other loads should be removed.  Likewise the calls to aligned_alloc.  */
> +
> + /* { dg-final { scan-tree-dump-times "\\\*\[^ \]" 1 "cddce1" } } */
> + /* { dg-final { scan-tree-dump-not "aligned_alloc" "cddce1" } } */
> + /* { dg-final { cleanup-tree-dump "cddce1" } } */
> Index: trunk/gcc/testsuite/gcc.dg/vect/pr60092.c
> ===================================================================
> *** /dev/null   1970-01-01 00:00:00.000000000 +0000
> --- trunk/gcc/testsuite/gcc.dg/vect/pr60092.c   2014-02-06 14:13:06.902640465 +0100
> ***************
> *** 0 ****
> --- 1,18 ----
> + /* { dg-do compile } */
> + /* { dg-require-effective-target vect_int } */
> +
> + int *foo (int n)
> + {
> +   int *p = __builtin_aligned_alloc (256, n * sizeof (int));
> +   int *q = __builtin_aligned_alloc (256, n * sizeof (int));
> +   bar (q);
> +   int i;
> +   for (i = 0; i < n; ++i)
> +     p[i] = q[i] + q[i];
> +   return p;
> + }
> +
> + /* { dg-final { scan-tree-dump "LOOP VECTORIZED" "vect" } } */
> + /* { dg-final { scan-tree-dump-not "Peeling for alignment will be applied" "vect" } } */
> + /* { dg-final { scan-tree-dump-not "Vectorizing an unaligned access" "vect" } } */
> + /* { dg-final { cleanup-tree-dump "vect" } } */
> Index: trunk/gcc/tree-ssa-ccp.c
> ===================================================================
> *** trunk.orig/gcc/tree-ssa-ccp.c       2014-02-06 14:01:08.558689922 +0100
> --- trunk/gcc/tree-ssa-ccp.c    2014-02-06 14:01:14.286689528 +0100
> *************** evaluate_stmt (gimple stmt)
> *** 1711,1716 ****
> --- 1711,1735 ----
>               val = bit_value_assume_aligned (stmt);
>               break;
>
> +           case BUILT_IN_ALIGNED_ALLOC:
> +             {
> +               tree align = get_constant_value (gimple_call_arg (stmt, 0));
> +               if (align
> +                   && tree_fits_uhwi_p (align))
> +                 {
> +                   unsigned HOST_WIDE_INT aligni = tree_to_uhwi (align);
> +                   if (aligni > 1
> +                       /* align must be power-of-two */
> +                       && (aligni & (aligni - 1)) == 0)
> +                     {
> +                       val.lattice_val = CONSTANT;
> +                       val.value = build_int_cst (ptr_type_node, 0);
> +                       val.mask = double_int::from_shwi (-aligni);
> +                     }
> +                 }
> +               break;
> +             }
> +
>             default:;
>             }
>         }
> Index: trunk/gcc/ada/gcc-interface/utils.c
> ===================================================================
> *** trunk.orig/gcc/ada/gcc-interface/utils.c    2014-01-28 10:50:00.929016277 +0100
> --- trunk/gcc/ada/gcc-interface/utils.c 2014-02-06 14:24:03.248595277 +0100
> *************** def_builtin_1 (enum built_in_function fn
> *** 6532,6537 ****
> --- 6532,6538 ----
>
>   static int flag_isoc94 = 0;
>   static int flag_isoc99 = 0;
> + static int flag_isoc11 = 0;
>
>   /* Install what the common builtins.def offers.  */
>
> Index: trunk/gcc/lto/lto-lang.c
> ===================================================================
> *** trunk.orig/gcc/lto/lto-lang.c       2014-02-06 10:41:15.412515636 +0100
> --- trunk/gcc/lto/lto-lang.c    2014-02-06 14:25:12.254590526 +0100
> *************** static GTY(()) tree signed_size_type_nod
> *** 192,197 ****
> --- 192,198 ----
>   /* Flags needed to process builtins.def.  */
>   int flag_isoc94;
>   int flag_isoc99;
> + int flag_isoc11;
>
>   /* Attribute handlers.  */
>

^ permalink raw reply	[flat|nested] 3+ messages in thread

* Re: [PATCH] PR60092, add C11 aligned_alloc handling
  2014-04-28 12:02 ` Richard Biener
@ 2014-04-28 12:16   ` Jakub Jelinek
  0 siblings, 0 replies; 3+ messages in thread
From: Jakub Jelinek @ 2014-04-28 12:16 UTC (permalink / raw)
  To: Richard Biener; +Cc: Richard Biener, GCC Patches, Joseph S. Myers

On Mon, Apr 28, 2014 at 01:52:08PM +0200, Richard Biener wrote:
> On Thu, Feb 6, 2014 at 2:26 PM, Richard Biener <rguenther@suse.de> wrote:
> >
> > This adds a builtin for C11 aligned_alloc and support for it
> > in the alias and alignment tracking machinery.
> >
> > Bootstrap and regtest in progress on x86_64-unknown-linux-gnu.
> >
> > Ok for trunk?
> 
> Ping.

Ok, thanks.

> > 2014-02-06  Richard Biener  <rguenther@suse.de>
> >
> >         PR middle-end/60092
> >         * builtins.def (DEF_C11_BUILTIN): Add.
> >         (BUILT_IN_ALIGNED_ALLOC): Likewise.
> >         * coretypes.h (enum function_class): Add function_c11_misc.
> >         * tree-ssa-alias.c (ref_maybe_used_by_call_p_1): Handle
> >         BUILT_IN_ALIGNED_ALLOC like BUILT_IN_MALLOC.
> >         (call_may_clobber_ref_p_1): Likewise.
> >         * tree-ssa-dce.c (mark_stmt_if_obviously_necessary): Likewise.
> >         (mark_all_reaching_defs_necessary_1): Likewise.
> >         (propagate_necessity): Likewise.
> >         (eliminate_unnecessary_stmts): Likewise.
> >         * tree-ssa-ccp.c (evaluate_stmt): Handle BUILT_IN_ALIGNED_ALLOC.
> >
> >         ada/
> >         * gcc-interface/utils.c: Define flag_isoc11.
> >
> >         lto/
> >         * lto-lang.c: Define flag_isoc11.
> >
> >         * gcc.dg/tree-ssa/alias-32.c: New testcase.
> >         * gcc.dg/vect/pr60092.c: Likewise.

	Jakub

^ permalink raw reply	[flat|nested] 3+ messages in thread

end of thread, other threads:[~2014-04-28 12:14 UTC | newest]

Thread overview: 3+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2014-02-06 13:27 [PATCH] PR60092, add C11 aligned_alloc handling Richard Biener
2014-04-28 12:02 ` Richard Biener
2014-04-28 12:16   ` Jakub Jelinek

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).