* [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).