Commit f7aad330 by Uros Bizjak Committed by Uros Bizjak

re PR rtl-optimization/83628 (performance regression when accessing arrays on alpha)

	PR target/83628
	* config/alpha/alpha.md (*saddsi_1): New insn_ans_split pattern.
	(*saddl_se_1): Ditto.
	(*ssubsi_1): Ditto.
	(*saddl_se_1): Ditto.

testsuite/ChangeLog:

	PR target/83628
	* gcc.target/alpha/pr83628-3.c: New test.

From-SVN: r256589
parent 38081436
2018-01-12 Uros Bizjak <ubizjak@gmail.com>
PR target/83628
* config/alpha/alpha.md (*saddsi_1): New insn_ans_split pattern.
(*saddl_se_1): Ditto.
(*ssubsi_1): Ditto.
(*saddl_se_1): Ditto.
2018-01-12 Richard Sandiford <richard.sandiford@linaro.org> 2018-01-12 Richard Sandiford <richard.sandiford@linaro.org>
* tree-predcom.c (aff_combination_dr_offset): Use wi::to_poly_widest * tree-predcom.c (aff_combination_dr_offset): Use wi::to_poly_widest
......
...@@ -527,17 +527,50 @@ ...@@ -527,17 +527,50 @@
s%P2add<modesuffix> %1,%3,%0 s%P2add<modesuffix> %1,%3,%0
s%P2sub<modesuffix> %1,%n3,%0") s%P2sub<modesuffix> %1,%n3,%0")
(define_insn_and_split "*saddsi_1"
[(set (match_operand:SI 0 "register_operand" "=r,r")
(plus:SI
(subreg:SI
(ashift:DI (match_operand:DI 1 "reg_not_elim_operand" "r,r")
(match_operand:DI 2 "const23_operand" "I,I")) 0)
(match_operand:SI 3 "sext_add_operand" "rI,O")))]
""
"#"
""
[(set (match_dup 0)
(plus:SI (ashift:SI (match_dup 1) (match_dup 2))
(match_dup 3)))]
"operands[1] = gen_lowpart (SImode, operands[1]);")
(define_insn "*saddl_se" (define_insn "*saddl_se"
[(set (match_operand:DI 0 "register_operand" "=r,r") [(set (match_operand:DI 0 "register_operand" "=r,r")
(sign_extend:DI (sign_extend:DI
(plus:SI (ashift:SI (match_operand:SI 1 "reg_not_elim_operand" "r,r") (plus:SI
(match_operand:SI 2 "const23_operand" "I,I")) (ashift:SI (match_operand:SI 1 "reg_not_elim_operand" "r,r")
(match_operand:SI 3 "sext_add_operand" "rI,O"))))] (match_operand:SI 2 "const23_operand" "I,I"))
(match_operand:SI 3 "sext_add_operand" "rI,O"))))]
"" ""
"@ "@
s%P2addl %1,%3,%0 s%P2addl %1,%3,%0
s%P2subl %1,%n3,%0") s%P2subl %1,%n3,%0")
(define_insn_and_split "*saddl_se_1"
[(set (match_operand:DI 0 "register_operand" "=r,r")
(sign_extend:DI
(plus:SI
(subreg:SI
(ashift:DI (match_operand:DI 1 "reg_not_elim_operand" "r,r")
(match_operand:DI 2 "const23_operand" "I,I")) 0)
(match_operand:SI 3 "sext_add_operand" "rI,O"))))]
""
"#"
""
[(set (match_dup 0)
(sign_extend:DI
(plus:SI (ashift:SI (match_dup 1) (match_dup 2))
(match_dup 3))))]
"operands[1] = gen_lowpart (SImode, operands[1]);")
(define_split (define_split
[(set (match_operand:DI 0 "register_operand") [(set (match_operand:DI 0 "register_operand")
(sign_extend:DI (sign_extend:DI
...@@ -627,15 +660,48 @@ ...@@ -627,15 +660,48 @@
"" ""
"s%P2sub<modesuffix> %1,%3,%0") "s%P2sub<modesuffix> %1,%3,%0")
(define_insn_and_split "*ssubsi_1"
[(set (match_operand:SI 0 "register_operand" "=r")
(minus:SI
(subreg:SI
(ashift:DI (match_operand:DI 1 "reg_not_elim_operand" "r")
(match_operand:DI 2 "const23_operand" "I")) 0)
(match_operand:SI 3 "reg_or_8bit_operand" "rI")))]
""
"#"
""
[(set (match_dup 0)
(minus:SI (ashift:SI (match_dup 1) (match_dup 2))
(match_dup 3)))]
"operands[1] = gen_lowpart (SImode, operands[1]);")
(define_insn "*ssubl_se" (define_insn "*ssubl_se"
[(set (match_operand:DI 0 "register_operand" "=r") [(set (match_operand:DI 0 "register_operand" "=r")
(sign_extend:DI (sign_extend:DI
(minus:SI (ashift:SI (match_operand:SI 1 "reg_not_elim_operand" "r") (minus:SI
(match_operand:SI 2 "const23_operand" "I")) (ashift:SI (match_operand:SI 1 "reg_not_elim_operand" "r")
(match_operand:SI 3 "reg_or_8bit_operand" "rI"))))] (match_operand:SI 2 "const23_operand" "I"))
(match_operand:SI 3 "reg_or_8bit_operand" "rI"))))]
"" ""
"s%P2subl %1,%3,%0") "s%P2subl %1,%3,%0")
(define_insn_and_split "*ssubl_se_1"
[(set (match_operand:DI 0 "register_operand" "=r")
(sign_extend:DI
(minus:SI
(subreg:SI
(ashift:DI (match_operand:DI 1 "reg_not_elim_operand" "r")
(match_operand:DI 2 "const23_operand" "I")) 0)
(match_operand:SI 3 "reg_or_8bit_operand" "rI"))))]
""
"#"
""
[(set (match_dup 0)
(sign_extend:DI
(minus:SI (ashift:SI (match_dup 1) (match_dup 2))
(match_dup 3))))]
"operands[1] = gen_lowpart (SImode, operands[1]);")
(define_insn "subv<mode>3" (define_insn "subv<mode>3"
[(set (match_operand:I48MODE 0 "register_operand" "=r") [(set (match_operand:I48MODE 0 "register_operand" "=r")
(minus:I48MODE (match_operand:I48MODE 1 "reg_or_0_operand" "rJ") (minus:I48MODE (match_operand:I48MODE 1 "reg_or_0_operand" "rJ")
...@@ -1200,7 +1266,7 @@ ...@@ -1200,7 +1266,7 @@
(subreg:SI (ashift:DI (match_operand:DI 1 "reg_or_0_operand" "rJ") (subreg:SI (ashift:DI (match_operand:DI 1 "reg_or_0_operand" "rJ")
(match_operand:DI 2 "const_int_operand" "P")) (match_operand:DI 2 "const_int_operand" "P"))
0)))] 0)))]
"INTVAL (operands[2]) >= 1 && INTVAL (operands[2]) <= 3" "IN_RANGE (INTVAL (operands[2]), 1, 3)"
{ {
if (operands[2] == const1_rtx) if (operands[2] == const1_rtx)
return "addl %r1,%r1,%0"; return "addl %r1,%r1,%0";
......
2018-01-12 Uros Bizjak <ubizjak@gmail.com>
PR target/83628
* gcc.target/alpha/pr83628-3.c: New test.
2018-01-12 Rainer Orth <ro@CeBiTec.Uni-Bielefeld.DE> 2018-01-12 Rainer Orth <ro@CeBiTec.Uni-Bielefeld.DE>
* lib/target-supports.exp (check_effective_target_avx512f): Also * lib/target-supports.exp (check_effective_target_avx512f): Also
......
...@@ -5,25 +5,25 @@ ...@@ -5,25 +5,25 @@
int int
s4l (int a, int b) s4l (int a, int b)
{ {
return a + b * 4; return a * 4 + b;
} }
int int
s8l (int a, int b) s8l (int a, int b)
{ {
return a + b * 8; return a * 8 + b;
} }
long long
s4q (long a, long b) s4q (long a, long b)
{ {
return a + b * 4; return a * 4 + b;
} }
long long
s8q (long a, long b) s8q (long a, long b)
{ {
return a + b * 8; return a * 8 + b;
} }
/* { dg-final { scan-assembler-not "\[ \t\]add\[ql\]" } } */ /* { dg-final { scan-assembler-not "\[ \t\]add\[ql\]" } } */
/* PR target/83628 */
/* { dg-do compile } */
/* { dg-options "-O2" } */
int
s4l (int a, int b)
{
return a * 4 - b;
}
int
s8l (int a, int b)
{
return a * 8 - b;
}
long
s4q (long a, long b)
{
return a * 4 - b;
}
long
s8q (long a, long b)
{
return a * 8 - b;
}
/* { dg-final { scan-assembler-not "\[ \t\]sub\[ql\]" } } */
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