[PATCH] cse: Remove eh edge when deleting insn with REG_EH_REGION note

Andreas Krebbel Andreas.Krebbel@de.ibm.com
Tue May 13 19:23:00 GMT 2008


Hello,

java bootstrap currently fails on s390 and s390x.

The problem is that cse deletes a compare insn with a REG_EH_REGION
note without deleting the respective eh edge.

The attached patch fixes this.

Bootstrapped and regtested on x86_64, s390 and s390x.

Ok for mainline?

Bye,

-Andreas-


2008-05-13  Andreas Krebbel  <krebbel1@de.ibm.com>

	* cse.c (cse_cc_succs): Invoke delete_insn_and_edges.


2008-05-13  Andreas Krebbel  <krebbel1@de.ibm.com>

	* g++.dg/eh/080513-1.C: New testcase.


Index: gcc/cse.c
===================================================================
*** gcc/cse.c.orig	2008-05-13 17:14:03.000000000 +0200
--- gcc/cse.c	2008-05-13 17:14:36.000000000 +0200
*************** cse_cc_succs (basic_block bb, rtx cc_reg
*** 6861,6867 ****
  				    newreg);
  	}
  
!       delete_insn (insns[i]);
      }
  
    return mode;
--- 6861,6867 ----
  				    newreg);
  	}
  
!       delete_insn_and_edges (insns[i]);
      }
  
    return mode;
Index: gcc/testsuite/g++.dg/eh/080513-1.C
===================================================================
*** /dev/null	1970-01-01 00:00:00.000000000 +0000
--- gcc/testsuite/g++.dg/eh/080513-1.C	2008-05-13 17:22:31.000000000 +0200
***************
*** 0 ****
--- 1,16 ----
+ // This used to fail on s390 due to cse removing an insn with a
+ // REG_EH_REGION without deleting the EH edge.
+ // { dg-do compile }
+ // { dg-options "-O2 -fnon-call-exceptions" }
+ 
+ void
+ run (int m, double d)
+ {
+   int stack[m];
+   int *sp = stack;
+ 
+   if (d == 1.0)
+     *(sp++) = (0);
+   else if (d < 1.0)
+     *(sp++) = (-1);
+ }



More information about the Gcc-patches mailing list