tree-ssa-ter.c (is_replaceable_p): Do not TER across location or block changes with...
authorRichard Biener <rguenther@suse.de>
Fri, 8 Mar 2013 08:45:29 +0000 (08:45 +0000)
committerRichard Biener <rguenth@gcc.gnu.org>
Fri, 8 Mar 2013 08:45:29 +0000 (08:45 +0000)
2013-03-08  Richard Biener  <rguenther@suse.de>

* tree-ssa-ter.c (is_replaceable_p): Do not TER across location
or block changes with -Og.  Fix for location / block encoding
changes and PHI arguments with locations.

From-SVN: r196539

gcc/ChangeLog
gcc/tree-ssa-ter.c

index d417f40bde81f9249ee5bd680dcc51c52f248ccc..c44b13bf69c4c52beb21916be47361f2f3c9b838 100644 (file)
@@ -1,3 +1,9 @@
+2013-03-08  Richard Biener  <rguenther@suse.de>
+
+       * tree-ssa-ter.c (is_replaceable_p): Do not TER across location
+       or block changes with -Og.  Fix for location / block encoding
+       changes and PHI arguments with locations.
+
 2013-03-07  Steven Bosscher  <steven@gcc.gnu.org>
 
        * bitmap.c (struct bitmap_descriptor_d): Use unsigned HOST_WIDEST_INT
index b091d78628824d3ac363e0cb6b01e1528ce18371..2a2e143de38d02ae528343b97b8bb9797de9c5f4 100644 (file)
@@ -399,22 +399,22 @@ is_replaceable_p (gimple stmt, bool ter)
     return false;
 
   locus1 = gimple_location (stmt);
-  block1 = gimple_block (stmt);
+  block1 = LOCATION_BLOCK (locus1);
+  locus1 = LOCATION_LOCUS (locus1);
 
   if (gimple_code (use_stmt) == GIMPLE_PHI)
-    {
-      locus2 = 0;
-      block2 = NULL_TREE;
-    }
+    locus2 = gimple_phi_arg_location (use_stmt, PHI_ARG_INDEX_FROM_USE (use_p));
   else
-    {
-      locus2 = gimple_location (use_stmt);
-      block2 = gimple_block (use_stmt);
-    }
+    locus2 = gimple_location (use_stmt);
+  block2 = LOCATION_BLOCK (locus2);
+  locus2 = LOCATION_LOCUS (locus2);
 
-  if (!optimize
+  if ((!optimize || optimize_debug)
       && ter
-      && ((locus1 && locus1 != locus2) || (block1 && block1 != block2)))
+      && ((locus1 != UNKNOWN_LOCATION
+          && locus1 != locus2)
+         || (block1 != NULL_TREE
+             && block1 != block2)))
     return false;
 
   /* Used in this block, but at the TOP of the block, not the end.  */