* doc/contrib.texi (Contributors): Add Maxim Kuvyrkov.
-2015-04-11 Jan Hubicka <hubicka@ucw.cz>
+2015-04-11 Jan Hubicka <hubicka@ucw.cz>
PR ipa/65743
* ipa-inline-transform.c (speculation_removed): Remove static var.
* ipa-prop.c (ipa_make_edge_direct_to_target): Do not
consider non-invariants.
-2015-04-11 Jan Hubicka <hubicka@ucw.cz>
- Martin Liska <mliska@suse.cz>
+2015-04-11 Jan Hubicka <hubicka@ucw.cz>
+ Martin Liska <mliska@suse.cz>
PR ipa/65722
* ipa-icf.c (sem_item::compare_cgraph_references): function and
bool lval, bool *non_constant_p,
bool *overflow_p)
{
+ tree orig_type = TREE_TYPE (t);
tree op00 = TREE_OPERAND (t, 0);
tree op01 = TREE_OPERAND (t, 1);
location_t loc = EXPR_LOCATION (t);
/* &A[i] p+ j => &A[i + j] */
if (TREE_CODE (op00) == ARRAY_REF
&& TREE_CODE (TREE_OPERAND (op00, 1)) == INTEGER_CST
- && TREE_CODE (op01) == INTEGER_CST)
+ && TREE_CODE (op01) == INTEGER_CST
+ && TYPE_SIZE_UNIT (TREE_TYPE (op00))
+ && TREE_CODE (TYPE_SIZE_UNIT (TREE_TYPE (op00))) == INTEGER_CST)
{
tree type = TREE_TYPE (op00);
t = fold_convert_loc (loc, ssizetype, TREE_OPERAND (op00, 1));
/* Don't fold an out-of-bound access. */
if (!tree_int_cst_le (t, nelts))
return NULL_TREE;
+ op01 = cp_fold_convert (ssizetype, op01);
+ /* Don't fold if op01 can't be divided exactly by TYPE_SIZE_UNIT.
+ constexpr int A[1]; ... (char *)&A[0] + 1 */
+ if (!integer_zerop (fold_build2_loc (loc, TRUNC_MOD_EXPR, sizetype,
+ op01, TYPE_SIZE_UNIT (type))))
+ return NULL_TREE;
/* Make sure to treat the second operand of POINTER_PLUS_EXPR
as signed. */
- op01 = fold_build2_loc (loc, EXACT_DIV_EXPR, ssizetype,
- cp_fold_convert (ssizetype, op01),
+ op01 = fold_build2_loc (loc, EXACT_DIV_EXPR, ssizetype, op01,
TYPE_SIZE_UNIT (type));
t = size_binop_loc (loc, PLUS_EXPR, op01, t);
t = build4_loc (loc, ARRAY_REF, type, TREE_OPERAND (op00, 0),
t, NULL_TREE, NULL_TREE);
t = cp_build_addr_expr (t, tf_warning_or_error);
+ t = cp_fold_convert (orig_type, t);
return cxx_eval_constant_expression (ctx, t, lval, non_constant_p,
overflow_p);
}