]> granicus.if.org Git - clang/commit
Reduce amount of work ODR hashing does.
authorRichard Trieu <rtrieu@google.com>
Sat, 4 May 2019 04:22:33 +0000 (04:22 +0000)
committerRichard Trieu <rtrieu@google.com>
Sat, 4 May 2019 04:22:33 +0000 (04:22 +0000)
commitc09c3b4c90d5a5730fd018ca56385437d667b1bf
treebf4199953383e24e2af26fa67e2b79d912b68f6e
parente9b780230d2dde954d8f6750e05c4b89bc99f0d7
Reduce amount of work ODR hashing does.

When a FunctionProtoType is in the original type in a DecayedType, the decayed
type is a PointerType which points back the original FunctionProtoType.  The
visitor for ODRHashing will attempt to process both Type's, doing double work.
By chaining together multiple DecayedType's and FunctionProtoType's, this would
result in 2^N Type's visited only N DecayedType's and N FunctionProtoType's
exsit.  Another bug where VisitDecayedType and VisitAdjustedType did
redundant work doubled the work at each level, giving 4^N Type's visited.  This
patch removed the double work and detects when a FunctionProtoType decays to
itself to only check the Type once.  This lowers the exponential runtime to
linear runtime.  Fixes https://bugs.llvm.org/show_bug.cgi?id=41625

git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@359960 91177308-0d34-0410-b5e6-96231b3b80d8
lib/AST/ODRHash.cpp
test/Modules/odr_hash.cpp