Hayrapetyan, Anahit via llvm-dev
2017-Mar-28 09:32 UTC
[llvm-dev] llvm 3.9 Alias Analysis result for function's by-ref arguments
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. And if it is, is there a way to
make llvm ignore this consideration?
Thanks,
Anahit.
-------------- next part --------------
An HTML attachment was scrubbed...
URL:
<http://lists.llvm.org/pipermail/llvm-dev/attachments/20170328/a6aac6b6/attachment.html>
Hal Finkel via llvm-dev
2017-Mar-28 21:29 UTC
[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 > 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/20170328/7fef5dd7/attachment.html>
Hayrapetyan, Anahit via llvm-dev
2017-Mar-29 16:47 UTC
[llvm-dev] llvm 3.9 Alias Analysis result for function's by-ref arguments
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>