[PATCH] D11311: Replace hardcoded threshold with an option when analyze read attributes
Nick Lewycky
nicholas at mxc.ca
Sat Jul 18 20:58:33 PDT 2015
Xuetian Weng wrote:
> wengxt created this revision.
> wengxt added reviewers: nlewycky, jingyue.
> wengxt added a subscriber: llvm-commits.
>
> In NVPTX, a specialized instruction ld.global.nc can be used to load memory
> with non-coherent texture cache. We notice that in SHOC [1] benchmark, some
> function arguments are not marked with readonly because FunctionAttrs reaches
> a hardcoded threshold when analysis uses.
>
> This patch changes the hardcoded threshold into an option to enable us to
> change the threshold at runtime.
Question one, what does this have to do with ld.global.nc? It looks like
you've got a load instruction (wrapped in an intrinsic) and it in turn
has many uses. The fact it's ld.global.nc doesn't seem to be relevant?
In theory, if you replaced the ld.global.nc with a LoadInst, would you
have the same problem? Or is there some other optimization that occurs
on those uses of a LoadInst that doesn't occur on the ld.global.nc?
Question two, can you think of a way to design determinePointerReadAttrs
so that it doesn't need a use count but doesn't have a bad worst case
performance problem? For that matter, why isn't this code already linear
in the number of instructions?
Nick
>
> [1] https://github.com/vetter/shoc
>
> http://reviews.llvm.org/D11311
>
> Files:
> lib/Transforms/IPO/FunctionAttrs.cpp
> test/Transforms/FunctionAttrs/readattrs-threshold.ll
>
> Index: test/Transforms/FunctionAttrs/readattrs-threshold.ll
> ===================================================================
> --- /dev/null
> +++ test/Transforms/FunctionAttrs/readattrs-threshold.ll
> @@ -0,0 +1,13 @@
> +; RUN: opt< %s -functionattrs -S | FileCheck %s --check-prefix=CHECK
> +; RUN: opt< %s -functionattrs -readattrs-analysis-uses-threshold=1 -S | FileCheck %s --check-prefix=CHECK-NO-READATTR
> +
> +; %p has two uses
> +; CHECK: define i32 @test(i32* nocapture readonly %p)
> +; CHECK-NO-READATTR: define i32 @test(i32* nocapture %p)
> +define i32 @test(i32* %p) {
> + %1 = load i32, i32* %p
> + %2 = getelementptr i32, i32* %p, i32 1
> + %3 = load i32, i32* %2
> + %4 = add i32 %1, %3
> + ret i32 %4
> +}
> Index: lib/Transforms/IPO/FunctionAttrs.cpp
> ===================================================================
> --- lib/Transforms/IPO/FunctionAttrs.cpp
> +++ lib/Transforms/IPO/FunctionAttrs.cpp
> @@ -44,6 +44,12 @@
> STATISTIC(NumNoAlias, "Number of function returns marked noalias");
> STATISTIC(NumAnnotated, "Number of attributes added to library functions");
>
> +static cl::opt<int> ReadAttrsAnalysisUsesThreshold(
> + "readattrs-analysis-uses-threshold", cl::Hidden, cl::init(20),
> + cl::ZeroOrMore,
> + cl::desc("Control the maximum number of uses to analyze for "
> + "readonly/readnone attribute (default = 20)"));
> +
> namespace {
> struct FunctionAttrs : public CallGraphSCCPass {
> static char ID; // Pass identification, replacement for typeid
> @@ -425,7 +431,7 @@
> // We don't need to track IsWritten. If A is written to, return immediately.
>
> for (Use&U : A->uses()) {
> - if (Count++>= 20)
> + if (Count++>= ReadAttrsAnalysisUsesThreshold)
> return Attribute::None;
>
> Visited.insert(&U);
>
>
>
>
>
> _______________________________________________
> llvm-commits mailing list
> llvm-commits at cs.uiuc.edu
> http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits
More information about the llvm-commits
mailing list