On Thu, Aug 14, 2014 at 4:06 PM, Ilya Enkovich <enkovich....@gmail.com> wrote: > 2014-08-14 18:00 GMT+04:00 Alexander Monakov <amona...@ispras.ru>: >> >> >> On Thu, 14 Aug 2014, Yuri Rumyantsev wrote: >> >>> Hi All, >>> >>> Here is a fix for PR 62011 - remove false dependency for unary >>> bit-manipulation instructions for latest BigCore chips (Sandybridge >>> and Haswell) by outputting in assembly file zeroing destination >>> register before bmi instruction. I checked that performance restored >>> for popcnt, lzcnt and tzcnt instructions. >> >> I am not an x86 reviewer, but one thing looks a bit superfluous to me: >> >>> +/* Retirn true if we need to insert before bit-manipulation instruction >> note typo^ >> >>> + zeroing of its destination register. */ >>> +bool >>> +ix86_avoid_false_dep_for_bm (rtx insn, rtx operands[]) >>> +{ >>> + unsigned int regno0; >>> + df_ref use; >>> + if (!TARGET_AVOID_FALSE_DEP_FOR_BM || optimize_function_for_size_p >>> (cfun)) >>> + return false; >>> + regno0 = true_regnum (operands[0]); >>> + /* Check if insn does not use REGNO0. */ >>> + FOR_EACH_INSN_USE (use, insn) >>> + if (regno0 == DF_REF_REGNO (use)) >>> + return false; >>> + return true; >>> +} >> >> The loop is to prevent adding the xor when the dest operand is also the >> source >> operand. Looks like a simpler "reg_or_subregno (operands[0]) == >> reg_or_subregno (operands[1])" could be used here, as long as the assumption >> that this is called only for two-operand instruction holds? > > This wouldn't cover memory operand case.
You should use reg_mentioned_p, like if (!reg_mentioned_p (operands[0], operands[1]) output_asm_insn ("xor{l}\t%k0,%k0", operands); ... Uros.