blob: 16ab6abfc3bf9330f8f8f640481196314f089a5a [file] [log] [blame]
/* { dg-do compile } */
/* { dg-require-effective-target powerpc_vsx_ok } */
/* { dg-options "-O2 -fdump-tree-fre-all -mvsx" } */
/* Verify we remove a redundant load that occurs both before and after
we call a vector load builtin.
This testcase is introduced as we updated a number of our vector load
built-ins with the attribute of PURE instead of MEM, to indicate that
those builtins only read from memory, versus reading from and writing
to the same.
This means we can identify the redundant load instructions in an earlier
pass, and optimize them away. */
#include <altivec.h>
vector signed short load_data;
vector signed short foo()
{
vector signed short r11,r12,r13;
r11 = load_data;
r12 = vec_xl (0, &load_data[0]);
r13 = load_data;
return (r11 + r12 + r13);
}
vector signed short biz()
{
vector signed short r21,r22,r23;
r21 = load_data;
r22 = vec_lvehx (0, &load_data[0]);
r23 = load_data;
return (r21 + r22 + r23);
}
vector signed short bar()
{
vector signed short r31,r32,r33;
r31 = load_data;
r32 = vec_lvx (0, &load_data[0]);
r33 = load_data;
return (r31 + r32 + r33);
}
/* { dg-final { scan-tree-dump-times "Removing dead stmt r13_. = load_data;" 1 "fre1" } } */
/* { dg-final { scan-tree-dump-times "Removing dead stmt r23_. = load_data;" 1 "fre1" } } */
/* { dg-final { scan-tree-dump-times "Removing dead stmt r33_. = load_data;" 1 "fre1" } } */