[llvm-dev] PartialAlias: different start addresses

Hal Finkel via llvm-dev llvm-dev at lists.llvm.org
Sat Jul 15 05:35:16 PDT 2017


On 07/15/2017 04:51 AM, Nuno Lopes wrote:
>> On 07/14/2017 04:37 PM, Nuno Lopes wrote:
>>> Thank you all for your replies.
>>> So here seems to be an agreement that the documentation for 
>>> PartialAlias is incorrect.
>>>
>>> Daniel: now you got me wondering about MustAlias. This is what the 
>>> docs say:
>>> "The MustAlias response may only be returned if the two memory 
>>> objects are *guaranteed to always start at exactly the same location*"
>>>
>>> This statement is regardless of the access sizes.  For example, in 
>>> SCEV AA:
>>> // If they evaluate to the same expression, it's a MustAlias.
>>> if (AS == BS)
>>>  return MustAlias;
>>>
>>> AS/BS are scev expressions for the pointers. So no check for the 
>>> access size.
>>>
>>> So, does must needs to check for access sizes?  If so, SCEV AA is 
>>> buggy and the documentation needs tweaking.
>>
>> I'm under the impression that there is code that depends on the size 
>> check, but I don't trust my recollection in this regard. SCEV AA is 
>> known to cause miscompiles, IIRC, maybe you just found out why ;)
>
> It's true that the CFL AAs have this code:
> if (LocA.Ptr == LocB.Ptr)
>  return LocA.Size == LocB.Size ? MustAlias : PartialAlias;
>
>
> I grepped for clients of MustAlias:
> ~/llvm/lib/Transforms $ grep -Rl MustAlias .
> ./ObjCARC/ObjCARCOpts.cpp
> ./ObjCARC/ProvenanceAnalysis.cpp
> ./Scalar/DeadStoreElimination.cpp
> ./Scalar/GVN.cpp
> ./Scalar/LICM.cpp
> ./Scalar/LoopVersioningLICM.cpp
> ./Scalar/MemCpyOptimizer.cpp
> ./Scalar/MergedLoadStoreMotion.cpp
> ./Scalar/NewGVN.cpp
> ./Utils/VNCoercion.cpp
>
> I glanced over all the uses in these files and I couldn't find any 
> usage that requires sizes to match.  Actually most clients check 
> access sizes themselves. Most don't need equal sizes, just need one to 
> be smaller than the other.
>
> BTW, Basic AA doesn't check for size either:
> if (isValueEqualInPotentialCycles(V1, V2))
>  return MustAlias;
>
> bool BasicAAResult::isValueEqualInPotentialCycles(const Value *V,
>                                                  const Value *V2) {
>  if (V != V2)
>    return false;
>
>  const Instruction *Inst = dyn_cast<Instruction>(V);
>  if (!Inst)
>    return true;
> (...)
> }
>
> So if V1==V2, BasicAA will yield MustAlias.
>
> I couldn't find any evidence that access sizes must be equal for 2 
> pointers to be MustAlias.  Unless someone can prove that statement 
> wrong, we have to conclude that CFL* AAs are being too conservative by 
> yielding PartialMatch when sizes don't match.

Thanks for looking at this. In that case, I see no reason for the 
restriction. Please do post patches to clean all of this up.

>
> Nuno
>
> P.S.: This is not to say that SCEV AA hasn't bugs: I think I found one 
> by inspection; I've asked a colleague to review and will report it 
> soon.  Not sure there's an easy fix for it, though.

Good, thanks!

  -Hal

-- 
Hal Finkel
Lead, Compiler Technology and Programming Languages
Leadership Computing Facility
Argonne National Laboratory



More information about the llvm-dev mailing list