Commit 6fa6eb35 by Bill Schmidt Committed by William Schmidt

rs6000.c (context.h): New include.

[gcc]

2014-08-20  Bill Schmidt  <wschmidt@linux.vnet.ibm.com>

	* config/rs6000/rs6000.c (context.h): New include.
	(tree-pass.h): Likewise.
	(make_pass_analyze_swaps): New decl.
	(rs6000_option_override): Register pass_analyze_swaps.
	(swap_web_entry): New subsclass of web_entry_base (df.h).
	(special_handling_values): New enum.
	(union_defs): New function.
	(union_uses): Likewise.
	(insn_is_load_p): Likewise.
	(insn_is_store_p): Likewise.
	(insn_is_swap_p): Likewise.
	(rtx_is_swappable_p): Likewise.
	(insn_is_swappable_p): Likewise.
	(chain_purpose): New enum.
	(chain_contains_only_swaps): New function.
	(mark_swaps_for_removal): Likewise.
	(swap_const_vector_halves): Likewise.
	(adjust_subreg_index): Likewise.
	(permute_load): Likewise.
	(permute_store): Likewise.
	(handle_special_swappables): Likewise.
	(replace_swap_with_copy): Likewise.
	(dump_swap_insn_table): Likewise.
	(rs6000_analyze_swaps): Likewise.
	(pass_data_analyze_swaps): New pass_data.
	(pass_analyze_swaps): New rtl_opt_pass.
	(make_pass_analyze_swaps): New function.
	* config/rs6000/rs6000.opt (moptimize-swaps): New option.

[gcc/testsuite]

2014-08-20  Bill Schmidt  <wschmidt@linux.vnet.ibm.com>

	* gcc.target/powerpc/swaps-p8-1.c: New test.
	* gcc.target/powerpc/swaps-p8-2.c: New test.
	* gcc.target/powerpc/swaps-p8-3.c: New test.
	* gcc.target/powerpc/swaps-p8-4.c: New test.
	* gcc.target/powerpc/swaps-p8-5.c: New test.
	* gcc.target/powerpc/swaps-p8-6.c: New test.
	* gcc.target/powerpc/swaps-p8-7.c: New test.
	* gcc.target/powerpc/swaps-p8-8.c: New test.
	* gcc.target/powerpc/swaps-p8-9.c: New test.
	* gcc.target/powerpc/swaps-p8-10.c: New test.
	* gcc.target/powerpc/swaps-p8-11.c: New test.
	* gcc.target/powerpc/swaps-p8-12.c: New test.

