[llvm-dev] -speculative-execution moving load before store

Mikael Holmén via llvm-dev llvm-dev at lists.llvm.org
Wed May 10 22:20:56 PDT 2017



On 05/10/2017 09:00 PM, Amara Emerson wrote:
> This looks like it's due to r301950, which has today been reverted in
> r302640. Can you try with the latest trunk?
>

Yep after the revert it works again.

Chandler (who reverted r301950) updated the original review for r302640 
with the findings: https://reviews.llvm.org/D24544

/Mikael

> Regardless, there seems to be an underlying bug exposed.
>
> On 10 May 2017 at 07:37, Mikael Holmén via llvm-dev
> <llvm-dev at lists.llvm.org> wrote:
>> Hi,
>>
>> A few days ago I stumbled upon a problem where SpeculativeExecution
>> changed the order of a load and a store to the same address.
>>
>> I wrote
>>
>>  https://bugs.llvm.org//show_bug.cgi?id=32964
>>
>> about it but no response there so far.
>>
>> In the input we have
>>
>>   store i8 0, i8* @i
>>   %.pre = load i8, i8* @i
>>
>> and then in the output the load is moved so it's before the store which
>> clearly makes it load the wrong value.
>>
>> isSafeToSpeculativelyExecute happily says "true" for the load, and there is
>> a comment on isSafeToSpeculativelyExecute saying
>>
>>   /// This method can return true for instructions that read memory;
>>   /// for such instructions, moving them may change the resulting value.
>>
>> And that is indeed the case in PR32964.
>>
>> How is this supposed to work?
>>
>> I started seeing this after the commit
>>
>>  SpeculativeExecution: Stop using whitelist for costs
>>
>> Before that, e.g. a load got the cost UINT_MAX which I suppose disabled
>> hoisting, but since the commit TTI.getUserCost(I) is used for all
>> instructions.
>>
>> Regards,
>> Mikael
>> _______________________________________________
>> LLVM Developers mailing list
>> llvm-dev at lists.llvm.org
>> http://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-dev



More information about the llvm-dev mailing list