re PR rtl-optimization/32293 (internal compiler error: in do_SUBST, at combine.c...
authorUros Bizjak <ubizjak@gmail.com>
Tue, 12 Jun 2007 10:31:04 +0000 (12:31 +0200)
committerUros Bizjak <uros@gcc.gnu.org>
Tue, 12 Jun 2007 10:31:04 +0000 (12:31 +0200)
PR rtl-optimization/32293
* combine.c (simplify_if_then_else): Truncate return from
nonzero_bits() to correct mode.

testsuite/ChangeLog:

PR rtl-optimization/32293
* gcc.dg/pr32293.c: New test.

From-SVN: r125643

gcc/ChangeLog
gcc/combine.c
gcc/testsuite/ChangeLog
gcc/testsuite/gcc.dg/pr32293.c [new file with mode: 0644]

index a36f359d2da1d6834753fe9e09946d6034de8d85..1125e95cc16f0baff456bcdf1af0a93c4969de72 100644 (file)
@@ -1,3 +1,9 @@
+2007-06-12  Uros Bizjak  <ubizjak@gmail.com>
+
+       PR rtl-optimization/32293
+       * combine.c (simplify_if_then_else): Truncate return from
+       nonzero_bits() to correct mode.
+
 2007-06-12  Uros Bizjak  <ubizjak@gmail.com>
 
        * fold-const (fold_binary) [RDIV_EXPR]: Also optimize a/cbrt(b/c)
index d7ac8ad37a0c17bcdaba257ca613a8ccb5429f3e..6fbf81680495891bc45be8e0367871e038db068a 100644 (file)
@@ -5210,11 +5210,17 @@ simplify_if_then_else (rtx x)
 
       if (true_code == EQ && true_val == const0_rtx
          && exact_log2 (nzb = nonzero_bits (from, GET_MODE (from))) >= 0)
-       false_code = EQ, false_val = GEN_INT (nzb);
+       {
+         false_code = EQ;
+         false_val = GEN_INT (trunc_int_for_mode (nzb, GET_MODE (from)));
+       }
       else if (true_code == EQ && true_val == const0_rtx
               && (num_sign_bit_copies (from, GET_MODE (from))
                   == GET_MODE_BITSIZE (GET_MODE (from))))
-       false_code = EQ, false_val = constm1_rtx;
+       {
+         false_code = EQ;
+         false_val = constm1_rtx;
+       }
 
       /* Now simplify an arm if we know the value of the register in the
         branch and it is used in the arm.  Be careful due to the potential
index 73d6b96fdda1d9ffda86052f7c0358326182cce3..756ac4cfc78d8c3af38a1eeacf380e1419193cac 100644 (file)
@@ -1,3 +1,8 @@
+2007-06-12  Uros Bizjak  <ubizjak@gmail.com>
+
+       PR rtl-optimization/32293
+       * gcc.dg/pr32293.c: New test.
+
 2007-06-12  Uros Bizjak  <ubizjak@gmail.com>
 
        * gcc.dg/builtins-11.c: Also check folding of a/cbrt(b/c).
diff --git a/gcc/testsuite/gcc.dg/pr32293.c b/gcc/testsuite/gcc.dg/pr32293.c
new file mode 100644 (file)
index 0000000..fb1268b
--- /dev/null
@@ -0,0 +1,61 @@
+/* { dg-do compile } */
+/* { dg-options "-O2" } */
+
+unsigned int _IDEC_glbround;
+unsigned int _IDEC_glbflags;
+typedef unsigned UINT32;
+typedef signed SINT32;
+typedef unsigned long long UINT64;
+typedef signed long long SINT64;
+typedef
+__attribute__ ((aligned(16)))
+     struct {
+       UINT64 w[2];
+     } UINT128;
+
+static __inline UINT64
+unpack_BID128 (UINT64 * psign_x, int *pexponent_x,
+        UINT128 * pcoefficient_x, UINT128 * px) {
+  UINT128 coeff;
+  UINT64 ex;
+  *psign_x = (px->w[1]) & 0x8000000000000000ull;
+  ex = (px->w[1]) >> 49;
+  *pexponent_x = ((int) ex) & 0x3fff;
+  return coeff.w[0] | coeff.w[1];
+}
+
+static __inline UINT32
+get_BID32 (UINT32 sgn, int expon, UINT64 coeff, int rmode,
+    unsigned *fpsc) {
+  UINT32 r;
+
+  if (((unsigned) expon) > 191) {
+      r = sgn | 0x78000000ul;
+      switch (rmode) {
+      case 0x00002:
+        if (sgn)
+          r = sgn | 0x77f8967f;
+      }
+      return r;
+  }
+  r = expon;
+  return r;
+}
+
+UINT32
+bid128_to_bid32 (UINT128 x)
+{
+  UINT128 *px;
+  UINT128 CX;
+  UINT64 sign_x;
+  UINT32 res;
+  int exponent_x = 0;
+  px = &x;
+  if (!unpack_BID128 (&sign_x, &exponent_x, &CX, px)) {
+      return(res);
+  }
+  res = get_BID32 ((UINT32) (sign_x >> 32),
+        exponent_x, CX.w[0], _IDEC_glbround, &_IDEC_glbflags);
+  return(res);;
+}
+