re PR rtl-optimization/48757 (internal compiler error: in compensate_edge, at reg...
authorVladimir Makarov <vmakarov@redhat.com>
Wed, 25 May 2011 02:15:58 +0000 (02:15 +0000)
committerVladimir Makarov <vmakarov@gcc.gnu.org>
Wed, 25 May 2011 02:15:58 +0000 (02:15 +0000)
2011-05-24  Vladimir Makarov  <vmakarov@redhat.com>

PR rtl-optimization/48757
* ira-build.c (loop_with_eh_edge_p): Rename to
loop_with_complex_edge_p, check edges on complexity, make function
conditional.
(mark_loops_for_removal): Make call of loop_with_complex_edge_p
conditional.

2011-05-24  Vladimir Makarov  <vmakarov@redhat.com>

PR rtl-optimization/48757
* gfortran.dg/pr48757.f:  New test case.

From-SVN: r174165

gcc/ChangeLog
gcc/ira-build.c
gcc/testsuite/ChangeLog
gcc/testsuite/gfortran.dg/pr48757.f [new file with mode: 0644]

index cf8e4e75752eed7d1d94dbd1ca4a0ef66e7e76e1..9bafa1de3180644fcb96f86ed2992d788eebe1ae 100644 (file)
@@ -1,3 +1,12 @@
+2011-05-24  Vladimir Makarov  <vmakarov@redhat.com>
+
+       PR rtl-optimization/48757
+       * ira-build.c (loop_with_eh_edge_p): Rename to
+       loop_with_complex_edge_p, check edges on complexity, make function
+       conditional.
+       (mark_loops_for_removal): Make call of loop_with_complex_edge_p
+       conditional.
+
 2011-05-24  Eric Botcazou  <ebotcazou@adacore.com>
 
        * config/sparc/sparc.c (sparc_option_override): If not set by the user,
index 31d0199791ae02d212641e2d11ae1eaeb05ac376..95d6c169a27b112e793002a74e83c1977c091bbb 100644 (file)
@@ -1806,9 +1806,12 @@ low_pressure_loop_node_p (ira_loop_tree_node_t node)
   return true;
 }
 
-/* Return TRUE if LOOP has a EH enter or exit edge.  */
+#ifdef STACK_REGS
+/* Return TRUE if LOOP has a complex enter or exit edge.  We don't
+   form a region from such loop if the target use stack register
+   because reg-stack.c can not deal with such edges.  */
 static bool
-loop_with_eh_edge_p (struct loop *loop)
+loop_with_complex_edge_p (struct loop *loop)
 {
   int i;
   edge_iterator ei;
@@ -1820,10 +1823,11 @@ loop_with_eh_edge_p (struct loop *loop)
       return true;
   edges = get_loop_exit_edges (loop);
   FOR_EACH_VEC_ELT (edge, edges, i, e)
-    if (e->flags & EDGE_EH)
+    if (e->flags & EDGE_COMPLEX)
       return true;
   return false;
 }
+#endif
 
 /* Sort loops for marking them for removal.  We put already marked
    loops first, then less frequent loops next, and then outer loops
@@ -1884,7 +1888,10 @@ mark_loops_for_removal (void)
        ira_loop_nodes[i].to_remove_p
          = ((low_pressure_loop_node_p (ira_loop_nodes[i].parent)
              && low_pressure_loop_node_p (&ira_loop_nodes[i]))
-            || loop_with_eh_edge_p (ira_loop_nodes[i].loop));
+#ifdef STACK_REGS
+            || loop_with_complex_edge_p (ira_loop_nodes[i].loop)
+#endif
+            );
       }
   qsort (sorted_loops, n, sizeof (ira_loop_tree_node_t), loop_compare_func);
   for (i = 0; n - i + 1 > IRA_MAX_LOOPS_NUM; i++)
index 14ef5becfa7b85562a4d08c75b43138a28a41084..b39b4c726c62cfb2f8c0e370f9056b4e4a2d93bd 100644 (file)
@@ -1,3 +1,8 @@
+2011-05-24  Vladimir Makarov  <vmakarov@redhat.com>
+
+       PR rtl-optimization/48757
+       * gfortran.dg/pr48757.f:  New test case.
+
 2011-05-24  Jason Merrill  <jason@redhat.com>
 
        * g++.dg/cpp0x/access01.C: New.
diff --git a/gcc/testsuite/gfortran.dg/pr48757.f b/gcc/testsuite/gfortran.dg/pr48757.f
new file mode 100644 (file)
index 0000000..e89a596
--- /dev/null
@@ -0,0 +1,54 @@
+! { dg-do compile { target i?86-*-* x86_64-*-* } }
+! { dg-options "-O2 -w" }
+C fconc64.F, from CERNLIB (simplified)
+
+      FUNCTION DFCONC(X,TAU,M)
+      IMPLICIT DOUBLE PRECISION (A-H,O-Z)
+      COMPLEX*16 WGAMMA,WLOGAM
+      COMPLEX*16 CGM,CLG,CRG,I,A,B,C,TI,R,RR,U(0:3),V(0:3),W(19)
+      LOGICAL LM0,LM1,LTA
+      CHARACTER NAME*(*)
+      CHARACTER*80 ERRTXT
+      PARAMETER (NAME = 'RFCONC/DFCONC')
+      DIMENSION T(7),H(9),S(5),P(11),D(-1:6)
+      PARAMETER (PI  = 3.14159 26535 89793 24D+0)
+      PARAMETER (RPI = 1.77245 38509 05516 03D+0)
+      PARAMETER (I = (0,1))
+      PARAMETER (Z1 = 1, HF = Z1/2, TH = 1+HF, C1 = Z1/10, C2 = Z1/5)
+      PARAMETER (RPH = 2/PI, RPW = 2/RPI, TW = 20, NMAX = 200)
+      DATA EPS /1D-14/
+      ASSIGN 1 TO JP
+      GO TO 20
+    1 ASSIGN 2 TO JP
+      GO TO 20
+    2 IF(LM1) FC=2*FC/SQRT(1-X1)
+      GO TO 99
+   12 ASSIGN 3 TO JP
+      GO TO 20
+    3 IF(LM1) FC=SIGN(HF,1-X)*(TAU**2+HF**2)*SQRT(ABS(X**2-1))*FC
+      GO TO 99
+   13 ASSIGN 4 TO JP
+      GO TO 20
+    4 R1=EXP((TI-HF)*LOG(X+X)+CLG(1+TI)-CLG((TH-FM)+TI))*
+     1        R*((HF-FM)+TI)/TI
+      FC=RPW*R1
+      IF(LM1) FC=FC/SQRT(1-X1)
+      GO TO 99
+   20 IF(LTA) THEN
+       IF(ABS(R-RR) .LT. EPS) GO TO JP, (1,2,3,4)
+      ELSE
+       W(1)=X1*A*B/C
+       R=1+W(1)
+       DO 23 N = 1,NMAX
+       RR=R
+       W(1)=W(1)*X1*(A+FN)*(B+FN)/((C+FN)*(FN+1))
+       IF(ABS(R-RR) .LT. EPS) GO TO JP, (1,2,3,4)
+   23  CONTINUE
+      END IF
+   99 DFCONC=FC
+      RETURN
+  101 FORMAT('ILLEGAL ARGUMENT(S)  X = ',D15.8,' TAU = ',D15.8,
+     1       ' M = ',I3)
+  102 FORMAT('CONVERGENCE PROBLEM FOR HYPERGEOMETRIC FUNCTION, X = ',
+     1        D15.8)
+      END