Commit a39ed7e9 by Jakub Jelinek Committed by Jakub Jelinek

re PR target/59101 (integer wrong code bug)

	PR target/59101
	* config/i386/i386.md (*anddi_2): Only allow CCZmode if
	operands[2] satisfies_constraint_Z that might have bit 31 set.

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

Co-Authored-By: Uros Bizjak <ubizjak@gmail.com>

From-SVN: r204774
parent 46dfed65
2013-11-14 Jakub Jelinek <jakub@redhat.com>
Uros Bizjak <ubizjak@gmail.com>
PR target/59101
* config/i386/i386.md (*anddi_2): Only allow CCZmode if
operands[2] satisfies_constraint_Z that might have bit 31 set.
2013-11-13 Jeff Law <law@redhat.com> 2013-11-13 Jeff Law <law@redhat.com>
PR tree-optimization/59102 PR tree-optimization/59102
...@@ -7978,7 +7978,18 @@ ...@@ -7978,7 +7978,18 @@
(const_int 0))) (const_int 0)))
(set (match_operand:DI 0 "nonimmediate_operand" "=r,r,rm") (set (match_operand:DI 0 "nonimmediate_operand" "=r,r,rm")
(and:DI (match_dup 1) (match_dup 2)))] (and:DI (match_dup 1) (match_dup 2)))]
"TARGET_64BIT && ix86_match_ccmode (insn, CCNOmode) "TARGET_64BIT
&& ix86_match_ccmode
(insn,
/* If we are going to emit andl instead of andq, and the operands[2]
constant might have the SImode sign bit set, make sure the sign
flag isn't tested, because the instruction will set the sign flag
based on bit 31 rather than bit 63. If it isn't CONST_INT,
conservatively assume it might have bit 31 set. */
(satisfies_constraint_Z (operands[2])
&& (!CONST_INT_P (operands[2])
|| val_signbit_known_set_p (SImode, INTVAL (operands[2]))))
? CCZmode : CCNOmode)
&& ix86_binary_operator_ok (AND, DImode, operands)" && ix86_binary_operator_ok (AND, DImode, operands)"
"@ "@
and{l}\t{%k2, %k0|%k0, %k2} and{l}\t{%k2, %k0|%k0, %k2}
......
2013-11-14 Jakub Jelinek <jakub@redhat.com>
PR target/59101
* gcc.c-torture/execute/pr59101.c: New test.
2013-11-13 Jeff Law <law@redhat.com> 2013-11-13 Jeff Law <law@redhat.com>
PR tree-optimization/59102 PR tree-optimization/59102
......
/* PR target/59101 */
__attribute__((noinline, noclone)) int
foo (int a)
{
return (~a & 4102790424LL) > 0 | 6;
}
int
main ()
{
if (foo (0) != 7)
__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