Commit 9c1326aa by Jakub Jelinek Committed by Uros Bizjak

re PR target/85756 (wrong code at -Os on x86-64-linux-gnu in 32-bit mode)

	PR target/85756
	* config/i386/i386.md: Disallow non-commutative arithmetics in
	last twpeephole for mem {+,-,&,|,^}= x; mem != 0 after cmpelim
	optimization.  Use COMMUTATIVE_ARITH_P test rather than != MINUS
	in the peephole2 before it.

testsuite/ChangeLog:

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

From-SVN: r260231
parent cd2f262b
2018-05-14 Jakub Jelinek <jakub@redhat.com>
PR target/85756
* config/i386/i386.md: Disallow non-commutative arithmetics in
last twpeephole for mem {+,-,&,|,^}= x; mem != 0 after cmpelim
optimization. Use COMMUTATIVE_ARITH_P test rather than != MINUS
in the peephole2 before it.
2018-05-14 Sebastian Peryt <sebastian.peryt@intel.com>
* common/config/i386/i386-common.c (OPTION_MASK_ISA_CLDEMOTE_SET,
......
......@@ -19370,7 +19370,7 @@
(set (match_dup 1) (match_dup 0))
(set (reg FLAGS_REG) (compare (match_dup 0) (const_int 0)))]
"(TARGET_READ_MODIFY_WRITE || optimize_insn_for_size_p ())
&& GET_CODE (operands[2]) != MINUS
&& COMMUTATIVE_ARITH_P (operands[2])
&& peep2_reg_dead_p (3, operands[0])
&& !reg_overlap_mentioned_p (operands[0], operands[1])
&& ix86_match_ccmode (peep2_next_insn (2),
......@@ -19400,11 +19400,11 @@
(set (match_dup 0) (match_dup 2))])
(set (match_dup 1) (match_dup 0))]
"(TARGET_READ_MODIFY_WRITE || optimize_insn_for_size_p ())
&& COMMUTATIVE_ARITH_P (operands[2])
&& peep2_reg_dead_p (2, operands[0])
&& !reg_overlap_mentioned_p (operands[0], operands[1])
&& ix86_match_ccmode (peep2_next_insn (0),
(GET_CODE (operands[2]) == PLUS
|| GET_CODE (operands[2]) == MINUS)
GET_CODE (operands[2]) == PLUS
? CCGOCmode : CCNOmode)"
[(parallel [(set (match_dup 3) (match_dup 5))
(set (match_dup 1) (match_dup 4))])]
......
2018-05-14 Jakub Jelinek <jakub@redhat.com>
* gcc.c-torture/execute/pr85756.c: New test.
2018-05-14 Sebastian Peryt <sebastian.peryt@intel.com>
* gcc.target/i386/cldemote-1.c: New test.
......
/* PR target/85756 */
#if __CHAR_BIT__ == 8 && __SIZEOF_SHORT__ == 2 && __SIZEOF_INT__ == 4
int a, c, *e, f, h = 10;
short b;
unsigned int p;
__attribute__((noipa)) void
bar (int a)
{
asm volatile ("" : : "r" (a) : "memory");
}
void
foo ()
{
unsigned j = 1, m = 430523;
int k, n = 1, *l = &h;
lab:
p = m;
m = -((~65535U | j) - n);
f = b << ~(n - 8);
n = (m || b) ^ f;
j = p;
if (p < m)
*l = k < 3;
if (!n)
l = &k;
if (c)
{
bar (a);
goto lab;
}
if (!*l)
*e = 1;
}
int
main ()
{
foo ();
return 0;
}
#else
int
main ()
{
return 0;
}
#endif
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