]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
re PR debug/43229 (ice expand_debug_expr, at cfgexpand.c:2957)
authorJakub Jelinek <jakub@redhat.com>
Wed, 3 Mar 2010 09:58:11 +0000 (10:58 +0100)
committerJakub Jelinek <jakub@gcc.gnu.org>
Wed, 3 Mar 2010 09:58:11 +0000 (10:58 +0100)
PR debug/43229
* cfgexpand.c (expand_debug_expr): Handle DOT_PROD_EXPR,
WIDEN_MULT_EXPR and WIDEN_SUM_EXPR.  Return NULL without
ICE for vector expressions, ADDR_SPACE_CONVERT_EXPR,
FIXED_CONVERT_EXPR, OBJ_TYPE_REF and WITH_SIZE_EXPR.

* gfortran.dg/pr43229.f90: New test.

From-SVN: r157191

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

index e31d206d27f8472df30fea1a7e18b834b23cddb4..a481136dbb63d59e994b066aeb42261b553c55eb 100644 (file)
@@ -1,5 +1,11 @@
 2010-03-03  Jakub Jelinek  <jakub@redhat.com>
 
+       PR debug/43229
+       * cfgexpand.c (expand_debug_expr): Handle DOT_PROD_EXPR,
+       WIDEN_MULT_EXPR and WIDEN_SUM_EXPR.  Return NULL without
+       ICE for vector expressions, ADDR_SPACE_CONVERT_EXPR,
+       FIXED_CONVERT_EXPR, OBJ_TYPE_REF and WITH_SIZE_EXPR.
+
        PR debug/43237
        * dwarf2out.c (add_bound_info): If a decl bound doesn't have decl_die,
        fallthrough to default handling, just with want_address 0 instead of 2.
index b51307ff90283b075669ad71c466c9df58ac0b85..ee14599340459d201a0b453165dfd8e9d8ae99bd 100644 (file)
@@ -2230,6 +2230,7 @@ expand_debug_expr (tree exp)
       switch (TREE_CODE (exp))
        {
        case COND_EXPR:
+       case DOT_PROD_EXPR:
          goto ternary;
 
        case TRUTH_ANDIF_EXPR:
@@ -2950,6 +2951,81 @@ expand_debug_expr (tree exp)
     case ERROR_MARK:
       return NULL;
 
+    /* Vector stuff.  For most of the codes we don't have rtl codes.  */
+    case REALIGN_LOAD_EXPR:
+    case REDUC_MAX_EXPR:
+    case REDUC_MIN_EXPR:
+    case REDUC_PLUS_EXPR:
+    case VEC_COND_EXPR:
+    case VEC_EXTRACT_EVEN_EXPR:
+    case VEC_EXTRACT_ODD_EXPR:
+    case VEC_INTERLEAVE_HIGH_EXPR:
+    case VEC_INTERLEAVE_LOW_EXPR:
+    case VEC_LSHIFT_EXPR:
+    case VEC_PACK_FIX_TRUNC_EXPR:
+    case VEC_PACK_SAT_EXPR:
+    case VEC_PACK_TRUNC_EXPR:
+    case VEC_RSHIFT_EXPR:
+    case VEC_UNPACK_FLOAT_HI_EXPR:
+    case VEC_UNPACK_FLOAT_LO_EXPR:
+    case VEC_UNPACK_HI_EXPR:
+    case VEC_UNPACK_LO_EXPR:
+    case VEC_WIDEN_MULT_HI_EXPR:
+    case VEC_WIDEN_MULT_LO_EXPR:
+      return NULL;
+
+   /* Misc codes.  */
+    case ADDR_SPACE_CONVERT_EXPR:
+    case FIXED_CONVERT_EXPR:
+    case OBJ_TYPE_REF:
+    case WITH_SIZE_EXPR:
+      return NULL;
+
+    case DOT_PROD_EXPR:
+      if (SCALAR_INT_MODE_P (GET_MODE (op0))
+         && SCALAR_INT_MODE_P (mode))
+       {
+         if (TYPE_UNSIGNED (TREE_TYPE (TREE_OPERAND (exp, 0))))
+           op0 = gen_rtx_ZERO_EXTEND (mode, op0);
+         else
+           op0 = gen_rtx_SIGN_EXTEND (mode, op0);
+         if (TYPE_UNSIGNED (TREE_TYPE (TREE_OPERAND (exp, 1))))
+           op1 = gen_rtx_ZERO_EXTEND (mode, op1);
+         else
+           op1 = gen_rtx_SIGN_EXTEND (mode, op1);
+         op0 = gen_rtx_MULT (mode, op0, op1);
+         return gen_rtx_PLUS (mode, op0, op2);
+       }
+      return NULL;
+
+    case WIDEN_MULT_EXPR:
+      if (SCALAR_INT_MODE_P (GET_MODE (op0))
+         && SCALAR_INT_MODE_P (mode))
+       {
+         if (TYPE_UNSIGNED (TREE_TYPE (TREE_OPERAND (exp, 0))))
+           op0 = gen_rtx_ZERO_EXTEND (mode, op0);
+         else
+           op0 = gen_rtx_SIGN_EXTEND (mode, op0);
+         if (TYPE_UNSIGNED (TREE_TYPE (TREE_OPERAND (exp, 1))))
+           op1 = gen_rtx_ZERO_EXTEND (mode, op1);
+         else
+           op1 = gen_rtx_SIGN_EXTEND (mode, op1);
+         return gen_rtx_MULT (mode, op0, op1);
+       }
+      return NULL;
+
+    case WIDEN_SUM_EXPR:
+      if (SCALAR_INT_MODE_P (GET_MODE (op0))
+         && SCALAR_INT_MODE_P (mode))
+       {
+         if (TYPE_UNSIGNED (TREE_TYPE (TREE_OPERAND (exp, 0))))
+           op0 = gen_rtx_ZERO_EXTEND (mode, op0);
+         else
+           op0 = gen_rtx_SIGN_EXTEND (mode, op0);
+         return gen_rtx_PLUS (mode, op0, op1);
+       }
+      return NULL;
+
     default:
     flag_unsupported:
 #ifdef ENABLE_CHECKING
index 6e53f48b9cb6a7f5d05f52bdfc6c6316702011e1..9e81c0dd6de16c9cc0993943c6919ecaecda6867 100644 (file)
@@ -1,5 +1,8 @@
 2010-03-03  Jakub Jelinek  <jakub@redhat.com>
 
+       PR debug/43229
+       * gfortran.dg/pr43229.f90: New test.
+
        PR debug/43237
        * gcc.dg/debug/dwarf2/pr43237.c: New test.
 
diff --git a/gcc/testsuite/gfortran.dg/pr43229.f90 b/gcc/testsuite/gfortran.dg/pr43229.f90
new file mode 100644 (file)
index 0000000..361ea94
--- /dev/null
@@ -0,0 +1,10 @@
+! PR debug/43229
+! { dg-do compile }
+! { dg-options "-g -O3 -ffast-math" }
+! { dg-options "-g -O3 -ffast-math -msse3" { target { i?86-*-* x86_64-*-* } } }
+
+function foo (c, d)
+  real(8) :: c(6), d(6), foo
+  x = sum (c * d)
+  foo = exp (-x)
+end function foo