re PR middle-end/35163 (folding comparison loses cast)

2008-02-12  Richard Guenther  <rguenther@suse.de>

	PR middle-end/35163
	* fold-const.c (fold_widened_comparison): Use get_unwidened in
	value-preserving mode.  Disallow final truncation.

	* gcc.c-torture/execute/pr35163.c: New testcase.

From-SVN: r132269
This commit is contained in:
Richard Guenther 2008-02-12 21:26:49 +00:00 committed by Richard Biener
parent d2a18787b7
commit 8f768a5a18
4 changed files with 25 additions and 1 deletions

View File

@ -1,3 +1,9 @@
2008-02-12 Richard Guenther <rguenther@suse.de>
PR middle-end/35163
* fold-const.c (fold_widened_comparison): Use get_unwidened in
value-preserving mode. Disallow final truncation.
2008-02-12 Eric Botcazou <ebotcazou@adacore.com>
PR middle-end/35136

View File

@ -7045,12 +7045,14 @@ fold_widened_comparison (enum tree_code code, tree type, tree arg0, tree arg1)
if (TYPE_PRECISION (TREE_TYPE (arg0)) <= TYPE_PRECISION (shorter_type))
return NULL_TREE;
arg1_unw = get_unwidened (arg1, shorter_type);
arg1_unw = get_unwidened (arg1, NULL_TREE);
/* If possible, express the comparison in the shorter mode. */
if ((code == EQ_EXPR || code == NE_EXPR
|| TYPE_UNSIGNED (TREE_TYPE (arg0)) == TYPE_UNSIGNED (shorter_type))
&& (TREE_TYPE (arg1_unw) == shorter_type
|| (TYPE_PRECISION (shorter_type)
>= TYPE_PRECISION (TREE_TYPE (arg1_unw)))
|| (TREE_CODE (arg1_unw) == INTEGER_CST
&& (TREE_CODE (shorter_type) == INTEGER_TYPE
|| TREE_CODE (shorter_type) == BOOLEAN_TYPE)

View File

@ -1,3 +1,8 @@
2008-02-12 Richard Guenther <rguenther@suse.de>
PR middle-end/35163
* gcc.c-torture/execute/pr35163.c: New testcase.
2008-02-12 Uros Bizjak <ubizjak@gmail.com>
* gcc.target/i386/asm-3.c: Fix dg-skip-if for all 32bit PIC targets.

View File

@ -0,0 +1,11 @@
extern void abort(void);
int main()
{
signed char a = -30;
signed char b = -31;
if (a > (unsigned short)b)
abort ();
return 0;
}