re PR middle-end/60092 (posix_memalign not recognized to derive alias and alignment info)
2014-04-28 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. From-SVN: r209863
This commit is contained in:
parent
771c950116
commit
22869a37b0
|
@ -1,3 +1,18 @@
|
|||
2014-04-28 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.
|
||||
|
||||
2014-04-28 Richard Biener <rguenther@suse.de>
|
||||
|
||||
* tree-vrp.c (vrp_var_may_overflow): Remove.
|
||||
|
|
|
@ -1,3 +1,8 @@
|
|||
2014-04-28 Richard Biener <rguenther@suse.de>
|
||||
|
||||
PR middle-end/60092
|
||||
* gcc-interface/utils.c: Define flag_isoc11.
|
||||
|
||||
2014-04-26 Eric Botcazou <ebotcazou@adacore.com>
|
||||
|
||||
* gnatvsn.ads (Library_Version): Bump to 4.10.
|
||||
|
|
|
@ -6519,6 +6519,7 @@ def_builtin_1 (enum built_in_function fncode,
|
|||
|
||||
static int flag_isoc94 = 0;
|
||||
static int flag_isoc99 = 0;
|
||||
static int flag_isoc11 = 0;
|
||||
|
||||
/* Install what the common builtins.def offers. */
|
||||
|
||||
|
|
|
@ -111,6 +111,13 @@ along with GCC; see the file COPYING3. If not see
|
|||
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) \
|
||||
|
@ -223,6 +230,7 @@ DEF_C99_BUILTIN (BUILT_IN_ACOSH, "acosh", BT_FN_DOUBLE_DOUBLE, ATTR_MATHF
|
|||
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)
|
||||
|
|
|
@ -194,7 +194,8 @@ enum function_class {
|
|||
function_c94,
|
||||
function_c99_misc,
|
||||
function_c99_math_complex,
|
||||
function_sincos
|
||||
function_sincos,
|
||||
function_c11_misc
|
||||
};
|
||||
|
||||
/* Memory model types for the __atomic* builtins.
|
||||
|
|
|
@ -1,3 +1,8 @@
|
|||
2014-04-28 Richard Biener <rguenther@suse.de>
|
||||
|
||||
PR middle-end/60092
|
||||
* lto-lang.c: Define flag_isoc11.
|
||||
|
||||
2014-04-23 David Malcolm <dmalcolm@redhat.com>
|
||||
|
||||
* lto-partition.c (add_references_to_partition): Update for
|
||||
|
|
|
@ -192,6 +192,7 @@ static GTY(()) tree signed_size_type_node;
|
|||
/* Flags needed to process builtins.def. */
|
||||
int flag_isoc94;
|
||||
int flag_isoc99;
|
||||
int flag_isoc11;
|
||||
|
||||
/* Attribute handlers. */
|
||||
|
||||
|
|
|
@ -1,3 +1,9 @@
|
|||
2014-04-28 Richard Biener <rguenther@suse.de>
|
||||
|
||||
PR middle-end/60092
|
||||
* gcc.dg/tree-ssa/alias-32.c: New testcase.
|
||||
* gcc.dg/vect/pr60092.c: Likewise.
|
||||
|
||||
2014-04-28 Richard Biener <rguenther@suse.de>
|
||||
|
||||
* gcc.dg/tree-ssa/vrp91.c: New testcase.
|
||||
|
|
|
@ -0,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" } } */
|
|
@ -0,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" } } */
|
|
@ -1646,6 +1646,7 @@ ref_maybe_used_by_call_p_1 (gimple call, ao_ref *ref)
|
|||
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:
|
||||
|
@ -1956,6 +1957,7 @@ call_may_clobber_ref_p_1 (gimple call, ao_ref *ref)
|
|||
/* 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:
|
||||
|
|
|
@ -1762,6 +1762,25 @@ evaluate_stmt (gimple stmt)
|
|||
val = bit_value_assume_aligned (stmt, NULL_TREE, val, false);
|
||||
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:;
|
||||
}
|
||||
}
|
||||
|
|
|
@ -231,6 +231,7 @@ mark_stmt_if_obviously_necessary (gimple stmt, bool aggressive)
|
|||
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:
|
||||
|
@ -573,6 +574,7 @@ mark_all_reaching_defs_necessary_1 (ao_ref *ref ATTRIBUTE_UNUSED,
|
|||
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:
|
||||
|
@ -776,7 +778,8 @@ propagate_necessity (bool aggressive)
|
|||
&& 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_ALIGNED_ALLOC
|
||||
|| DECL_FUNCTION_CODE (def_callee) == BUILT_IN_MALLOC
|
||||
|| DECL_FUNCTION_CODE (def_callee) == BUILT_IN_CALLOC))
|
||||
continue;
|
||||
}
|
||||
|
@ -822,6 +825,7 @@ propagate_necessity (bool aggressive)
|
|||
&& (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
|
||||
|
@ -1229,7 +1233,8 @@ eliminate_unnecessary_stmts (void)
|
|||
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_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)
|
||||
|
|
Loading…
Reference in New Issue