------- Additional Comments From steven at gcc dot gnu dot org  2004-12-24 
12:52 -------
Silly bugzilla...  Sorry about that.

A piece of unidiff, then.  (-) is the smaller test that works, (+) is the
test where we get the extra copy.  What I wanted to show is that only the
root variable is different in the PHI argument:

@@ -28,10 +29,10 @@
  
   # BLOCK 1
   # PRED: 0 [100.0%]  (fallthru,exec) 1 [89.0%]  (dfs_back,false,exec)
-  # temp2D.1464_1 = PHI <temp2D.1464_2(0), temp2D.1464_4(1)>;
+  # temp2D.1464_1 = PHI <temp2D.1464_2(0), temp1D.1468_4(1)>;
 <L0>:;
-  temp2D.1464_4 = temp2D.1464_1 * xlvj_D.1465_3;
-  if (temp2D.1464_4 != 0) goto <L2>; else goto <L0>;
+  temp1D.1468_4 = temp2D.1464_1 * xlvj_D.1465_3;
+  if (temp1D.1468_4 != 0) goto <L2>; else goto <L0>;
   # SUCC: 2 [11.0%]  (loop_exit,true,exec) 1 [89.0%]  (dfs_back,false,exec)
  
   # BLOCK 2
@@ -48,45 +49,45 @@


This comes from DOM copy-proping around the loop.  Before DOM1 we have
a function that looks like this (.dce1):
;; Function f (f)
                                                                               
                                                             
f (temp2, xlvj_)
{
  int temp1;
  int D.1471;
                                                                               
                                                             
  # temp2_1 = PHI <temp2_2(-1), temp2_5(0)>;
<L0>:;
  temp1_4 = temp2_1 * xlvj__3;
  temp2_5 = temp1_4;
  if (temp1_4 != 0) goto <L2>; else goto <L0>;
                                                                               
                                                             
<L2>:;
  xlvj__6 = xlvj__3;
  return xlvj__6;
                                                                               
                                                             
}
                                                                               
                                                             

After DOM1 (the .dom1 dump) we have this:
;; Function f (f)
                                                                               
                                                             
f (temp2, xlvj_)
{
  int temp1;
  int D.1471;
                                                                               
                                                             
  # temp2_1 = PHI <temp2_2(-1), temp1_4(0)>;
<L0>:;
  temp1_4 = temp2_1 * xlvj__3;
  temp2_5 = temp1_4;
  if (temp1_4 != 0) goto <L2>; else goto <L0>;
                                                                               
                                                             
<L2>:;
  xlvj__6 = xlvj__3;
  return xlvj__3;
                                                                               
                                                             
}
                                                                               
                                                             
We never recover from this, we don't coalesce, and there's your copy.




-- 


http://gcc.gnu.org/bugzilla/show_bug.cgi?id=19038

Reply via email to