aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorMichael Matz <matz@suse.de>2007-10-22 15:29:17 +0000
committerMichael Matz <matz@gcc.gnu.org>2007-10-22 15:29:17 +0000
commit22a5d0133dae10ca048e822f180e40cf9400a253 (patch)
tree8102e28c36b811c04b10a0ba979e8d44c5bcbf86 /gcc
parent174f8765a8a7198d4d3b05b476ed9ffa40c86cda (diff)
downloadgcc-22a5d0133dae10ca048e822f180e40cf9400a253.zip
gcc-22a5d0133dae10ca048e822f180e40cf9400a253.tar.gz
gcc-22a5d0133dae10ca048e822f180e40cf9400a253.tar.bz2
re PR tree-optimization/33855 (Segfault in verify_ssa/execute_function_todo with -O)
PR tree-optimization/33855 * tree-ssa-phiopt.c (cond_store_replacement): Handle * COMPLEX_TYPE and VECTOR_TYPE. * gcc.c-torture/compile/pr33855.c: New testcase. From-SVN: r129551
Diffstat (limited to 'gcc')
-rw-r--r--gcc/ChangeLog6
-rw-r--r--gcc/testsuite/ChangeLog5
-rw-r--r--gcc/testsuite/gcc.c-torture/compile/pr33855.c27
-rw-r--r--gcc/tree-ssa-phiopt.c3
4 files changed, 41 insertions, 0 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index caf5cfd..35ca169 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,3 +1,9 @@
+2007-10-22 Michael Matz <matz@suse.de>
+
+ PR tree-optimization/33855
+ * tree-ssa-phiopt.c (cond_store_replacement): Handle COMPLEX_TYPE
+ and VECTOR_TYPE.
+
2007-10-22 Ira Rosen <irar@il.ibm.com>
PR tree-optimization/33854
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index 7374719..c49cd31 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -1,3 +1,8 @@
+2007-10-22 Michael Matz <matz@suse.de>
+
+ PR tree-optimization/33855
+ * gcc.c-torture/compile/pr33855.c: New testcase.
+
2007-10-22 Ira Rosen <irar@il.ibm.com>
PR tree-optimization/33854
diff --git a/gcc/testsuite/gcc.c-torture/compile/pr33855.c b/gcc/testsuite/gcc.c-torture/compile/pr33855.c
new file mode 100644
index 0000000..e678cb3
--- /dev/null
+++ b/gcc/testsuite/gcc.c-torture/compile/pr33855.c
@@ -0,0 +1,27 @@
+/* Testcase by Martin Michlmayr <tbm@cyrius.com> */
+/* Used to segfault due to cselim not marking the complex temp var
+ as GIMPLE reg. */
+
+typedef struct {
+ int nsant, nvqd;
+ _Complex long double *vqd;
+} vsorc_t;
+vsorc_t vsorc;
+
+void foo(int next_job, int ain_num, int iped, long t) {
+ long double zpnorm;
+
+ while (!next_job)
+ if (ain_num)
+ {
+ if (iped == 1)
+ zpnorm = 0.0;
+ int indx = vsorc.nvqd-1;
+ vsorc.vqd[indx] = t*1.0fj;
+ if (cabsl(vsorc.vqd[indx]) < 1.e-20)
+ vsorc.vqd[indx] = 0.0fj;
+ zpnorm = t;
+ if (zpnorm > 0.0)
+ iped = vsorc.nsant;
+ }
+}
diff --git a/gcc/tree-ssa-phiopt.c b/gcc/tree-ssa-phiopt.c
index a8376cf..6df8420 100644
--- a/gcc/tree-ssa-phiopt.c
+++ b/gcc/tree-ssa-phiopt.c
@@ -1287,6 +1287,9 @@ cond_store_replacement (basic_block middle_bb, basic_block join_bb,
{
condstoretemp = create_tmp_var (TREE_TYPE (lhs), "cstore");
get_var_ann (condstoretemp);
+ if (TREE_CODE (TREE_TYPE (lhs)) == COMPLEX_TYPE
+ || TREE_CODE (TREE_TYPE (lhs)) == VECTOR_TYPE)
+ DECL_GIMPLE_REG_P (condstoretemp) = 1;
}
add_referenced_var (condstoretemp);