Commit 10828a01 by Sandra Loosemore Committed by Sandra Loosemore

simplify-rtx.c (simplify_relational_operation_1): Handle simplification…

simplify-rtx.c (simplify_relational_operation_1): Handle simplification identities for BICS patterns.

2014-12-08  Sandra Loosemore  <sandra@codesourcery.com>

	gcc/
	* simplify-rtx.c (simplify_relational_operation_1): Handle
	simplification identities for BICS patterns.

	gcc/testsuite/
	* gcc.target/aarch64/bics_4.c: New.

From-SVN: r218503
parent 58dddbd2
2014-12-08 Sandra Loosemore <sandra@codesourcery.com>
* simplify-rtx.c (simplify_relational_operation_1): Handle
simplification identities for BICS patterns.
2014-12-08 Trevor Saunders <tsaunders@mozilla.com> 2014-12-08 Trevor Saunders <tsaunders@mozilla.com>
* config/nvptx/nvptx.c: Convert htabs to hash_table. * config/nvptx/nvptx.c: Convert htabs to hash_table.
...@@ -4550,6 +4550,32 @@ simplify_relational_operation_1 (enum rtx_code code, machine_mode mode, ...@@ -4550,6 +4550,32 @@ simplify_relational_operation_1 (enum rtx_code code, machine_mode mode,
simplify_gen_binary (XOR, cmp_mode, simplify_gen_binary (XOR, cmp_mode,
XEXP (op0, 1), op1)); XEXP (op0, 1), op1));
/* (eq/ne (and x y) x) simplifies to (eq/ne (and (not y) x) 0), which
can be implemented with a BICS instruction on some targets, or
constant-folded if y is a constant. */
if ((code == EQ || code == NE)
&& op0code == AND
&& rtx_equal_p (XEXP (op0, 0), op1)
&& !side_effects_p (op1))
{
rtx not_y = simplify_gen_unary (NOT, cmp_mode, XEXP (op0, 1), cmp_mode);
rtx lhs = simplify_gen_binary (AND, cmp_mode, not_y, XEXP (op0, 0));
return simplify_gen_relational (code, mode, cmp_mode, lhs, const0_rtx);
}
/* Likewise for (eq/ne (and x y) y). */
if ((code == EQ || code == NE)
&& op0code == AND
&& rtx_equal_p (XEXP (op0, 1), op1)
&& !side_effects_p (op1))
{
rtx not_x = simplify_gen_unary (NOT, cmp_mode, XEXP (op0, 0), cmp_mode);
rtx lhs = simplify_gen_binary (AND, cmp_mode, not_x, XEXP (op0, 1));
return simplify_gen_relational (code, mode, cmp_mode, lhs, const0_rtx);
}
/* (eq/ne (bswap x) C1) simplifies to (eq/ne x C2) with C2 swapped. */ /* (eq/ne (bswap x) C1) simplifies to (eq/ne x C2) with C2 swapped. */
if ((code == EQ || code == NE) if ((code == EQ || code == NE)
&& GET_CODE (op0) == BSWAP && GET_CODE (op0) == BSWAP
......
2014-12-08 Sandra Loosemore <sandra@codesourcery.com>
* gcc.target/aarch64/bics_4.c: New.
2014-12-08 Mark Wielaard <mjw@redhat.com> 2014-12-08 Mark Wielaard <mjw@redhat.com>
PR debug/60782 PR debug/60782
......
/* { dg-do run } */
/* { dg-options "-O2 --save-temps -fno-inline" } */
extern void abort (void);
int
bics_si_test1 (int a, int b, int c)
{
if ((a & b) == a)
return a;
else
return c;
}
int
bics_si_test2 (int a, int b, int c)
{
if ((a & b) == b)
return b;
else
return c;
}
typedef long long s64;
s64
bics_di_test1 (s64 a, s64 b, s64 c)
{
if ((a & b) == a)
return a;
else
return c;
}
s64
bics_di_test2 (s64 a, s64 b, s64 c)
{
if ((a & b) == b)
return b;
else
return c;
}
int
main ()
{
int x;
s64 y;
x = bics_si_test1 (0xf00d, 0xf11f, 0);
if (x != 0xf00d)
abort ();
x = bics_si_test1 (0xf11f, 0xf00d, 0);
if (x != 0)
abort ();
x = bics_si_test2 (0xf00d, 0xf11f, 0);
if (x != 0)
abort ();
x = bics_si_test2 (0xf11f, 0xf00d, 0);
if (x != 0xf00d)
abort ();
y = bics_di_test1 (0x10001000f00dll, 0x12341000f00dll, 0ll);
if (y != 0x10001000f00dll)
abort ();
y = bics_di_test1 (0x12341000f00dll, 0x10001000f00dll, 0ll);
if (y != 0)
abort ();
y = bics_di_test2 (0x10001000f00dll, 0x12341000f00dll, 0ll);
if (y != 0)
abort ();
y = bics_di_test2 (0x12341000f00dll, 0x10001000f00dll, 0ll);
if (y != 0x10001000f00dll)
abort ();
return 0;
}
/* { dg-final { scan-assembler-times "bics\twzr, w\[0-9\]+, w\[0-9\]+" 2 } } */
/* { dg-final { scan-assembler-times "bics\txzr, x\[0-9\]+, x\[0-9\]+" 2 } } */
/* { dg-final { cleanup-saved-temps } } */
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