This is the next patch in the series of removing fab.
This one is simplier than builtin_constant_p because the only
time we want to simplify this builtin is at the final folding step.
Note align-5.c needs to change slightly as __builtin_assume_aligned
is no longer taken into account for the same reason as why PR 111875
is closed as invalid and why the testcase is failing at -Og
I added a new testcase align-5a.c where the pointer is explictly aligned
so that the check is gone there.
Note __builtin_assume_aligned should really be instrumented for UBSAN,
I filed PR 122038 for that.
Bootstrapped and tested on x86_64-linux-gnu.
PR tree-optimization/121762
gcc/ChangeLog:
* gimple-fold.cc (gimple_fold_builtin_assume_aligned): New function.
(gimple_fold_builtin): Call gimple_fold_builtin_assume_aligned
for BUILT_IN_ASSUME_ALIGNED.
* tree-ssa-ccp.cc (pass_fold_builtins::execute): Remove handling
of BUILT_IN_ASSUME_ALIGNED.
gcc/testsuite/ChangeLog:
* c-c++-common/ubsan/align-5.c: Update as __builtin_assume_aligned
is no longer taked into account.
* c-c++-common/ubsan/align-5a.c: New test.
Signed-off-by: Andrew Pinski <andrew.pinski@oss.qualcomm.com>
return true;
}
+/* Fold __builtin_assume_aligned builtin. */
+
+static bool
+gimple_fold_builtin_assume_aligned (gimple_stmt_iterator *gsi)
+{
+ if (!(cfun->curr_properties & PROP_last_full_fold))
+ return false;
+
+ gcall *call = as_a<gcall*>(gsi_stmt (*gsi));
+
+ if (gimple_call_num_args (call) < 2)
+ return false;
+
+ gimplify_and_update_call_from_tree (gsi, gimple_call_arg (call, 0));
+
+ return true;
+}
+
/* Fold the non-target builtin at *GSI and return whether any simplification
was made. */
case BUILT_IN_CONSTANT_P:
return gimple_fold_builtin_constant_p (gsi);
+ case BUILT_IN_ASSUME_ALIGNED:
+ return gimple_fold_builtin_assume_aligned (gsi);
+
default:;
}
/* { dg-do compile } */
/* { dg-options "-fno-sanitize=null -fsanitize=alignment -O2" } */
-/* Check that when optimizing if we know the alignment is right
- and we are not doing -fsanitize=null instrumentation we don't
- instrument the alignment check. */
+/* __builtin_assume_aligned should be instrumented too. UBSAN alignment
+ should not depend on it. */
__attribute__((noinline, noclone)) int
foo (char *p)
return *q;
}
-/* { dg-final { scan-assembler-not "__ubsan_handle" } } */
+/* { dg-final { scan-assembler "__ubsan_handle" } } */
--- /dev/null
+/* { dg-do compile } */
+/* { dg-options "-fno-sanitize=null -fsanitize=alignment -O2" } */
+/* Check that when optimizing if we know the alignment is right
+ and we are not doing -fsanitize=null instrumentation we don't
+ instrument the alignment check. */
+
+__attribute__((noinline, noclone)) int
+foo (int *p)
+{
+ /* Align the pointer explictly. */
+ __INTPTR_TYPE__ t = (__INTPTR_TYPE__)p;
+ t &= ~0xf;
+ p = (int*)t;
+
+ return *p;
+}
+
+/* { dg-final { scan-assembler-not "__ubsan_handle" } } */
switch (DECL_FUNCTION_CODE (callee))
{
- case BUILT_IN_ASSUME_ALIGNED:
- /* Remove __builtin_assume_aligned. */
- result = gimple_call_arg (stmt, 0);
- break;
-
case BUILT_IN_STACK_RESTORE:
result = optimize_stack_restore (i);
if (result)