[llvm] ab98f2c - Revert "[InferAttributes] Materialize all infered attributes for declaration"
Philip Reames via llvm-commits
llvm-commits at lists.llvm.org
Wed Apr 14 16:40:47 PDT 2021
For those following along...
This has been reapplied in dd985551. For some reason, the original
phabricator link Nico posted didn't make it into an email to me. A big
chunk of the confusion was that there were two similarly named tests
(one llvm, one clang) with identical failure messages, but each bot only
reported one. (Odd...) As a result, I didn't notice the second issue.
Nico, thanks for the revert. Definitely warranted in this case.
Philip
On 4/14/21 3:46 PM, Philip Reames via llvm-commits wrote:
> Nico,
>
> Can you point me to the builder which was still failing? I'd missed
> an AMDGPU test, but that was fixed before your revert. (I think your
> revert actually left tree in a broken state since you don't revert
> that change btw.)
>
> Philip
>
> On 4/14/21 3:42 PM, Nico Weber via llvm-commits wrote:
>> Author: Nico Weber
>> Date: 2021-04-14T18:41:20-04:00
>> New Revision: ab98f2c7129a52e216fd7e088b964cf4af27b0f2
>>
>> URL:
>> https://github.com/llvm/llvm-project/commit/ab98f2c7129a52e216fd7e088b964cf4af27b0f2
>> DIFF:
>> https://github.com/llvm/llvm-project/commit/ab98f2c7129a52e216fd7e088b964cf4af27b0f2.diff
>>
>> LOG: Revert "[InferAttributes] Materialize all infered attributes for
>> declaration"
>>
>> Breaks check-clang, see comments on D100400
>>
>> Also revert follow-up "[NFC] Move a recently added utility into a
>> location to enable reuse"
>>
>> This reverts commit 3ce61fb6d697d49db471c7077b88b3b9ec9dec66.
>> This reverts commit 61a85da88235983da565bda0160367461fa0f382.
>>
>> Added:
>>
>> Modified:
>> llvm/include/llvm/Transforms/Utils/Local.h
>> llvm/lib/Transforms/IPO/InferFunctionAttrs.cpp
>> llvm/lib/Transforms/Utils/Local.cpp
>> llvm/test/Other/cgscc-devirt-iteration.ll
>> llvm/test/Transforms/InferFunctionAttrs/annotate.ll
>> llvm/test/Transforms/LICM/strlen.ll
>>
>> Removed:
>>
>>
>> ################################################################################
>>
>> diff --git a/llvm/include/llvm/Transforms/Utils/Local.h
>> b/llvm/include/llvm/Transforms/Utils/Local.h
>> index 8ab066f0b6a3..f7efeeb56fd3 100644
>> --- a/llvm/include/llvm/Transforms/Utils/Local.h
>> +++ b/llvm/include/llvm/Transforms/Utils/Local.h
>> @@ -488,15 +488,6 @@ bool canReplaceOperandWithVariable(const
>> Instruction *I, unsigned OpIdx);
>> /// Invert the given true/false value, possibly reusing an existing
>> copy.
>> Value *invertCondition(Value *Condition);
>> -
>> -//===----------------------------------------------------------------------===//
>>
>> -// Assorted
>> -//
>> -
>> -/// If we can infer one attribute from another on the declaration of a
>> -/// function, explicitly materialize the maximal set in the IR.
>> -bool inferAttributesFromOthers(Function &F);
>> -
>> } // end namespace llvm
>> #endif // LLVM_TRANSFORMS_UTILS_LOCAL_H
>>
>> diff --git a/llvm/lib/Transforms/IPO/InferFunctionAttrs.cpp
>> b/llvm/lib/Transforms/IPO/InferFunctionAttrs.cpp
>> index 30402f109f30..685f8f7d7a00 100644
>> --- a/llvm/lib/Transforms/IPO/InferFunctionAttrs.cpp
>> +++ b/llvm/lib/Transforms/IPO/InferFunctionAttrs.cpp
>> @@ -15,7 +15,6 @@
>> #include "llvm/Support/Debug.h"
>> #include "llvm/Support/raw_ostream.h"
>> #include "llvm/Transforms/Utils/BuildLibCalls.h"
>> -#include "llvm/Transforms/Utils/Local.h"
>> using namespace llvm;
>> #define DEBUG_TYPE "inferattrs"
>> @@ -26,14 +25,9 @@ static bool inferAllPrototypeAttributes(
>> for (Function &F : M.functions())
>> // We only infer things using the prototype and the name; we
>> don't need
>> - // definitions. This ensures libfuncs are annotated and also
>> allows our
>> - // CGSCC inference to avoid needing to duplicate the inference
>> from other
>> - // attribute logic on all calls to declarations (as declarations
>> aren't
>> - // explicitly visited by CGSCC passes in the new pass manager.)
>> - if (F.isDeclaration() && !F.hasOptNone()) {
>> + // definitions.
>> + if (F.isDeclaration() && !F.hasOptNone())
>> Changed |= inferLibFuncAttributes(F, GetTLI(F));
>> - Changed |= inferAttributesFromOthers(F);
>> - }
>> return Changed;
>> }
>>
>> diff --git a/llvm/lib/Transforms/Utils/Local.cpp
>> b/llvm/lib/Transforms/Utils/Local.cpp
>> index 89e62fb94ec1..e285f8aa7a20 100644
>> --- a/llvm/lib/Transforms/Utils/Local.cpp
>> +++ b/llvm/lib/Transforms/Utils/Local.cpp
>> @@ -3392,33 +3392,3 @@ Value *llvm::invertCondition(Value *Condition) {
>> Inverted->insertBefore(&*Parent->getFirstInsertionPt());
>> return Inverted;
>> }
>> -
>> -bool llvm::inferAttributesFromOthers(Function &F) {
>> - // Note: We explicitly check for attributes rather than using
>> cover functions
>> - // because some of the cover functions include the logic being
>> implemented.
>> -
>> - bool Changed = false;
>> - // readnone + not convergent implies nosync
>> - if (!F.hasFnAttribute(Attribute::NoSync) &&
>> - F.doesNotAccessMemory() && !F.isConvergent()) {
>> - F.setNoSync();
>> - Changed = true;
>> - }
>> -
>> - // readonly implies nofree
>> - if (!F.hasFnAttribute(Attribute::NoFree) && F.onlyReadsMemory()) {
>> - F.setDoesNotFreeMemory();
>> - Changed = true;
>> - }
>> -
>> - // willreturn implies mustprogress
>> - if (!F.hasFnAttribute(Attribute::MustProgress) && F.willReturn()) {
>> - F.setMustProgress();
>> - Changed = true;
>> - }
>> -
>> - // TODO: There are a bunch of cases of restrictive memory effects we
>> - // can infer by inspecting arguments of argmemonly-ish functions.
>> -
>> - return Changed;
>> -}
>>
>> diff --git a/llvm/test/Other/cgscc-devirt-iteration.ll
>> b/llvm/test/Other/cgscc-devirt-iteration.ll
>> index 092c624442db..651b7f3b2853 100644
>> --- a/llvm/test/Other/cgscc-devirt-iteration.ll
>> +++ b/llvm/test/Other/cgscc-devirt-iteration.ll
>> @@ -4,18 +4,18 @@
>> ; devirtualization here with GVN which forwards a store through a
>> load and to
>> ; an indirect call.
>> ;
>> -; RUN: opt -aa-pipeline=basic-aa
>> -passes='module(inferattrs),cgscc(function-attrs,function(gvn,instcombine))'
>> -S < %s | FileCheck %s --check-prefix=CHECK --check-prefix=BEFORE
>> -; RUN: opt -aa-pipeline=basic-aa
>> -passes='module(inferattrs),cgscc(devirt<1>(function-attrs,function(gvn,instcombine)))'
>> -S < %s | FileCheck %s --check-prefix=CHECK --check-prefix=AFTER
>> --check-prefix=AFTER1
>> -; RUN: opt -aa-pipeline=basic-aa
>> -passes='module(inferattrs),cgscc(devirt<2>(function-attrs,function(gvn,instcombine)))'
>> -S < %s | FileCheck %s --check-prefix=CHECK --check-prefix=AFTER
>> --check-prefix=AFTER2
>> +; RUN: opt -aa-pipeline=basic-aa
>> -passes='cgscc(function-attrs,function(gvn,instcombine))' -S < %s |
>> FileCheck %s --check-prefix=CHECK --check-prefix=BEFORE
>> +; RUN: opt -aa-pipeline=basic-aa
>> -passes='cgscc(devirt<1>(function-attrs,function(gvn,instcombine)))'
>> -S < %s | FileCheck %s --check-prefix=CHECK --check-prefix=AFTER
>> --check-prefix=AFTER1
>> +; RUN: opt -aa-pipeline=basic-aa
>> -passes='cgscc(devirt<2>(function-attrs,function(gvn,instcombine)))'
>> -S < %s | FileCheck %s --check-prefix=CHECK --check-prefix=AFTER
>> --check-prefix=AFTER2
>> ;
>> -; RUN: not --crash opt -abort-on-max-devirt-iterations-reached
>> -aa-pipeline=basic-aa
>> -passes='module(inferattrs),cgscc(devirt<1>(function-attrs,function(gvn,instcombine)))'
>> -S < %s
>> -; RUN: opt -abort-on-max-devirt-iterations-reached
>> -aa-pipeline=basic-aa
>> -passes='module(inferattrs),cgscc(devirt<2>(function-attrs,function(gvn,instcombine)))'
>> -S < %s
>> +; RUN: not --crash opt -abort-on-max-devirt-iterations-reached
>> -aa-pipeline=basic-aa
>> -passes='cgscc(devirt<1>(function-attrs,function(gvn,instcombine)))'
>> -S < %s
>> +; RUN: opt -abort-on-max-devirt-iterations-reached
>> -aa-pipeline=basic-aa
>> -passes='cgscc(devirt<2>(function-attrs,function(gvn,instcombine)))'
>> -S < %s
>> ;
>> ; We also verify that the real O2 pipeline catches these cases.
>> ; RUN: opt -aa-pipeline=basic-aa -passes='default<O2>' -S < %s |
>> FileCheck %s --check-prefix=CHECK --check-prefix=AFTER
>> --check-prefix=AFTER2
>> declare void @readnone() readnone
>> -; CHECK: Function Attrs: nofree nosync readnone
>> +; CHECK: Function Attrs: readnone
>> ; CHECK-NEXT: declare void @readnone()
>> declare void @unknown()
>> @@ -51,7 +51,7 @@ entry:
>> ; devirtualize again, and then deduce readnone.
>> declare void @readnone_with_arg(void ()**) readnone
>> -; CHECK: Function Attrs: nofree nosync readnone
>> +; CHECK: Function Attrs: readnone
>> ; CHECK-LABEL: declare void @readnone_with_arg(void ()**)
>> define void @test2_a(void ()** %ignore) {
>>
>> diff --git a/llvm/test/Transforms/InferFunctionAttrs/annotate.ll
>> b/llvm/test/Transforms/InferFunctionAttrs/annotate.ll
>> index 05cf79b3874b..c71688ba3d15 100644
>> --- a/llvm/test/Transforms/InferFunctionAttrs/annotate.ll
>> +++ b/llvm/test/Transforms/InferFunctionAttrs/annotate.ll
>> @@ -1016,18 +1016,18 @@ declare i64 @write(i32, i8*, i64)
>> declare void @memset_pattern16(i8*, i8*, i64)
>> -; CHECK-DAG: attributes [[NOFREE_NOUNWIND_WILLRETURN]] = {
>> nofree nounwind willreturn mustprogress }
>> +; CHECK-DAG: attributes [[NOFREE_NOUNWIND_WILLRETURN]] = { nofree
>> nounwind willreturn }
>> ; CHECK-DAG: attributes [[NOFREE_NOUNWIND]] = { nofree nounwind }
>> -; CHECK-DAG: attributes
>> [[INACCESSIBLEMEMONLY_NOFREE_NOUNWIND_WILLRETURN]] = {
>> inaccessiblememonly nofree nounwind willreturn mustprogress }
>> -; CHECK-DAG: attributes [[NOFREE_NOUNWIND_READONLY_WILLRETURN]] = {
>> nofree nounwind readonly willreturn mustprogress }
>> -; CHECK-DAG: attributes [[ARGMEMONLY_NOFREE_NOUNWIND_WILLRETURN]] =
>> { argmemonly nofree nounwind willreturn mustprogress }
>> +; CHECK-DAG: attributes
>> [[INACCESSIBLEMEMONLY_NOFREE_NOUNWIND_WILLRETURN]] = {
>> inaccessiblememonly nofree nounwind willreturn }
>> +; CHECK-DAG: attributes [[NOFREE_NOUNWIND_READONLY_WILLRETURN]] = {
>> nofree nounwind readonly willreturn }
>> +; CHECK-DAG: attributes [[ARGMEMONLY_NOFREE_NOUNWIND_WILLRETURN]] =
>> { argmemonly nofree nounwind willreturn }
>> ; CHECK-DAG: attributes [[NOFREE_NOUNWIND_READONLY]] = { nofree
>> nounwind readonly }
>> -; CHECK-DAG: attributes
>> [[INACCESSIBLEMEMORARGMEMONLY_NOUNWIND_WILLRETURN]] = {
>> inaccessiblemem_or_argmemonly nounwind willreturn mustprogress }
>> -; CHECK-DAG: attributes [[NOFREE_WILLRETURN]] = { nofree willreturn
>> mustprogress }
>> -; CHECK-DAG: attributes
>> [[ARGMEMONLY_NOFREE_NOUNWIND_READONLY_WILLRETURN]] = { argmemonly
>> nofree nounwind readonly willreturn mustprogress }
>> +; CHECK-DAG: attributes
>> [[INACCESSIBLEMEMORARGMEMONLY_NOUNWIND_WILLRETURN]] = {
>> inaccessiblemem_or_argmemonly nounwind willreturn }
>> +; CHECK-DAG: attributes [[NOFREE_WILLRETURN]] = { nofree willreturn }
>> +; CHECK-DAG: attributes
>> [[ARGMEMONLY_NOFREE_NOUNWIND_READONLY_WILLRETURN]] = { argmemonly
>> nofree nounwind readonly willreturn }
>> ; CHECK-DAG: attributes [[NOFREE]] = { nofree }
>> -; CHECK-DAG: attributes [[WILLRETURN]] = { willreturn mustprogress }
>> -; CHECK-DAG: attributes
>> [[INACCESSIBLEMEMORARGONLY_NOFREE_NOUNWIND_WILLRETURN]] = {
>> inaccessiblemem_or_argmemonly nofree nounwind willreturn mustprogress }
>> +; CHECK-DAG: attributes [[WILLRETURN]] = { willreturn }
>> +; CHECK-DAG: attributes
>> [[INACCESSIBLEMEMORARGONLY_NOFREE_NOUNWIND_WILLRETURN]] = {
>> inaccessiblemem_or_argmemonly nofree nounwind willreturn }
>> ; CHECK-DARWIN-DAG: attributes [[ARGMEMONLY_NOFREE]] = {
>> argmemonly nofree }
>> -; CHECK-NVPTX-DAG: attributes [[NOFREE_NOUNWIND_READNONE]] = {
>> nofree nosync nounwind readnone }
>> +; CHECK-NVPTX-DAG: attributes [[NOFREE_NOUNWIND_READNONE]] = {
>> nofree nounwind readnone }
>>
>> diff --git a/llvm/test/Transforms/LICM/strlen.ll
>> b/llvm/test/Transforms/LICM/strlen.ll
>> index 4a45a06f82f7..3f54eecafd80 100644
>> --- a/llvm/test/Transforms/LICM/strlen.ll
>> +++ b/llvm/test/Transforms/LICM/strlen.ll
>> @@ -13,7 +13,7 @@ loop:
>> }
>> ; CHECK: declare i64 @strlen(i8* nocapture) #0
>> -; CHECK: attributes #0 = { argmemonly nofree nounwind readonly
>> willreturn mustprogress }
>> +; CHECK: attributes #0 = { argmemonly nofree nounwind readonly
>> willreturn }
>> declare i64 @strlen(i8*)
>>
>>
>> _______________________________________________
>> llvm-commits mailing list
>> llvm-commits at lists.llvm.org
>> https://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-commits
> _______________________________________________
> llvm-commits mailing list
> llvm-commits at lists.llvm.org
> https://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-commits
More information about the llvm-commits
mailing list