[PATCH] Fix PR84486

Richard Biener rguenther@suse.de
Mon Mar 5 14:59:00 GMT 2018


The following fixes a missed optimization caused by code hoisting.
When PRE inserts expressions somewhere the SSA names created in that
process do not have any associated info like alignment.

Fixed for the very specific case of __builtin_assume_aligned.

Bootstrapped and tested on x86_64-unknown-linux-gnu, desired effect
verified by reporter, applied to trunk.

Richard.

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.

Index: gcc/tree-ssa-pre.c
===================================================================
--- gcc/tree-ssa-pre.c	(revision 258124)
+++ gcc/tree-ssa-pre.c	(working copy)
@@ -2736,11 +2736,7 @@ create_expression_by_pieces (basic_block
 	  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)
@@ -2758,14 +2754,27 @@ create_expression_by_pieces (basic_block
 		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;



More information about the Gcc-patches mailing list