On Mon, Jun 1, 2020 at 3:19 AM Alexander Monakov <amona...@ispras.ru> wrote: > > On Sun, 31 May 2020, H.J. Lu via Gcc-patches wrote: > > > --- a/gcc/config/i386/i386-expand.c > > +++ b/gcc/config/i386/i386-expand.c > > @@ -7656,6 +7656,90 @@ ix86_expand_set_or_cpymem (rtx dst, rtx src, rtx > > count_exp, rtx val_exp, > > return true; > > } > > > > +/* Expand cmpstrn or memcmp. */ > > + > > +bool > > +ix86_expand_cmpstrn_or_cmpmem (rtx result, rtx src1, rtx src2, > > + rtx length, rtx align, bool is_cmpstrn) > > +{ > > + if (optimize_insn_for_size_p () && !TARGET_INLINE_ALL_STRINGOPS) > > + return false; > > + > > + /* Can't use this if the user has appropriated ecx, esi or edi. */ > > + if (fixed_regs[CX_REG] || fixed_regs[SI_REG] || fixed_regs[DI_REG]) > > + return false; > > + > > + if (is_cmpstrn) > > + { > > + /* For strncmp, length is the maximum length, which can be larger > > + than actual string lengths. We can expand the cmpstrn pattern > > + to "repz cmpsb" only if one of the strings is a constant so > > + that expand_builtin_strncmp() can write the length argument to > > + be the minimum of the const string length and the actual length > > + argument. Otherwise, "repz cmpsb" may pass the 0 byte. */ > > + tree t1 = MEM_EXPR (src1); > > + tree t2 = MEM_EXPR (src2); > > + if (!((t1 && TREE_CODE (t1) == MEM_REF > > + && TREE_CODE (TREE_OPERAND (t1, 0)) == ADDR_EXPR > > + && (TREE_CODE (TREE_OPERAND (TREE_OPERAND (t1, 0), 0)) > > + == STRING_CST)) > > + || (t2 && TREE_CODE (t2) == MEM_REF > > + && TREE_CODE (TREE_OPERAND (t2, 0)) == ADDR_EXPR > > + && (TREE_CODE (TREE_OPERAND (TREE_OPERAND (t2, 0), 0)) > > + == STRING_CST)))) > > + return false; > > + } > > + else > > + { > > + /* Expand memcmp to "repz cmpsb" only for -minline-all-stringops > > + since "repz cmpsb" can be much slower than memcmp function > > + implemented with vector instructions, see > > + > > + https://gcc.gnu.org/bugzilla/show_bug.cgi?id=43052 > > + */ > > + if (!TARGET_INLINE_ALL_STRINGOPS) > > + return false; > > + } > > This check seems to be misplaced, "rep cmps" is slower than either memcmp or > strcmp. The test for TARGET_INLINE_ALL_STRINGOPS should happen regardless of > is_cmpstrn, so it should go earlier in the function. >
My patch doesn't change strncmp at all. I opened: https://gcc.gnu.org/bugzilla/show_bug.cgi?id=95458 -- H.J.