OSDN Git Service

PR debug/44136
authorjakub <jakub@138bc75d-0d04-0410-961f-82ee72b054a4>
Fri, 14 May 2010 18:09:14 +0000 (18:09 +0000)
committerjakub <jakub@138bc75d-0d04-0410-961f-82ee72b054a4>
Fri, 14 May 2010 18:09:14 +0000 (18:09 +0000)
* cfgexpand.c (expand_debug_expr): If non-memory op0
has BLKmode, return NULL.

* gcc.dg/pr44136.c: New test.

git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@159400 138bc75d-0d04-0410-961f-82ee72b054a4

gcc/ChangeLog
gcc/cfgexpand.c
gcc/testsuite/ChangeLog
gcc/testsuite/gcc.dg/pr44136.c [new file with mode: 0644]

index d360ebe..2aa0ddd 100644 (file)
@@ -1,3 +1,9 @@
+2010-05-14  Jakub Jelinek  <jakub@redhat.com>
+
+       PR debug/44136
+       * cfgexpand.c (expand_debug_expr): If non-memory op0
+       has BLKmode, return NULL.
+
 2010-05-14  Harsha Jagasia  <harsha.jagasia@amd.com>
 
        * config.gcc: Add support for --with-cpu option for bdver1.
index 319b183..5c42c1c 100644 (file)
@@ -2561,13 +2561,14 @@ expand_debug_expr (tree exp)
         if (bitpos < 0)
           return NULL;
 
+       if (GET_MODE (op0) == BLKmode)
+         return NULL;
+
        if ((bitpos % BITS_PER_UNIT) == 0
            && bitsize == GET_MODE_BITSIZE (mode1))
          {
            enum machine_mode opmode = GET_MODE (op0);
 
-           gcc_assert (opmode != BLKmode);
-
            if (opmode == VOIDmode)
              opmode = mode1;
 
index 6a9bec1..92f9559 100644 (file)
@@ -2,6 +2,9 @@
 
        * gfortran.dg/gomp/pr44036-1.f90: Adjust.
 
+       PR debug/44136
+       * gcc.dg/pr44136.c: New test.
+
 2010-05-14  Shujing Zhao  <pearly.zhao@oracle.com>
 
        PR c++/30566
diff --git a/gcc/testsuite/gcc.dg/pr44136.c b/gcc/testsuite/gcc.dg/pr44136.c
new file mode 100644 (file)
index 0000000..71c21ab
--- /dev/null
@@ -0,0 +1,27 @@
+/* PR debug/44136 */
+/* { dg-do compile } */
+/* { dg-options "-w -O2 -g" } */
+/* { dg-options "-w -O2 -g -mno-sse" { target { { i?86-*-* x86_64-*-* } && ilp32 } } } */
+
+#define vector __attribute((vector_size(16)))
+vector float a;
+
+float
+foo (float b)
+{
+  vector float c = { 0, 0, 0, 0 };
+  vector float d = { 0, 0, 0, 0 };
+  d += c;
+  return ((float *)&c)[2];
+}
+
+float
+bar (vector float a, int b, vector float c)
+{
+  vector float e = c * a;
+  a = (vector float) { 0, 0, 0, 0 };
+  c = (vector float) { 0, 0, 0, 0 };
+  float d = ((float *)&a)[0];
+  float f = ((float *)&c)[0];
+  return d * f;
+}