[llvm-dev] PartialAlias: different start addresses

Nuno Lopes via llvm-dev llvm-dev at lists.llvm.org
Sat Jul 15 02:51:50 PDT 2017


> 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.

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. 



More information about the llvm-dev mailing list