Commit 26c66656 by Kugan Vivekanandarajah Committed by Kugan Vivekanandarajah

re PR target/65768 (sub-optimimal code for constant Uses in loop)

gcc/ChangeLog:

2015-05-16  Kugan Vivekanandarajah  <kuganv@linaro.org>
	    Zhenqiang Chen  <zhenqiang.chen@linaro.org>

	PR target/65768
	* config/arm/arm.h (DONT_EARLY_SPLIT_CONSTANT): New macro.
	* config/arm/arm.md (subsi3, andsi3, iorsi3, xorsi3, movsi): Keep some
	 large constants in register instead of splitting them.

gcc/testsuite/ChangeLog:

2015-05-16  Kugan Vivekanandarajah  <kuganv@linaro.org>
	    Zhenqiang Chen  <zhenqiang.chen@linaro.org>

	PR target/65768
	* gcc.target/arm/maskdata.c: New test.


Co-Authored-By: Zhenqiang Chen <zhenqiang.chen@linaro.org>

From-SVN: r223235
parent e24ba4ab
2015-05-16 Kugan Vivekanandarajah <kuganv@linaro.org>
Zhenqiang Chen <zhenqiang.chen@linaro.org>
PR target/65768
* config/arm/arm.h (DONT_EARLY_SPLIT_CONSTANT): New macro.
* config/arm/arm.md (subsi3, andsi3, iorsi3, xorsi3, movsi): Keep some
large constants in register instead of splitting them.
2015-05-16 Uros Bizjak <ubizjak@gmail.com> 2015-05-16 Uros Bizjak <ubizjak@gmail.com>
PR target/66140 PR target/66140
......
...@@ -396,6 +396,12 @@ extern void (*arm_lang_output_object_attributes_hook)(void); ...@@ -396,6 +396,12 @@ extern void (*arm_lang_output_object_attributes_hook)(void);
/* Should NEON be used for 64-bits bitops. */ /* Should NEON be used for 64-bits bitops. */
#define TARGET_PREFER_NEON_64BITS (prefer_neon_for_64bits) #define TARGET_PREFER_NEON_64BITS (prefer_neon_for_64bits)
/* Should constant I be slplit for OP. */
#define DONT_EARLY_SPLIT_CONSTANT(i, op) \
((optimize >= 2) \
&& can_create_pseudo_p () \
&& !const_ok_for_op (i, op))
/* True iff the full BPABI is being used. If TARGET_BPABI is true, /* True iff the full BPABI is being used. If TARGET_BPABI is true,
then TARGET_AAPCS_BASED must be true -- but the converse does not then TARGET_AAPCS_BASED must be true -- but the converse does not
hold. TARGET_BPABI implies the use of the BPABI runtime library, hold. TARGET_BPABI implies the use of the BPABI runtime library,
......
...@@ -1168,10 +1168,16 @@ ...@@ -1168,10 +1168,16 @@
{ {
if (TARGET_32BIT) if (TARGET_32BIT)
{ {
arm_split_constant (MINUS, SImode, NULL_RTX, if (DONT_EARLY_SPLIT_CONSTANT (INTVAL (operands[1]), MINUS))
INTVAL (operands[1]), operands[0], operands[1] = force_reg (SImode, operands[1]);
operands[2], optimize && can_create_pseudo_p ()); else
DONE; {
arm_split_constant (MINUS, SImode, NULL_RTX,
INTVAL (operands[1]), operands[0],
operands[2],
optimize && can_create_pseudo_p ());
DONE;
}
} }
else /* TARGET_THUMB1 */ else /* TARGET_THUMB1 */
operands[1] = force_reg (SImode, operands[1]); operands[1] = force_reg (SImode, operands[1]);
...@@ -2082,14 +2088,19 @@ ...@@ -2082,14 +2088,19 @@
operands[1] = convert_to_mode (QImode, operands[1], 1); operands[1] = convert_to_mode (QImode, operands[1], 1);
emit_insn (gen_thumb2_zero_extendqisi2_v6 (operands[0], emit_insn (gen_thumb2_zero_extendqisi2_v6 (operands[0],
operands[1])); operands[1]));
DONE;
} }
else if (DONT_EARLY_SPLIT_CONSTANT (INTVAL (operands[2]), AND))
operands[2] = force_reg (SImode, operands[2]);
else else
arm_split_constant (AND, SImode, NULL_RTX, {
INTVAL (operands[2]), operands[0], arm_split_constant (AND, SImode, NULL_RTX,
operands[1], INTVAL (operands[2]), operands[0],
optimize && can_create_pseudo_p ()); operands[1],
optimize && can_create_pseudo_p ());
DONE; DONE;
}
} }
} }
else /* TARGET_THUMB1 */ else /* TARGET_THUMB1 */
...@@ -2888,10 +2899,16 @@ ...@@ -2888,10 +2899,16 @@
{ {
if (TARGET_32BIT) if (TARGET_32BIT)
{ {
arm_split_constant (IOR, SImode, NULL_RTX, if (DONT_EARLY_SPLIT_CONSTANT (INTVAL (operands[2]), IOR))
INTVAL (operands[2]), operands[0], operands[1], operands[2] = force_reg (SImode, operands[2]);
optimize && can_create_pseudo_p ()); else
DONE; {
arm_split_constant (IOR, SImode, NULL_RTX,
INTVAL (operands[2]), operands[0],
operands[1],
optimize && can_create_pseudo_p ());
DONE;
}
} }
else /* TARGET_THUMB1 */ else /* TARGET_THUMB1 */
{ {
...@@ -3058,10 +3075,16 @@ ...@@ -3058,10 +3075,16 @@
{ {
if (TARGET_32BIT) if (TARGET_32BIT)
{ {
arm_split_constant (XOR, SImode, NULL_RTX, if (DONT_EARLY_SPLIT_CONSTANT (INTVAL (operands[2]), XOR))
INTVAL (operands[2]), operands[0], operands[1], operands[2] = force_reg (SImode, operands[2]);
optimize && can_create_pseudo_p ()); else
DONE; {
arm_split_constant (XOR, SImode, NULL_RTX,
INTVAL (operands[2]), operands[0],
operands[1],
optimize && can_create_pseudo_p ());
DONE;
}
} }
else /* TARGET_THUMB1 */ else /* TARGET_THUMB1 */
{ {
...@@ -5548,10 +5571,18 @@ ...@@ -5548,10 +5571,18 @@
&& !(const_ok_for_arm (INTVAL (operands[1])) && !(const_ok_for_arm (INTVAL (operands[1]))
|| const_ok_for_arm (~INTVAL (operands[1])))) || const_ok_for_arm (~INTVAL (operands[1]))))
{ {
arm_split_constant (SET, SImode, NULL_RTX, if (DONT_EARLY_SPLIT_CONSTANT (INTVAL (operands[1]), SET))
INTVAL (operands[1]), operands[0], NULL_RTX, {
optimize && can_create_pseudo_p ()); emit_insn (gen_rtx_SET (operands[0], operands[1]));
DONE; DONE;
}
else
{
arm_split_constant (SET, SImode, NULL_RTX,
INTVAL (operands[1]), operands[0], NULL_RTX,
optimize && can_create_pseudo_p ());
DONE;
}
} }
} }
else /* TARGET_THUMB1... */ else /* TARGET_THUMB1... */
......
2015-05-16 Kugan Vivekanandarajah <kuganv@linaro.org>
Zhenqiang Chen <zhenqiang.chen@linaro.org>
PR target/65768
* gcc.target/arm/maskdata.c: New test.
2015-05-16 Mikael Morin <mikael@gcc.gnu.org> 2015-05-16 Mikael Morin <mikael@gcc.gnu.org>
PR fortran/65792 PR fortran/65792
......
/* { dg-do compile } */
/* { dg-options " -O2 -fno-gcse " } */
/* { dg-require-effective-target arm_thumb2_ok } */
#define MASK 0xff00ff
void maskdata (int * data, int len)
{
int i = len;
for (; i > 0; i -= 2)
{
data[i] &= MASK;
data[i + 1] &= MASK;
}
}
/* { dg-final { scan-assembler-not "65280" } } */
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