re PR middle-end/39954 (Revision 146817 caused unaligned access in gcc.dg/torture...
authorRichard Guenther <rguenther@suse.de>
Mon, 18 Jan 2010 12:59:50 +0000 (12:59 +0000)
committerRichard Biener <rguenth@gcc.gnu.org>
Mon, 18 Jan 2010 12:59:50 +0000 (12:59 +0000)
2010-01-18  Richard Guenther  <rguenther@suse.de>

PR middle-end/39954
* cfgexpand.c (expand_call_stmt): TER pointer arguments in
builtin calls.

From-SVN: r156008

gcc/ChangeLog
gcc/cfgexpand.c

index 2ad9c06..795b89c 100644 (file)
@@ -1,5 +1,11 @@
 2010-01-18  Richard Guenther  <rguenther@suse.de>
 
+       PR middle-end/39954
+       * cfgexpand.c (expand_call_stmt): TER pointer arguments in
+       builtin calls.
+
+2010-01-18  Richard Guenther  <rguenther@suse.de>
+
        PR tree-optimization/42781
        * tree-ssa-structalias.c (find_what_var_points_to): Skip
        restrict processing only if the original variable was
index 70d2b35..788242c 100644 (file)
@@ -1746,15 +1746,31 @@ expand_call_stmt (gimple stmt)
   tree exp;
   tree lhs = gimple_call_lhs (stmt);
   size_t i;
+  bool builtin_p;
+  tree decl;
 
   exp = build_vl_exp (CALL_EXPR, gimple_call_num_args (stmt) + 3);
 
   CALL_EXPR_FN (exp) = gimple_call_fn (stmt);
+  decl = gimple_call_fndecl (stmt);
+  builtin_p = decl && DECL_BUILT_IN (decl);
+
   TREE_TYPE (exp) = gimple_call_return_type (stmt);
   CALL_EXPR_STATIC_CHAIN (exp) = gimple_call_chain (stmt);
 
   for (i = 0; i < gimple_call_num_args (stmt); i++)
-    CALL_EXPR_ARG (exp, i) = gimple_call_arg (stmt, i);
+    {
+      tree arg = gimple_call_arg (stmt, i);
+      gimple def;
+      /* TER addresses into arguments of builtin functions so we have a
+        chance to infer more correct alignment information.  See PR39954.  */
+      if (builtin_p
+         && TREE_CODE (arg) == SSA_NAME
+         && (def = get_gimple_for_ssa_name (arg))
+         && gimple_assign_rhs_code (def) == ADDR_EXPR)
+       arg = gimple_assign_rhs1 (def);
+      CALL_EXPR_ARG (exp, i) = arg;
+    }
 
   if (gimple_has_side_effects (stmt))
     TREE_SIDE_EFFECTS (exp) = 1;