[llvm] r218838 - PR21101: tablegen's FastISel emitter should filter out unused functions.

Bob Wilson bob.wilson at apple.com
Wed Oct 1 17:12:14 PDT 2014


> On Oct 1, 2014, at 4:29 PM, David Blaikie <dblaikie at gmail.com> wrote:
> 
> 
> 
> On Wed, Oct 1, 2014 at 3:44 PM, Bob Wilson <bob.wilson at apple.com <mailto:bob.wilson at apple.com>> wrote:
> Author: bwilson
> Date: Wed Oct  1 17:44:01 2014
> New Revision: 218838
> 
> URL: http://llvm.org/viewvc/llvm-project?rev=218838&view=rev <http://llvm.org/viewvc/llvm-project?rev=218838&view=rev>
> Log:
> PR21101: tablegen's FastISel emitter should filter out unused functions.
> 
> FastISel has a fixed set of virtual functions that are overridden by the
> tablegen-generated code for each target. These functions are distinguished by
> the kinds of operands, e.g., register + immediate = "ri". The FastISel emitter
> has been blindly emitting functions with different combinations of operand
> kinds, even for combinations that are completely unused by FastISel, e.g.,
> "fastEmit_rrr". Change to filter out functions that will be irrelevant for
> FastISel and do not bother generating the code for them. Also add explicit
> "override" keywords for the virtual functions that are overridden.
> 
> We do seem to have some tests for TableGen under llvm/test/TableGen - is this testable?

It’s removing dead code, so I do not see any value in testing that.

> 
> Any data on savings gained by omitting these unused functions?

On OS X, the linker will strip dead code so I’m assuming that the end result is no change. YMMV on other platforms.
>  
> 
> Modified:
>     llvm/trunk/utils/TableGen/FastISelEmitter.cpp
> 
> Modified: llvm/trunk/utils/TableGen/FastISelEmitter.cpp
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/utils/TableGen/FastISelEmitter.cpp?rev=218838&r1=218837&r2=218838&view=diff <http://llvm.org/viewvc/llvm-project/llvm/trunk/utils/TableGen/FastISelEmitter.cpp?rev=218838&r1=218837&r2=218838&view=diff>
> ==============================================================================
> --- llvm/trunk/utils/TableGen/FastISelEmitter.cpp (original)
> +++ llvm/trunk/utils/TableGen/FastISelEmitter.cpp Wed Oct  1 17:44:01 2014
> @@ -19,6 +19,7 @@
> 
>  #include "CodeGenDAGPatterns.h"
>  #include "llvm/ADT/SmallString.h"
> +#include "llvm/ADT/StringSwitch.h"
>  #include "llvm/Support/Debug.h"
>  #include "llvm/Support/ErrorHandling.h"
>  #include "llvm/TableGen/Error.h"
> @@ -541,6 +542,17 @@ void FastISelMap::collectPatterns(CodeGe
>          continue;
>      }
> 
> +    // Check if the operands match one of the patterns handled by FastISel.
> +    std::string ManglingSuffix;
> +    raw_string_ostream SuffixOS(ManglingSuffix);
> +    Operands.PrintManglingSuffix(SuffixOS, ImmediatePredicates, true);
> +    SuffixOS.flush();
> +    if (!StringSwitch<bool>(ManglingSuffix)
> +        .Cases("", "r", "rr", "ri", "rf", true)
> +        .Cases("rri", "i", "f", true)
> +        .Default(false))
> +      continue;
> +
>      // Get the predicate that guards this pattern.
>      std::string PredicateCheck = Pattern.getPredicateCheck();
> 
> @@ -803,7 +815,10 @@ void FastISelMap::printFunctionDefinitio
>      if (!Operands.empty())
>        OS << ", ";
>      Operands.PrintParameters(OS);
> -    OS << ") {\n";
> +    OS << ") ";
> +    if (!Operands.hasAnyImmediateCodes())
> +      OS << "override ";
> +    OS << "{\n";
> 
>      // If there are any forms of this signature available that operate on
>      // constrained forms of the immediate (e.g., 32-bit sext immediate in a
> 
> 
> _______________________________________________
> llvm-commits mailing list
> llvm-commits at cs.uiuc.edu <mailto:llvm-commits at cs.uiuc.edu>
> http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits <http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits>
> 

-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20141001/3349137e/attachment.html>


More information about the llvm-commits mailing list