aboutsummaryrefslogtreecommitdiff
path: root/gcc/hosthooks.h
diff options
context:
space:
mode:
authorKyrylo Tkachov <kyrylo.tkachov@arm.com>2017-11-08 18:29:38 +0000
committerKyrylo Tkachov <ktkachov@gcc.gnu.org>2017-11-08 18:29:38 +0000
commit040939a2387eff082f1594fac35f007f93d2dcd8 (patch)
tree01ecc67421aa14ffdb9721f699664279b29b4320 /gcc/hosthooks.h
parent40757a25d45d47ddc50819bfd32dd6aac595abc2 (diff)
downloadgcc-040939a2387eff082f1594fac35f007f93d2dcd8.zip
gcc-040939a2387eff082f1594fac35f007f93d2dcd8.tar.gz
gcc-040939a2387eff082f1594fac35f007f93d2dcd8.tar.bz2
[simplify-rtx] Simplify vec_merge of vec_duplicates into vec_concat
Another vec_merge simplification that's missing from simplify-rtx.c is transforming a vec_merge of two vec_duplicates. For example: (set (reg:V2DF 80) (vec_merge:V2DF (vec_duplicate:V2DF (reg:DF 84)) (vec_duplicate:V2DF (reg:DF 81)) (const_int 2))) Can be transformed into the simpler: (set (reg:V2DF 80) (vec_concat:V2DF (reg:DF 81) (reg:DF 84))) I believe this should always be beneficial. I'm still looking into finding a small testcase demonstrating this, but on aarch64 SPEC I've seen this eliminate some really bizzare codegen where GCC was generating nonsense like: ldr q18, [sp, 448] ins v18.d[0], v23.d[0] ins v18.d[1], v22.d[0] With q18 being pushed and popped off the stack in the prologue and epilogue of the function! These are large files from SPEC that I haven't been able to analyse yet as to why GCC even attempts to do that, but with this patch it doesn't try to load a register and overwrite all its lanes. This patch shaves off about 5k of code size from zeusmp on aarch64 at -O3, so I believe it's a good thing to do. * simplify-rtx.c (simplify_ternary_operation): Simplify vec_merge of two vec_duplicates into a vec_concat. From-SVN: r254550
Diffstat (limited to 'gcc/hosthooks.h')
0 files changed, 0 insertions, 0 deletions