This is the mail archive of the
gcc-patches@gcc.gnu.org
mailing list for the GCC project.
Re: [PATCH] PR60092, add C11 aligned_alloc handling
- From: Richard Biener <richard dot guenther at gmail dot com>
- To: Richard Biener <rguenther at suse dot de>
- Cc: GCC Patches <gcc-patches at gcc dot gnu dot org>, Jakub Jelinek <jakub at redhat dot com>, "Joseph S. Myers" <joseph at codesourcery dot com>
- Date: Mon, 28 Apr 2014 13:52:08 +0200
- Subject: Re: [PATCH] PR60092, add C11 aligned_alloc handling
- Authentication-results: sourceware.org; auth=none
- References: <alpine dot LSU dot 2 dot 11 dot 1402061421150 dot 29326 at zhemvz dot fhfr dot qr>
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. */
>