On Thu, Aug 14, 2014 at 4:06 PM, Ilya Enkovich <[email protected]> wrote:
> 2014-08-14 18:00 GMT+04:00 Alexander Monakov <[email protected]>:
>>
>>
>> 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.