diff options
author | Richard Guenther <rguenther@suse.de> | 2006-08-11 07:44:45 +0000 |
---|---|---|
committer | Richard Biener <rguenth@gcc.gnu.org> | 2006-08-11 07:44:45 +0000 |
commit | e0d0c1939bb8267a7b1dac0aedaa8e8c22ef2cad (patch) | |
tree | ab98ba9561a282ffc55741231132e99c53814c2a /gcc/simplify-rtx.c | |
parent | 9b514d4c6553c0f113a46949db4776788f5bfba5 (diff) | |
download | gcc-e0d0c1939bb8267a7b1dac0aedaa8e8c22ef2cad.zip gcc-e0d0c1939bb8267a7b1dac0aedaa8e8c22ef2cad.tar.gz gcc-e0d0c1939bb8267a7b1dac0aedaa8e8c22ef2cad.tar.bz2 |
re PR middle-end/28651 (signed compare incorrectly false for (int)(U+4)<(int)U where U is unsigned INT_MAX (for optimized x86))
2006-08-11 Richard Guenther <rguenther@suse.de>
PR middle-end/28651
* simplify-rtx.c (simplify_const_relational_operation):
Simplify A CMP B to A - B CMP 0 only for EQ and NE comparison
codes.
* gcc.c-torture/execute/pr28651.c: New testcase.
From-SVN: r116079
Diffstat (limited to 'gcc/simplify-rtx.c')
-rw-r--r-- | gcc/simplify-rtx.c | 17 |
1 files changed, 8 insertions, 9 deletions
diff --git a/gcc/simplify-rtx.c b/gcc/simplify-rtx.c index 3f627e5..8c437e4 100644 --- a/gcc/simplify-rtx.c +++ b/gcc/simplify-rtx.c @@ -3733,19 +3733,18 @@ simplify_const_relational_operation (enum rtx_code code, a register or a CONST_INT, this can't help; testing for these cases will prevent infinite recursion here and speed things up. - If CODE is an unsigned comparison, then we can never do this optimization, - because it gives an incorrect result if the subtraction wraps around zero. - ANSI C defines unsigned operations such that they never overflow, and - thus such cases can not be ignored; but we cannot do it even for - signed comparisons for languages such as Java, so test flag_wrapv. */ + We can only do this for EQ and NE comparisons as otherwise we may + lose or introduce overflow which we cannot disregard as undefined as + we do not know the signedness of the operation on either the left or + the right hand side of the comparison. */ - if (!flag_wrapv && INTEGRAL_MODE_P (mode) && trueop1 != const0_rtx + if (INTEGRAL_MODE_P (mode) && trueop1 != const0_rtx + && (code == EQ || code == NE) && ! ((REG_P (op0) || GET_CODE (trueop0) == CONST_INT) && (REG_P (op1) || GET_CODE (trueop1) == CONST_INT)) && 0 != (tem = simplify_binary_operation (MINUS, mode, op0, op1)) - /* We cannot do this for == or != if tem is a nonzero address. */ - && ((code != EQ && code != NE) || ! nonzero_address_p (tem)) - && code != GTU && code != GEU && code != LTU && code != LEU) + /* We cannot do this if tem is a nonzero address. */ + && ! nonzero_address_p (tem)) return simplify_const_relational_operation (signed_condition (code), mode, tem, const0_rtx); |