From-SVN: r214254
parent 9c068b73
2014-08-20 Bill Schmidt <wschmidt@linux.vnet.ibm.com>
* config/rs6000/rs6000.c (context.h): New include.
(tree-pass.h): Likewise.
(make_pass_analyze_swaps): New decl.
(rs6000_option_override): Register pass_analyze_swaps.
(swap_web_entry): New subsclass of web_entry_base (df.h).
(special_handling_values): New enum.
(union_defs): New function.
(union_uses): Likewise.
(insn_is_load_p): Likewise.
(insn_is_store_p): Likewise.
(insn_is_swap_p): Likewise.
(rtx_is_swappable_p): Likewise.
(insn_is_swappable_p): Likewise.
(chain_purpose): New enum.
(chain_contains_only_swaps): New function.
(mark_swaps_for_removal): Likewise.
(swap_const_vector_halves): Likewise.
(adjust_subreg_index): Likewise.
(permute_load): Likewise.
(permute_store): Likewise.
(handle_special_swappables): Likewise.
(replace_swap_with_copy): Likewise.
(dump_swap_insn_table): Likewise.
(rs6000_analyze_swaps): Likewise.
(pass_data_analyze_swaps): New pass_data.
(pass_analyze_swaps): New rtl_opt_pass.
(make_pass_analyze_swaps): New function.
* config/rs6000/rs6000.opt (moptimize-swaps): New option.
2014-08-21 David Malcolm <dmalcolm@redhat.com> 2014-08-21 David Malcolm <dmalcolm@redhat.com>
* sel-sched-ir.h (create_insn_rtx_from_pattern): Strengthen return * sel-sched-ir.h (create_insn_rtx_from_pattern): Strengthen return
......
...@@ -588,3 +588,7 @@ Allow double variables in upper registers with -mcpu=power7 or -mvsx ...@@ -588,3 +588,7 @@ Allow double variables in upper registers with -mcpu=power7 or -mvsx
mupper-regs-sf mupper-regs-sf
Target Undocumented Mask(UPPER_REGS_SF) Var(rs6000_isa_flags) Target Undocumented Mask(UPPER_REGS_SF) Var(rs6000_isa_flags)
Allow float variables in upper registers with -mcpu=power8 or -mp8-vector Allow float variables in upper registers with -mcpu=power8 or -mp8-vector
moptimize-swaps
Target Undocumented Var(rs6000_optimize_swaps) Init(1) Save
Analyze and remove doubleword swaps from VSX computations.
2014-08-20 Bill Schmidt <wschmidt@linux.vnet.ibm.com>
* gcc.target/powerpc/swaps-p8-1.c: New test.
* gcc.target/powerpc/swaps-p8-2.c: New test.
* gcc.target/powerpc/swaps-p8-3.c: New test.
* gcc.target/powerpc/swaps-p8-4.c: New test.
* gcc.target/powerpc/swaps-p8-5.c: New test.
* gcc.target/powerpc/swaps-p8-6.c: New test.
* gcc.target/powerpc/swaps-p8-7.c: New test.
* gcc.target/powerpc/swaps-p8-8.c: New test.
* gcc.target/powerpc/swaps-p8-9.c: New test.
* gcc.target/powerpc/swaps-p8-10.c: New test.
* gcc.target/powerpc/swaps-p8-11.c: New test.
* gcc.target/powerpc/swaps-p8-12.c: New test.
2014-08-20 Jan Hubicka <hubicka@ucw.cz> 2014-08-20 Jan Hubicka <hubicka@ucw.cz>
* g++.dg/ipa/devirt-37.C: Fix testcase. * g++.dg/ipa/devirt-37.C: Fix testcase.
......
/* { dg-do compile { target { powerpc64le-*-* } } } */
/* { dg-options "-mcpu=power8 -O3" } */
/* { dg-final { scan-assembler "lxvd2x" } } */
/* { dg-final { scan-assembler "stxvd2x" } } */
/* { dg-final { scan-assembler-not "xxpermdi" } } */
void abort();
#define N 16
signed char ca[N] __attribute__((aligned(16)));
signed char cb[] __attribute__((aligned(16)))
= {8, 7, 6, 5, 4, 3, 2, 1, 0, -1, -2, -3, -4, -5, -6, -7};
signed char cc[] __attribute__((aligned(16)))
= {1, 1, 2, 2, 3, 3, 2, 2, 1, 1, 0, 0, -1, -1, -2, -2};
__attribute__((noinline)) void foo ()
{
int i;
for (i = 0; i < N; i++) {
ca[i] = cb[i] - cc[i];
}
}
int main ()
{
signed char cd[] = {7, 6, 4, 3, 1, 0, 0, -1, -1, -2, -2, -3, -3, -4, -4, -5};
int i;
foo ();
for (i = 0; i < N; ++i)
if (ca[i] != cd[i])
abort ();
return 0;
}
/* { dg-do run { target { powerpc64le-*-* } } } */
/* { dg-options "-mcpu=power8 -O3" } */
void abort ();
#define N 4096
int ca[N] __attribute__((aligned(16)));
int cb[N] __attribute__((aligned(16)));
int cc[N] __attribute__((aligned(16)));
int cd[N] __attribute__((aligned(16)));
__attribute__((noinline)) void foo ()
{
int i;
for (i = 0; i < N; i++) {
ca[i] = ((cb[i] + cc[i]) * cd[i]) >> 3;
}
}
__attribute__((noinline)) void init ()
{
int i;
for (i = 0; i < N; ++i) {
cb[i] = 3 * i - 2048;
cc[i] = -5 * i + 93;
cd[i] = i % 2 ? 1 : -1;
}
}
int main ()
{
int i;
init ();
foo ();
for (i = 0; i < N; ++i)
if (i % 2 == 1 && ca[i] != (-2 * i - 1955) >> 3)
abort ();
else if (i % 2 == 0 && ca[i] != (1955 + 2 * i) >> 3)
abort ();
return 0;
}
/* { dg-do run { target { powerpc64le-*-* } } } */
/* { dg-options "-mcpu=power8 -O3" } */
#include <altivec.h>
void abort ();
#define N 4096
int ca[N] __attribute__((aligned(16)));
int cb[N] __attribute__((aligned(16)));
int cc[N] __attribute__((aligned(16)));
int cd[N] __attribute__((aligned(16)));
int hey;
__attribute__((noinline)) void foo ()
{
int i;
vector int va, vb, vc, vd, tmp;
vector unsigned int threes = vec_splat_u32(3);
for (i = 0; i < N; i+=4) {
vb = vec_vsx_ld (0, &cb[i]);
vc = vec_vsx_ld (0, &cc[i]);
vd = vec_vsx_ld (0, &cd[i]);
tmp = vec_add (vb, vc);
tmp = vec_sub (tmp, vd);
tmp = vec_sra (tmp, threes);
hey = tmp[3];
vec_vsx_st (tmp, 0, &ca[i]);
}
}
__attribute__((noinline)) void init ()
{
int i;
for (i = 0; i < N; ++i) {
cb[i] = 3 * i - 2048;
cc[i] = -5 * i + 93;
cd[i] = i + 14;
}
}
int main ()
{
int i;
init ();
foo ();
for (i = 0; i < N; ++i)
if (ca[i] != (-3 * i - 1969) >> 3)
abort ();
if (hey != ca[N-1])
abort ();
return 0;
}
/* { dg-do compile { target { powerpc64le-*-* } } } */
/* { dg-options "-mcpu=power8 -O3" } */
/* { dg-final { scan-assembler "lxvd2x" } } */
/* { dg-final { scan-assembler "stxvd2x" } } */
/* { dg-final { scan-assembler-not "xxpermdi" } } */
#include "altivec.h"
void abort ();
#define N 4096
int ca[N] __attribute__((aligned(16)));
int cb[N] __attribute__((aligned(16)));
int cc[N] __attribute__((aligned(16)));
int cd[N] __attribute__((aligned(16)));
int hey;
__attribute__((noinline)) void foo ()
{
int i;
vector int va, vb, vc, vd, tmp;
vector unsigned int threes = vec_splat_u32(3);
for (i = 0; i < N; i+=4) {
vb = vec_vsx_ld (0, &cb[i]);
vc = vec_vsx_ld (0, &cc[i]);
vd = vec_vsx_ld (0, &cd[i]);
tmp = vec_add (vb, vc);
tmp = vec_sub (tmp, vd);
tmp = vec_sra (tmp, threes);
hey = tmp[3];
vec_vsx_st (tmp, 0, &ca[i]);
}
}
__attribute__((noinline)) void init ()
{
int i;
for (i = 0; i < N; ++i) {
cb[i] = 3 * i - 2048;
cc[i] = -5 * i + 93;
cd[i] = i + 14;
}
}
int main ()
{
int i;
init ();
foo ();
for (i = 0; i < N; ++i)
if (ca[i] != (-3 * i - 1969) >> 3)
abort ();
if (hey != ca[N-1])
abort ();
return 0;
}
/* { dg-do compile { target { powerpc64le-*-* } } } */
/* { dg-options "-mcpu=power8 -O3" } */
/* { dg-final { scan-assembler "lxvd2x" } } */
/* { dg-final { scan-assembler "stxvd2x" } } */
/* { dg-final { scan-assembler-not "xxpermdi" } } */
void abort ();
#define N 256
signed char ca[N] __attribute__((aligned(16)));
signed char cb[N] __attribute__((aligned(16)));
signed char cc[N] __attribute__((aligned(16)));
__attribute__((noinline)) void foo ()
{
int i;
for (i = 0; i < N; i++) {
ca[i] = cb[i] - cc[i];
}
}
__attribute__((noinline)) void init ()
{
int i;
for (i = 0; i < N; ++i) {
cb[i] = i - 128;
cc[i] = i/2 - 64;
}
}
int main ()
{
int i;
init ();
foo ();
for (i = 0; i < N; ++i)
if (ca[i] != i - i/2 - 64)
abort ();
return 0;
}
/* { dg-do compile { target { powerpc64le-*-* } } } */
/* { dg-options "-mcpu=power8 -O3" } */
/* { dg-final { scan-assembler "lxvd2x" } } */
/* { dg-final { scan-assembler "stxvd2x" } } */
/* { dg-final { scan-assembler-not "xxpermdi" } } */
void abort ();
#define N 4096
signed char ca[N] __attribute__((aligned(16)));
signed char cb[N] __attribute__((aligned(16)));
signed char cc[N] __attribute__((aligned(16)));
__attribute__((noinline)) void foo ()
{
int i;
for (i = 0; i < N; i++) {
ca[i] = cb[i] - cc[i];
}
}
__attribute__((noinline)) void init ()
{
int i, ii;
for (i = 0, ii = 0; i < N; ++i, ii = (ii + 1) % 128) {
cb[i] = ii - 128;
cc[i] = ii/2 - 64;
}
}
int main ()
{
int i, ii;
init ();
foo ();
for (i = 0; i < N; ++i) {
ii = i % 128;
if (ca[i] != ii - ii/2 - 64)
abort ();
}
return 0;
}
/* { dg-do compile { target { powerpc64le-*-* } } } */
/* { dg-options "-mcpu=power8 -O3" } */
/* { dg-final { scan-assembler "lxvd2x" } } */
/* { dg-final { scan-assembler "stxvd2x" } } */
/* { dg-final { scan-assembler-not "xxpermdi" } } */
void abort ();
#define N 4096
int ca[N] __attribute__((aligned(16)));
int cb[N] __attribute__((aligned(16)));
int cc[N] __attribute__((aligned(16)));
int cd[N] __attribute__((aligned(16)));
__attribute__((noinline)) void foo ()
{
int i;
for (i = 0; i < N; i++) {
ca[i] = (cb[i] + cc[i]) * cd[i];
}
}
__attribute__((noinline)) void init ()
{
int i;
for (i = 0; i < N; ++i) {
cb[i] = 3 * i - 2048;
cc[i] = -5 * i + 93;
cd[i] = i % 2 ? 1 : -1;
}
}
int main ()
{
int i;
init ();
foo ();
for (i = 0; i < N; ++i)
if (i % 2 == 1 && ca[i] != -2 * i - 1955)
abort ();
else if (i % 2 == 0 && ca[i] != 1955 + 2 * i)
abort ();
return 0;
}
/* { dg-do compile { target { powerpc64le-*-* } } } */
/* { dg-options "-mcpu=power8 -O3" } */
/* { dg-final { scan-assembler "lxvd2x" } } */
/* { dg-final { scan-assembler "stxvd2x" } } */
/* { dg-final { scan-assembler-not "xxpermdi" } } */
void abort ();
#define N 4096
int ca[N] __attribute__((aligned(16)));
int cb[N] __attribute__((aligned(16)));
int cc[N] __attribute__((aligned(16)));
int cd[N] __attribute__((aligned(16)));
__attribute__((noinline)) void foo ()
{
int i;
for (i = 0; i < N; i++) {
ca[i] = ((cb[i] + cc[i]) * cd[i]) >> 3;
}
}
__attribute__((noinline)) void init ()
{
int i;
for (i = 0; i < N; ++i) {
cb[i] = 3 * i - 2048;
cc[i] = -5 * i + 93;
cd[i] = i % 2 ? 1 : -1;
}
}
int main ()
{
int i;
init ();
foo ();
for (i = 0; i < N; ++i)
if (i % 2 == 1 && ca[i] != (-2 * i - 1955) >> 3)
abort ();
else if (i % 2 == 0 && ca[i] != (1955 + 2 * i) >> 3)
abort ();
return 0;
}
/* { dg-do run { target { powerpc64le-*-* } } } */
/* { dg-options "-mcpu=power8 -O3" } */
void abort();
#define N 16
signed char ca[N] __attribute__((aligned(16)));
signed char cb[] __attribute__((aligned(16)))
= {8, 7, 6, 5, 4, 3, 2, 1, 0, -1, -2, -3, -4, -5, -6, -7};
signed char cc[] __attribute__((aligned(16)))
= {1, 1, 2, 2, 3, 3, 2, 2, 1, 1, 0, 0, -1, -1, -2, -2};
__attribute__((noinline)) void foo ()
{
int i;
for (i = 0; i < N; i++) {
ca[i] = cb[i] - cc[i];
}
}
int main ()
{
signed char cd[] = {7, 6, 4, 3, 1, 0, 0, -1, -1, -2, -2, -3, -3, -4, -4, -5};
int i;
foo ();
for (i = 0; i < N; ++i)
if (ca[i] != cd[i])
abort ();
return 0;
}
/* { dg-do run { target { powerpc64le-*-* } } } */
/* { dg-options "-mcpu=power8 -O3" } */
void abort ();
#define N 256
signed char ca[N] __attribute__((aligned(16)));
signed char cb[N] __attribute__((aligned(16)));
signed char cc[N] __attribute__((aligned(16)));
__attribute__((noinline)) void foo ()
{
int i;
for (i = 0; i < N; i++) {
ca[i] = cb[i] - cc[i];
}
}
__attribute__((noinline)) void init ()
{
int i;
for (i = 0; i < N; ++i) {
cb[i] = i - 128;
cc[i] = i/2 - 64;
}
}
int main ()
{
int i;
init ();
foo ();
for (i = 0; i < N; ++i)
if (ca[i] != i - i/2 - 64)
abort ();
return 0;
}
/* { dg-do run { target { powerpc64le-*-* } } } */
/* { dg-options "-mcpu=power8 -O3" } */
void abort ();
#define N 4096
signed char ca[N] __attribute__((aligned(16)));
signed char cb[N] __attribute__((aligned(16)));
signed char cc[N] __attribute__((aligned(16)));
__attribute__((noinline)) void foo ()
{
int i;
for (i = 0; i < N; i++) {
ca[i] = cb[i] - cc[i];
}
}
__attribute__((noinline)) void init ()
{
int i, ii;
for (i = 0, ii = 0; i < N; ++i, ii = (ii + 1) % 128) {
cb[i] = ii - 128;
cc[i] = ii/2 - 64;
}
}
int main ()
{
int i, ii;
init ();
foo ();
for (i = 0; i < N; ++i) {
ii = i % 128;
if (ca[i] != ii - ii/2 - 64)
abort ();
}
return 0;
}
/* { dg-do run { target { powerpc64le-*-* } } } */
/* { dg-options "-mcpu=power8 -O3" } */
void abort ();
#define N 4096
int ca[N] __attribute__((aligned(16)));
int cb[N] __attribute__((aligned(16)));
int cc[N] __attribute__((aligned(16)));
int cd[N] __attribute__((aligned(16)));
__attribute__((noinline)) void foo ()
{
int i;
for (i = 0; i < N; i++) {
ca[i] = (cb[i] + cc[i]) * cd[i];
}
}
__attribute__((noinline)) void init ()
{
int i;
for (i = 0; i < N; ++i) {
cb[i] = 3 * i - 2048;
cc[i] = -5 * i + 93;
cd[i] = i % 2 ? 1 : -1;
}
}
int main ()
{
int i;
init ();
foo ();
for (i = 0; i < N; ++i)
if (i % 2 == 1 && ca[i] != -2 * i - 1955)
abort ();
else if (i % 2 == 0 && ca[i] != 1955 + 2 * i)
abort ();
return 0;
}
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