diff options
author | Richard Biener <rguenther@suse.de> | 2018-03-05 15:00:48 +0000 |
---|---|---|
committer | Richard Biener <rguenth@gcc.gnu.org> | 2018-03-05 15:00:48 +0000 |
commit | 800916ab502edfefa9efb455c0a9e6455dbdccf5 (patch) | |
tree | 8e65bf3c25ae3d4b63a26fb9d3a65ab06890e3d2 /gcc/tree-ssa-pre.c | |
parent | b5b33e113434be909e8a6d7b93824196fb6925c0 (diff) | |
download | gcc-800916ab502edfefa9efb455c0a9e6455dbdccf5.zip gcc-800916ab502edfefa9efb455c0a9e6455dbdccf5.tar.gz gcc-800916ab502edfefa9efb455c0a9e6455dbdccf5.tar.bz2 |
re PR tree-optimization/84486 (code hoisting removes alignment assumption)
2018-03-05 Richard Biener <rguenther@suse.de>
PR tree-optimization/84486
* tree-ssa-pre.c (create_expression_by_pieces): Remove dead code.
When inserting a __builtin_assume_aligned call set the LHS
SSA name alignment info accordingly.
From-SVN: r258249
Diffstat (limited to 'gcc/tree-ssa-pre.c')
-rw-r--r-- | gcc/tree-ssa-pre.c | 25 |
1 files changed, 17 insertions, 8 deletions
diff --git a/gcc/tree-ssa-pre.c b/gcc/tree-ssa-pre.c index fa3daf4..8df15bf 100644 --- a/gcc/tree-ssa-pre.c +++ b/gcc/tree-ssa-pre.c @@ -2749,11 +2749,7 @@ create_expression_by_pieces (basic_block block, pre_expr expr, unsigned int operand = 1; vn_reference_op_t currop = &ref->operands[0]; tree sc = NULL_TREE; - tree fn; - if (TREE_CODE (currop->op0) == FUNCTION_DECL) - fn = currop->op0; - else - fn = find_or_generate_expression (block, currop->op0, stmts); + tree fn = find_or_generate_expression (block, currop->op0, stmts); if (!fn) return NULL_TREE; if (currop->op1) @@ -2771,14 +2767,27 @@ create_expression_by_pieces (basic_block block, pre_expr expr, return NULL_TREE; args.quick_push (arg); } - gcall *call - = gimple_build_call_vec ((TREE_CODE (fn) == FUNCTION_DECL - ? build_fold_addr_expr (fn) : fn), args); + gcall *call = gimple_build_call_vec (fn, args); gimple_call_set_with_bounds (call, currop->with_bounds); if (sc) gimple_call_set_chain (call, sc); tree forcedname = make_ssa_name (currop->type); gimple_call_set_lhs (call, forcedname); + /* There's no CCP pass after PRE which would re-compute alignment + information so make sure we re-materialize this here. */ + if (gimple_call_builtin_p (call, BUILT_IN_ASSUME_ALIGNED) + && args.length () - 2 <= 1 + && tree_fits_uhwi_p (args[1]) + && (args.length () != 3 || tree_fits_uhwi_p (args[2]))) + { + unsigned HOST_WIDE_INT halign = tree_to_uhwi (args[1]); + unsigned HOST_WIDE_INT hmisalign + = args.length () == 3 ? tree_to_uhwi (args[2]) : 0; + if ((halign & (halign - 1)) == 0 + && (hmisalign & ~(halign - 1)) == 0) + set_ptr_info_alignment (get_ptr_info (forcedname), + halign, hmisalign); + } gimple_set_vuse (call, BB_LIVE_VOP_ON_EXIT (block)); gimple_seq_add_stmt_without_update (&forced_stmts, call); folded = forcedname; |