diff options
Diffstat (limited to 'gcc/tree-ssa-strlen.cc')
-rw-r--r-- | gcc/tree-ssa-strlen.cc | 12 |
1 files changed, 10 insertions, 2 deletions
diff --git a/gcc/tree-ssa-strlen.cc b/gcc/tree-ssa-strlen.cc index c4d6413..3cef33b 100644 --- a/gcc/tree-ssa-strlen.cc +++ b/gcc/tree-ssa-strlen.cc @@ -4009,8 +4009,16 @@ strlen_pass::handle_builtin_memcmp () tree ptrtype = build_pointer_type_for_mode (char_type_node, ptr_mode, true); off = build_int_cst (ptrtype, 0); - arg1 = build2_loc (loc, MEM_REF, type, arg1, off); - arg2 = build2_loc (loc, MEM_REF, type, arg2, off); + + /* Create unaligned types if needed. */ + tree type1 = type, type2 = type; + if (TYPE_ALIGN (type1) > align1) + type1 = build_aligned_type (type1, align1); + if (TYPE_ALIGN (type2) > align2) + type2 = build_aligned_type (type2, align2); + + arg1 = build2_loc (loc, MEM_REF, type1, arg1, off); + arg2 = build2_loc (loc, MEM_REF, type2, arg2, off); tree tem1 = fold_const_aggregate_ref (arg1); if (tem1) arg1 = tem1; |