[llvm-dev] llvm 3.9 Alias Analysis result for function's by-ref arguments

Hayrapetyan, Anahit via llvm-dev llvm-dev at lists.llvm.org
Wed Mar 29 09:47:07 PDT 2017


Thanks for the quick response.


I tried what you've suggested, that is making function arguments noalias. However the result is still the same.


If it may help here are sample function and its IR:

void swap (int* restrict n, int* restrict m)

{

   int tmp = 9;

   *n = tmp;

   *m = 5;

}


; Function Attrs: nounwind uwtable

define void @swap(i32* noalias %n, i32* noalias %m) #0 {

entry:

 %n.addr = alloca i32*, align 8

 %m.addr = alloca i32*, align 8

 %tmp = alloca i32, align 4

 store i32* %n, i32** %n.addr, align 8

 store i32* %m, i32** %m.addr, align 8

 store i32 9, i32* %tmp, align 4

 %0 = load i32, i32* %tmp, align 4

 %1 = load i32*, i32** %n.addr, align 8

 store i32 %0, i32* %1, align 4

 %2 = load i32*, i32** %m.addr, align 8

 store i32 5, i32* %2, align 4

 ret void

}



In getAnalyisisUsage function of my pass I have

AU.setPreservesAll();

        AU.addRequired<llvm::TargetLibraryInfoWrapperPass>();

        AU.addRequired<llvm::AssumptionCacheTracker>();

        AU.addRequired<llvm::AAResultsWrapperPass>();

        llvm::getAAResultsAnalysisUsage(AU);


And I get the AAResults by

llvm::AAResults& AAR = getAnalysis<llvm::AAResultsWrapperPass>().getAAResults();


I also tried running just llvm alias analysis and print alias sets. The arguments are in the same alias set.


opt -aa -print-alias-sets simple.bc -o out.bc


Pointers: (i32* %1, 4), (i32* %2, 4) are in the same set, where %1 is load for n and %2 is load for m.


Could you please explain why I'm still getting the same results or if there is something that I'm doing wrong?


Thanks,

Anahit.

________________________________
From: Hal Finkel <hfinkel at anl.gov>
Sent: Tuesday, March 28, 2017 11:29 PM
To: Hayrapetyan, Anahit; llvm-dev at lists.llvm.org
Subject: Re: [llvm-dev] llvm 3.9 Alias Analysis result for function's by-ref arguments



On 03/28/2017 04:32 AM, Hayrapetyan, Anahit via llvm-dev wrote:

Hi,


I'm writing an analysis pass which is supposed to find instructions in a function that modify function's by-ref arguments. For that I'm using llvm AliasAnalysis pass, particularly querying for ModRef info for instructions and function arguments, to see if a given instruction modifies a given argument. However, for functions with more than one by-ref argument, I get strange results. Instructions, which modify one of the arguments, are reported as modifying the others too - saying, ModRef info of those instructions is Mod for all arguments.

For this example

void function(int& n, int& m)

{

int tmp = m;

n = tmp;

}

Arguments n and m are marked as MayAlias, and storing tmp into n is reported to modify m too.


I found a few discussions about this problem. In one of them, it was suggested to use cfl-aa, I tried it and it did not solve the problem.

In another one they said that this happens on purpose. llvm Alias Analysis marks function's by-ref arguments MayAlias, as function may be called with arguments referencing the same variable.

So I would like to ask whether this is the case.

Yes, this is the case.
It is legal to call the function as:

  int a = ...;
  function(a, a);

And so we need to make a conservative assumption.


And if it is, is there a way to make llvm ignore this consideration?

Yes, if you add __restrict__ (noalias as the IR level), then we'll assume they don't alias.

 -Hal


Thanks,

Anahit.





_______________________________________________
LLVM Developers mailing list
llvm-dev at lists.llvm.org<mailto:llvm-dev at lists.llvm.org>
http://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-dev



--
Hal Finkel
Lead, Compiler Technology and Programming Languages
Leadership Computing Facility
Argonne National Laboratory
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/llvm-dev/attachments/20170329/37c48b3d/attachment.html>


More information about the llvm-dev mailing list