Commit 5bf51f2f by Jakub Jelinek Committed by Jakub Jelinek

re PR rtl-optimization/58726 (wrong code at -Os on x86_64-linux-gnu (affecting…

re PR rtl-optimization/58726 (wrong code at -Os on x86_64-linux-gnu (affecting trunk/4.7/4.6, but not 4.8))

	PR rtl-optimization/58726
	* combine.c (force_to_mode): Fix comment typo.  Don't destructively
	modify x for ROTATE, ROTATERT and IF_THEN_ELSE.

	* gcc.c-torture/execute/pr58726.c: New test.

From-SVN: r205664
parent 77381ee7
2013-12-04 Jakub Jelinek <jakub@redhat.com> 2013-12-04 Jakub Jelinek <jakub@redhat.com>
PR rtl-optimization/58726
* combine.c (force_to_mode): Fix comment typo. Don't destructively
modify x for ROTATE, ROTATERT and IF_THEN_ELSE.
2013-12-04 Jakub Jelinek <jakub@redhat.com>
Uros Bizjak <ubizjak@gmail.com> Uros Bizjak <ubizjak@gmail.com>
PR target/59163 PR target/59163
...@@ -8029,7 +8029,7 @@ force_to_mode (rtx x, enum machine_mode mode, unsigned HOST_WIDE_INT mask, ...@@ -8029,7 +8029,7 @@ force_to_mode (rtx x, enum machine_mode mode, unsigned HOST_WIDE_INT mask,
if (code == CALL || code == ASM_OPERANDS || code == CLOBBER) if (code == CALL || code == ASM_OPERANDS || code == CLOBBER)
return x; return x;
/* We want to perform the operation is its present mode unless we know /* We want to perform the operation in its present mode unless we know
that the operation is valid in MODE, in which case we do the operation that the operation is valid in MODE, in which case we do the operation
in MODE. */ in MODE. */
op_mode = ((GET_MODE_CLASS (mode) == GET_MODE_CLASS (GET_MODE (x)) op_mode = ((GET_MODE_CLASS (mode) == GET_MODE_CLASS (GET_MODE (x))
...@@ -8460,9 +8460,10 @@ force_to_mode (rtx x, enum machine_mode mode, unsigned HOST_WIDE_INT mask, ...@@ -8460,9 +8460,10 @@ force_to_mode (rtx x, enum machine_mode mode, unsigned HOST_WIDE_INT mask,
gen_int_mode (mask, GET_MODE (x)), gen_int_mode (mask, GET_MODE (x)),
XEXP (x, 1)); XEXP (x, 1));
if (temp && CONST_INT_P (temp)) if (temp && CONST_INT_P (temp))
SUBST (XEXP (x, 0), x = simplify_gen_binary (code, GET_MODE (x),
force_to_mode (XEXP (x, 0), GET_MODE (x), force_to_mode (XEXP (x, 0), GET_MODE (x),
INTVAL (temp), next_select)); INTVAL (temp), next_select),
XEXP (x, 1));
} }
break; break;
...@@ -8530,14 +8531,16 @@ force_to_mode (rtx x, enum machine_mode mode, unsigned HOST_WIDE_INT mask, ...@@ -8530,14 +8531,16 @@ force_to_mode (rtx x, enum machine_mode mode, unsigned HOST_WIDE_INT mask,
/* We have no way of knowing if the IF_THEN_ELSE can itself be /* We have no way of knowing if the IF_THEN_ELSE can itself be
written in a narrower mode. We play it safe and do not do so. */ written in a narrower mode. We play it safe and do not do so. */
SUBST (XEXP (x, 1), op0 = gen_lowpart_or_truncate (GET_MODE (x),
gen_lowpart_or_truncate (GET_MODE (x),
force_to_mode (XEXP (x, 1), mode, force_to_mode (XEXP (x, 1), mode,
mask, next_select))); mask, next_select));
SUBST (XEXP (x, 2), op1 = gen_lowpart_or_truncate (GET_MODE (x),
gen_lowpart_or_truncate (GET_MODE (x),
force_to_mode (XEXP (x, 2), mode, force_to_mode (XEXP (x, 2), mode,
mask, next_select))); mask, next_select));
if (op0 != XEXP (x, 1) || op1 != XEXP (x, 2))
x = simplify_gen_ternary (IF_THEN_ELSE, GET_MODE (x),
GET_MODE (XEXP (x, 0)), XEXP (x, 0),
op0, op1);
break; break;
default: default:
......
2013-12-04 Jakub Jelinek <jakub@redhat.com> 2013-12-04 Jakub Jelinek <jakub@redhat.com>
PR rtl-optimization/58726
* gcc.c-torture/execute/pr58726.c: New test.
PR target/59163 PR target/59163
* g++.dg/torture/pr59163.C: New test. * g++.dg/torture/pr59163.C: New test.
......
/* PR rtl-optimization/58726 */
int a, c;
union { int f1; int f2 : 1; } b;
short
foo (short p)
{
return p < 0 ? p : a;
}
int
main ()
{
if (sizeof (short) * __CHAR_BIT__ != 16
|| sizeof (int) * __CHAR_BIT__ != 32)
return 0;
b.f1 = 56374;
unsigned short d;
int e = b.f2;
d = e == 0 ? b.f1 : 0;
c = foo (d);
if (c != (short) 56374)
__builtin_abort ();
return 0;
}
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment