[ARM] PR target/68648: Fold NOT of CONST_INT in andsi_iorsi3_notsi splitter

PR target/68648
	* config/arm/arm.md (*andsi_iorsi3_notsi): Try to simplify
	the complement of operands[3] during splitting.

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

From-SVN: r231675
This commit is contained in:
Kyrylo Tkachov 2015-12-16 10:01:48 +00:00 committed by Kyrylo Tkachov
parent 8155f4d8cf
commit 1408479363
4 changed files with 47 additions and 2 deletions

View File

@ -1,3 +1,9 @@
2015-12-16 Kyrylo Tkachov <kyrylo.tkachov@arm.com>
PR target/68648
* config/arm/arm.md (*andsi_iorsi3_notsi): Try to simplify
the complement of operands[3] during splitting.
2015-12-16 Richard Biener <rguenther@suse.de> 2015-12-16 Richard Biener <rguenther@suse.de>
PR tree-optimization/68892 PR tree-optimization/68892

View File

@ -3228,8 +3228,22 @@
"#" ; "orr%?\\t%0, %1, %2\;bic%?\\t%0, %0, %3" "#" ; "orr%?\\t%0, %1, %2\;bic%?\\t%0, %0, %3"
"&& reload_completed" "&& reload_completed"
[(set (match_dup 0) (ior:SI (match_dup 1) (match_dup 2))) [(set (match_dup 0) (ior:SI (match_dup 1) (match_dup 2)))
(set (match_dup 0) (and:SI (not:SI (match_dup 3)) (match_dup 0)))] (set (match_dup 0) (and:SI (match_dup 4) (match_dup 5)))]
"" {
/* If operands[3] is a constant make sure to fold the NOT into it
to avoid creating a NOT of a CONST_INT. */
rtx not_rtx = simplify_gen_unary (NOT, SImode, operands[3], SImode);
if (CONST_INT_P (not_rtx))
{
operands[4] = operands[0];
operands[5] = not_rtx;
}
else
{
operands[5] = operands[0];
operands[4] = not_rtx;
}
}
[(set_attr "length" "8") [(set_attr "length" "8")
(set_attr "ce_count" "2") (set_attr "ce_count" "2")
(set_attr "predicable" "yes") (set_attr "predicable" "yes")

View File

@ -1,3 +1,8 @@
2015-12-16 Kyrylo Tkachov <kyrylo.tkachov@arm.com>
PR target/68648
* gcc.c-torture/execute/pr68648.c: New test.
2015-12-16 Richard Biener <rguenther@suse.de> 2015-12-16 Richard Biener <rguenther@suse.de>
PR tree-optimization/68892 PR tree-optimization/68892

View File

@ -0,0 +1,20 @@
int __attribute__ ((noinline))
foo (void)
{
return 123;
}
int __attribute__ ((noinline))
bar (void)
{
int c = 1;
c |= 4294967295 ^ (foo () | 4073709551608);
return c;
}
int
main ()
{
if (bar () != 0x83fd4005)
__builtin_abort ();
}