[PATCH] D19845: [LTO] Add an option to enable fast-isel

Davide Italiano via llvm-commits llvm-commits at lists.llvm.org
Mon May 2 17:42:28 PDT 2016


davide created this revision.
davide added reviewers: pcc, rafael.
davide added a subscriber: llvm-commits.
Herald added a subscriber: joker.eph.

http://reviews.llvm.org/D19845

Files:
  ELF/Config.h
  ELF/Driver.cpp
  ELF/LTO.cpp
  ELF/Options.td
  test/ELF/lto/fast-isel.ll

Index: test/ELF/lto/fast-isel.ll
===================================================================
--- /dev/null
+++ test/ELF/lto/fast-isel.ll
@@ -0,0 +1,38 @@
+; Test the -lto-fast-isel option.
+
+; REQUIRES: x86
+; RUN: rm -f %t.so.lto.bc %t.so.lto.opt.bc %t.so.lto.o
+; RUN: llvm-as %s -o %t.o
+; RUN: ld.lld -m elf_x86_64 %t.o -o %t.so -save-temps --lto-fast-isel -shared
+; RUN: llvm-objdump -d %t.so | FileCheck %s
+; RUN: ld.lld -m elf_x86_64 %t.o -o %t2.so -save-temps -shared
+; RUN: llvm-objdump -d %t2.so | FileCheck %s --check-prefix=NOISEL
+
+target datalayout = "e-m:e-i64:64-f80:128-n8:16:32:64-S128"
+target triple = "x86_64-none-linux"
+
+define i32* @foo(i32* %p, i32* %q, i32** %z) {
+entry:
+  %r = load i32, i32* %p
+  %s = load i32, i32* %q
+  %y = load i32*, i32** %z
+
+  %t0 = add i32 %r, %s
+  %t1 = add i32 %t0, 1
+  %t2 = getelementptr i32, i32* %y, i32 1
+  %t3 = getelementptr i32, i32* %t2, i32 %t1
+
+  ret i32* %t3
+}
+
+; CHECK:      addl    $1, %eax
+; CHECK-NEXT: addq    $4, %rcx
+; CHECK-NEXT: cltq
+; CHECK-NEXT: shlq    $2, %rax
+; CHECK-NEXT: addq    %rcx, %rax
+; CHECK-NEXT: retq
+
+; NOISEL:      leal    1(%rax,%rcx), %eax
+; NOISEL-NEXT: cltq
+; NOISEL-NEXT: leaq    4(%rdx,%rax,4), %rax
+; NOISEL-NEXT: retq
Index: ELF/Options.td
===================================================================
--- ELF/Options.td
+++ ELF/Options.td
@@ -253,6 +253,7 @@
 def alias_version_script_version_script : Joined<["--"], "version-script=">, Alias<version_script>;
 
 // LTO-related options.
+def lto_fast_isel : Flag<["--"], "lto-fast-isel">;
 def lto_jobs : Joined<["--"], "lto-jobs=">,
   HelpText<"Number of threads to run codegen">;
 def disable_verify : Flag<["-"], "disable-verify">;
Index: ELF/LTO.cpp
===================================================================
--- ELF/LTO.cpp
+++ ELF/LTO.cpp
@@ -199,8 +199,10 @@
   Reloc::Model R = Config->Pic ? Reloc::PIC_ : Reloc::Static;
 
   auto CreateTargetMachine = [&]() {
-    return std::unique_ptr<TargetMachine>(
+    auto TM = std::unique_ptr<TargetMachine>(
         T->createTargetMachine(TheTriple, "", "", Options, R));
+    TM->setFastISel(Config->LtoFastIsel);
+    return TM;
   };
 
   std::unique_ptr<TargetMachine> TM = CreateTargetMachine();
Index: ELF/Driver.cpp
===================================================================
--- ELF/Driver.cpp
+++ ELF/Driver.cpp
@@ -332,6 +332,7 @@
   Config->ExportDynamic = Args.hasArg(OPT_export_dynamic);
   Config->GcSections = Args.hasArg(OPT_gc_sections);
   Config->ICF = Args.hasArg(OPT_icf);
+  Config->LtoFastIsel = Args.hasArg(OPT_lto_fast_isel);
   Config->NoGnuUnique = Args.hasArg(OPT_no_gnu_unique);
   Config->NoUndefined = Args.hasArg(OPT_no_undefined);
   Config->NoinhibitExec = Args.hasArg(OPT_noinhibit_exec);
Index: ELF/Config.h
===================================================================
--- ELF/Config.h
+++ ELF/Config.h
@@ -68,6 +68,7 @@
   bool GcSections;
   bool GnuHash = false;
   bool ICF;
+  bool LtoFastIsel;
   bool Mips64EL = false;
   bool NoGnuUnique;
   bool NoUndefined;


-------------- next part --------------
A non-text attachment was scrubbed...
Name: D19845.55927.patch
Type: text/x-patch
Size: 3078 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20160503/547277e9/attachment.bin>


More information about the llvm-commits mailing list