Forgot to mention: I've bootstrapped and regtested this patch on loongarch64-linux-gnu (with PR110939 patch applied to unbreak the bootstrapping). Ok for trunk?
On Wed, 2023-09-06 at 18:46 +0800, Xi Ruoyao wrote: > If mask is a constant with value ((1 << N) - 1) << M we can perform this > optimization. > > gcc/ChangeLog: > > PR target/111252 > * config/loongarch/loongarch-protos.h > (loongarch_pre_reload_split): Declare new function. > (loongarch_use_bstrins_for_ior_with_mask): Likewise. > * config/loongarch/loongarch.cc > (loongarch_pre_reload_split): Implement. > (loongarch_use_bstrins_for_ior_with_mask): Likewise. > * config/loongarch/predicates.md (ins_zero_bitmask_operand): > New predicate. > * config/loongarch/loongarch.md (bstrins_<mode>_for_mask): > New define_insn_and_split. > (bstrins_<mode>_for_ior_mask): Likewise. > (define_peephole2): Further optimize code sequence produced by > bstrins_<mode>_for_ior_mask if possible. > > gcc/testsuite/ChangeLog: > > * g++.target/loongarch/bstrins-compile.C: New test. > * g++.target/loongarch/bstrins-run.C: New test. /* snip */ -- Xi Ruoyao <xry...@xry111.site> School of Aerospace Science and Technology, Xidian University