aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorRichard Kenner <kenner@gcc.gnu.org>1992-12-11 07:18:53 -0500
committerRichard Kenner <kenner@gcc.gnu.org>1992-12-11 07:18:53 -0500
commitd8cfa4ee64a9f661e35b2e1549b0ae85ae5a9888 (patch)
tree68f5b3f0416b944f9fcc6378f1fa804cfd74a947 /gcc
parent2af69b62de170f81459946c0fe464fc153febecb (diff)
downloadgcc-d8cfa4ee64a9f661e35b2e1549b0ae85ae5a9888.zip
gcc-d8cfa4ee64a9f661e35b2e1549b0ae85ae5a9888.tar.gz
gcc-d8cfa4ee64a9f661e35b2e1549b0ae85ae5a9888.tar.bz2
(get_condition): Check for overflow when canonicalizing comparison.
From-SVN: r2863
Diffstat (limited to 'gcc')
-rw-r--r--gcc/loop.c49
1 files changed, 29 insertions, 20 deletions
diff --git a/gcc/loop.c b/gcc/loop.c
index 6ffa6bc..6e093e2 100644
--- a/gcc/loop.c
+++ b/gcc/loop.c
@@ -6386,34 +6386,43 @@ get_condition (jump, earliest)
if (GET_MODE_CLASS (GET_MODE (op0)) == MODE_CC)
return 0;
- /* Canonicalize any ordered comparison with integers involving equality. */
- if (GET_CODE (op1) == CONST_INT)
+ /* Canonicalize any ordered comparison with integers involving equality
+ if we can do computations in the relevant mode and we do not
+ overflow. */
+
+ if (GET_CODE (op1) == CONST_INT
+ && GET_MODE (op0) != VOIDmode
+ && GET_MODE_BITSIZE (GET_MODE (op0)) <= HOST_BITS_PER_WIDE_INT)
{
HOST_WIDE_INT const_val = INTVAL (op1);
unsigned HOST_WIDE_INT uconst_val = const_val;
+ unsigned HOST_WIDE_INT max_val
+ = (unsigned HOST_WIDE_INT) GET_MODE_MASK (GET_MODE (op0));
switch (code)
- {
- case LE:
- code = LT;
- op1 = GEN_INT (const_val + 1);
- break;
+ {
+ case LE:
+ if (const_val != max_val >> 1)
+ code = LT, op1 = GEN_INT (const_val + 1);
+ break;
- case GE:
- code = GT;
- op1 = GEN_INT (const_val - 1);
- break;
+ case GE:
+ if (const_val
+ != (((HOST_WIDE_INT) 1
+ << (GET_MODE_BITSIZE (GET_MODE (op0)) - 1))))
+ code = GT, op1 = GEN_INT (const_val - 1);
+ break;
- case LEU:
- code = LTU;
- op1 = GEN_INT (uconst_val + 1);
- break;
+ case LEU:
+ if (uconst_val != max_val)
+ code = LTU, op1 = GEN_INT (uconst_val + 1);
+ break;
- case GEU:
- code = GTU;
- op1 = GEN_INT (uconst_val - 1);
- break;
- }
+ case GEU:
+ if (uconst_val != 0)
+ code = GTU, op1 = GEN_INT (uconst_val - 1);
+ break;
+ }
}
/* If this was floating-point and we reversed anything other than an