[AArch64][11/14] Re-layout SIMD builtin types on builtin expansion
* config/aarch64/aarch64.c (aarch64_option_valid_attribute_p): Initialize simd builtins if TARGET_SIMD. * config/aarch64/aarch64-builtins.c (aarch64_init_simd_builtins): Make sure that the builtins are initialized only once no matter how many times the function is called. (aarch64_init_builtins): Unconditionally initialize crc builtins. (aarch64_relayout_simd_param): New function. (aarch64_simd_expand_args): Use above during argument expansion. * config/aarch64/aarch64-c.c (aarch64_pragma_target_parse): Initialize simd builtins if TARGET_SIMD. * config/aarch64/aarch64-protos.h (aarch64_init_simd_builtins): New prototype. (aarch64_relayout_simd_types): Likewise. * gcc.target/aarch64/target_attr_crypto_ice_1.c: New test. From-SVN: r226564
This commit is contained in:
parent
e4ea20c8eb
commit
e95a988ada
@ -1,3 +1,19 @@
|
||||
2015-08-04 Kyrylo Tkachov <kyrylo.tkachov@arm.com>
|
||||
|
||||
* config/aarch64/aarch64.c (aarch64_option_valid_attribute_p):
|
||||
Initialize simd builtins if TARGET_SIMD.
|
||||
* config/aarch64/aarch64-builtins.c (aarch64_init_simd_builtins):
|
||||
Make sure that the builtins are initialized only once no matter how
|
||||
many times the function is called.
|
||||
(aarch64_init_builtins): Unconditionally initialize crc builtins.
|
||||
(aarch64_relayout_simd_param): New function.
|
||||
(aarch64_simd_expand_args): Use above during argument expansion.
|
||||
* config/aarch64/aarch64-c.c (aarch64_pragma_target_parse): Initialize
|
||||
simd builtins if TARGET_SIMD.
|
||||
* config/aarch64/aarch64-protos.h (aarch64_init_simd_builtins): New
|
||||
prototype.
|
||||
(aarch64_relayout_simd_types): Likewise.
|
||||
|
||||
2015-08-04 Kyrylo Tkachov <kyrylo.tkachov@arm.com>
|
||||
|
||||
* config.gcc (aarch64*-*-*): Specify c_target_objs and cxx_target_objs.
|
||||
|
@ -684,11 +684,18 @@ aarch64_init_simd_builtin_scalar_types (void)
|
||||
"__builtin_aarch64_simd_udi");
|
||||
}
|
||||
|
||||
static void
|
||||
static bool aarch64_simd_builtins_initialized_p = false;
|
||||
|
||||
void
|
||||
aarch64_init_simd_builtins (void)
|
||||
{
|
||||
unsigned int i, fcode = AARCH64_SIMD_PATTERN_START;
|
||||
|
||||
if (aarch64_simd_builtins_initialized_p)
|
||||
return;
|
||||
|
||||
aarch64_simd_builtins_initialized_p = true;
|
||||
|
||||
aarch64_init_simd_builtin_types ();
|
||||
|
||||
/* Strong-typing hasn't been implemented for all AdvSIMD builtin intrinsics.
|
||||
@ -857,8 +864,8 @@ aarch64_init_builtins (void)
|
||||
|
||||
if (TARGET_SIMD)
|
||||
aarch64_init_simd_builtins ();
|
||||
if (TARGET_CRC32)
|
||||
aarch64_init_crc32_builtins ();
|
||||
|
||||
aarch64_init_crc32_builtins ();
|
||||
}
|
||||
|
||||
tree
|
||||
@ -879,6 +886,31 @@ typedef enum
|
||||
SIMD_ARG_STOP
|
||||
} builtin_simd_arg;
|
||||
|
||||
/* Relayout the decl of a function arg. Keep the RTL component the same,
|
||||
as varasm.c ICEs. It doesn't like reinitializing the RTL
|
||||
on PARM decls. Something like this needs to be done when compiling a
|
||||
file without SIMD and then tagging a function with +simd and using SIMD
|
||||
intrinsics in there. The types will have been laid out assuming no SIMD,
|
||||
so we want to re-lay them out. */
|
||||
|
||||
static void
|
||||
aarch64_relayout_simd_param (tree arg)
|
||||
{
|
||||
tree argdecl = arg;
|
||||
if (TREE_CODE (argdecl) == SSA_NAME)
|
||||
argdecl = SSA_NAME_VAR (argdecl);
|
||||
|
||||
if (argdecl
|
||||
&& (TREE_CODE (argdecl) == PARM_DECL
|
||||
|| TREE_CODE (argdecl) == VAR_DECL))
|
||||
{
|
||||
rtx rtl = NULL_RTX;
|
||||
rtl = DECL_RTL_IF_SET (argdecl);
|
||||
relayout_decl (argdecl);
|
||||
SET_DECL_RTL (argdecl, rtl);
|
||||
}
|
||||
}
|
||||
|
||||
static rtx
|
||||
aarch64_simd_expand_args (rtx target, int icode, int have_retval,
|
||||
tree exp, builtin_simd_arg *args,
|
||||
@ -908,6 +940,7 @@ aarch64_simd_expand_args (rtx target, int icode, int have_retval,
|
||||
{
|
||||
tree arg = CALL_EXPR_ARG (exp, opc - have_retval);
|
||||
enum machine_mode mode = insn_data[icode].operand[opc].mode;
|
||||
aarch64_relayout_simd_param (arg);
|
||||
op[opc] = expand_normal (arg);
|
||||
|
||||
switch (thisarg)
|
||||
|
@ -177,6 +177,19 @@ aarch64_pragma_target_parse (tree args, tree pop_target)
|
||||
|
||||
cpp_opts->warn_unused_macros = saved_warn_unused_macros;
|
||||
|
||||
/* Initialize SIMD builtins if we haven't already.
|
||||
Set current_target_pragma to NULL for the duration so that
|
||||
the builtin initialization code doesn't try to tag the functions
|
||||
being built with the attributes specified by any current pragma, thus
|
||||
going into an infinite recursion. */
|
||||
if (TARGET_SIMD)
|
||||
{
|
||||
tree saved_current_target_pragma = current_target_pragma;
|
||||
current_target_pragma = NULL;
|
||||
aarch64_init_simd_builtins ();
|
||||
current_target_pragma = saved_current_target_pragma;
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
|
@ -323,10 +323,12 @@ void aarch64_expand_vector_init (rtx, rtx);
|
||||
void aarch64_init_cumulative_args (CUMULATIVE_ARGS *, const_tree, rtx,
|
||||
const_tree, unsigned);
|
||||
void aarch64_init_expanders (void);
|
||||
void aarch64_init_simd_builtins (void);
|
||||
void aarch64_print_operand (FILE *, rtx, char);
|
||||
void aarch64_print_operand_address (FILE *, rtx);
|
||||
void aarch64_emit_call_insn (rtx);
|
||||
void aarch64_register_pragmas (void);
|
||||
void aarch64_relayout_simd_types (void);
|
||||
void aarch64_reset_previous_fndecl (void);
|
||||
|
||||
/* Initialize builtins for SIMD intrinsics. */
|
||||
|
@ -8450,6 +8450,18 @@ aarch64_option_valid_attribute_p (tree fndecl, tree, tree args, int)
|
||||
if (ret)
|
||||
{
|
||||
aarch64_override_options_internal (&global_options);
|
||||
/* Initialize SIMD builtins if we haven't already.
|
||||
Set current_target_pragma to NULL for the duration so that
|
||||
the builtin initialization code doesn't try to tag the functions
|
||||
being built with the attributes specified by any current pragma, thus
|
||||
going into an infinite recursion. */
|
||||
if (TARGET_SIMD)
|
||||
{
|
||||
tree saved_current_target_pragma = current_target_pragma;
|
||||
current_target_pragma = NULL;
|
||||
aarch64_init_simd_builtins ();
|
||||
current_target_pragma = saved_current_target_pragma;
|
||||
}
|
||||
new_target = build_target_option_node (&global_options);
|
||||
}
|
||||
else
|
||||
|
@ -1,3 +1,7 @@
|
||||
2015-08-04 Kyrylo Tkachov <kyrylo.tkachov@arm.com>
|
||||
|
||||
* gcc.target/aarch64/target_attr_crypto_ice_1.c: New test.
|
||||
|
||||
2015-08-04 Kyrylo Tkachov <kyrylo.tkachov@arm.com>
|
||||
|
||||
* gcc.target/aarch64/arm_neon-nosimd-error.c: Delete.
|
||||
|
21
gcc/testsuite/gcc.target/aarch64/target_attr_crypto_ice_1.c
Normal file
21
gcc/testsuite/gcc.target/aarch64/target_attr_crypto_ice_1.c
Normal file
@ -0,0 +1,21 @@
|
||||
/* { dg-do compile } */
|
||||
/* { dg-options "-O2 -mcpu=thunderx+nofp" } */
|
||||
|
||||
#include "arm_neon.h"
|
||||
|
||||
/* Unless we do something about re-laying out the SIMD builtin types
|
||||
this testcase ICEs during expansion of the crypto builtin. */
|
||||
|
||||
__attribute__ ((target ("cpu=cortex-a57+crypto")))
|
||||
uint32x4_t
|
||||
test_vsha1cq_u32 (uint32x4_t hash_abcd, uint32_t hash_e, uint32x4_t wk)
|
||||
{
|
||||
return vsha1cq_u32 (hash_abcd, hash_e, wk);
|
||||
}
|
||||
|
||||
/* This one should be compiled for thunderx with no fp. */
|
||||
int
|
||||
foo (int a)
|
||||
{
|
||||
return a + 5;
|
||||
}
|
Loading…
Reference in New Issue
Block a user