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

Backport from mainline
	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.
	(*ssubl_se_1): Ditto.

	Backport from mainline
	2018-01-09  Uros Bizjak  <ubizjak@gmail.com>

	PR target/83628
	* combine.c (force_int_to_mode) <case ASHIFT>: Use mode instead of
	op_mode in the force_to_mode call.

testsuite/ChangeLog:

	Backport from mainline
	2018-01-12  Uros Bizjak  <ubizjak@gmail.com>

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

From-SVN: r256665
This commit is contained in:
Uros Bizjak 2018-01-14 16:45:38 +01:00 committed by Uros Bizjak
parent 2d8d78a10d
commit 38c84ba5d6
6 changed files with 133 additions and 12 deletions

View File

@ -1,3 +1,21 @@
2018-01-14 Uros Bizjak <ubizjak@gmail.com>
Backport from mainline
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.
(*ssubl_se_1): Ditto.
Backport from mainline
2018-01-09 Uros Bizjak <ubizjak@gmail.com>
PR target/83628
* combine.c (force_int_to_mode) <case ASHIFT>: Use mode instead of
op_mode in the force_to_mode call.
2018-01-12 Oleg Endo <olegendo@gcc.gnu.org>
Backport from mainline

View File

@ -8785,7 +8785,7 @@ force_to_mode (rtx x, machine_mode mode, unsigned HOST_WIDE_INT mask,
mask = fuller_mask;
op0 = gen_lowpart_or_truncate (op_mode,
force_to_mode (XEXP (x, 0), op_mode,
force_to_mode (XEXP (x, 0), mode,
mask, next_select));
if (op_mode != GET_MODE (x) || op0 != XEXP (x, 0))

View File

@ -527,17 +527,50 @@
s%P2add<modesuffix> %1,%3,%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"
[(set (match_operand:DI 0 "register_operand" "=r,r")
(sign_extend:DI
(plus:SI (ashift:SI (match_operand:SI 1 "reg_not_elim_operand" "r,r")
(match_operand:SI 2 "const23_operand" "I,I"))
(match_operand:SI 3 "sext_add_operand" "rI,O"))))]
(plus:SI
(ashift:SI (match_operand:SI 1 "reg_not_elim_operand" "r,r")
(match_operand:SI 2 "const23_operand" "I,I"))
(match_operand:SI 3 "sext_add_operand" "rI,O"))))]
""
"@
s%P2addl %1,%3,%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
[(set (match_operand:DI 0 "register_operand")
(sign_extend:DI
@ -627,15 +660,48 @@
""
"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"
[(set (match_operand:DI 0 "register_operand" "=r")
(sign_extend:DI
(minus:SI (ashift:SI (match_operand:SI 1 "reg_not_elim_operand" "r")
(match_operand:SI 2 "const23_operand" "I"))
(match_operand:SI 3 "reg_or_8bit_operand" "rI"))))]
(minus:SI
(ashift:SI (match_operand:SI 1 "reg_not_elim_operand" "r")
(match_operand:SI 2 "const23_operand" "I"))
(match_operand:SI 3 "reg_or_8bit_operand" "rI"))))]
""
"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"
[(set (match_operand:I48MODE 0 "register_operand" "=r")
(minus:I48MODE (match_operand:I48MODE 1 "reg_or_0_operand" "rJ")
@ -1200,7 +1266,7 @@
(subreg:SI (ashift:DI (match_operand:DI 1 "reg_or_0_operand" "rJ")
(match_operand:DI 2 "const_int_operand" "P"))
0)))]
"INTVAL (operands[2]) >= 1 && INTVAL (operands[2]) <= 3"
"IN_RANGE (INTVAL (operands[2]), 1, 3)"
{
if (operands[2] == const1_rtx)
return "addl %r1,%r1,%0";

View File

@ -1,3 +1,11 @@
2018-01-14 Uros Bizjak <ubizjak@gmail.com>
Backport from mainline
2018-01-12 Uros Bizjak <ubizjak@gmail.com>
PR target/83628
* gcc.target/alpha/pr83628-3.c: New test.
2018-01-13 Steven G. Kargl <kargl@gcc.gnu.org>
Backport from mainline

View File

@ -5,25 +5,25 @@
int
s4l (int a, int b)
{
return a + b * 4;
return a * 4 + b;
}
int
s8l (int a, int b)
{
return a + b * 8;
return a * 8 + b;
}
long
s4q (long a, long b)
{
return a + b * 4;
return a * 4 + b;
}
long
s8q (long a, long b)
{
return a + b * 8;
return a * 8 + b;
}
/* { dg-final { scan-assembler-not "\[ \t\]add\[ql\]" } } */

View File

@ -0,0 +1,29 @@
/* 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\]" } } */