[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