diff options
Diffstat (limited to 'gcc/fold-const.c')
-rw-r--r-- | gcc/fold-const.c | 14 |
1 files changed, 12 insertions, 2 deletions
diff --git a/gcc/fold-const.c b/gcc/fold-const.c index 3a0f39a..0d7113a 100644 --- a/gcc/fold-const.c +++ b/gcc/fold-const.c @@ -82,6 +82,7 @@ along with GCC; see the file COPYING3. If not see #include "attribs.h" #include "tree-vector-builder.h" #include "vec-perm-indices.h" +#include "asan.h" /* Nonzero if we are folding constants inside an initializer; zero otherwise. */ @@ -9392,8 +9393,17 @@ fold_unary_loc (location_t loc, enum tree_code code, tree type, tree op0) tree arg00 = TREE_OPERAND (arg0, 0); tree arg01 = TREE_OPERAND (arg0, 1); - return fold_build_pointer_plus_loc - (loc, fold_convert_loc (loc, type, arg00), arg01); + /* If -fsanitize=alignment, avoid this optimization in GENERIC + when the pointed type needs higher alignment than + the p+ first operand's pointed type. */ + if (!in_gimple_form + && sanitize_flags_p (SANITIZE_ALIGNMENT) + && (min_align_of_type (TREE_TYPE (type)) + > min_align_of_type (TREE_TYPE (TREE_TYPE (arg00))))) + return NULL_TREE; + + arg00 = fold_convert_loc (loc, type, arg00); + return fold_build_pointer_plus_loc (loc, arg00, arg01); } /* Convert (T1)(~(T2)X) into ~(T1)X if T1 and T2 are integral types |