<p dir="ltr">Is this something you expect to be generally useful or something that is only needed to run some experiments.</p>
<p dir="ltr">Is there an equivalent option in the gold plugin or in lib lto?</p>
<div class="gmail_quote">On May 2, 2016 8:42 PM, "Davide Italiano" <<a href="mailto:dccitaliano@gmail.com">dccitaliano@gmail.com</a>> wrote:<br type="attribution"><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">davide created this revision.<br>
davide added reviewers: pcc, rafael.<br>
davide added a subscriber: llvm-commits.<br>
Herald added a subscriber: joker.eph.<br>
<br>
<a href="http://reviews.llvm.org/D19845" rel="noreferrer" target="_blank">http://reviews.llvm.org/D19845</a><br>
<br>
Files:<br>
  ELF/Config.h<br>
  ELF/Driver.cpp<br>
  ELF/LTO.cpp<br>
  ELF/Options.td<br>
  test/ELF/lto/fast-isel.ll<br>
<br>
Index: test/ELF/lto/fast-isel.ll<br>
===================================================================<br>
--- /dev/null<br>
+++ test/ELF/lto/fast-isel.ll<br>
@@ -0,0 +1,38 @@<br>
+; Test the -lto-fast-isel option.<br>
+<br>
+; REQUIRES: x86<br>
+; RUN: rm -f %t.so.lto.bc %t.so.lto.opt.bc %t.so.lto.o<br>
+; RUN: llvm-as %s -o %t.o<br>
+; RUN: ld.lld -m elf_x86_64 %t.o -o %t.so -save-temps --lto-fast-isel -shared<br>
+; RUN: llvm-objdump -d %t.so | FileCheck %s<br>
+; RUN: ld.lld -m elf_x86_64 %t.o -o %t2.so -save-temps -shared<br>
+; RUN: llvm-objdump -d %t2.so | FileCheck %s --check-prefix=NOISEL<br>
+<br>
+target datalayout = "e-m:e-i64:64-f80:128-n8:16:32:64-S128"<br>
+target triple = "x86_64-none-linux"<br>
+<br>
+define i32* @foo(i32* %p, i32* %q, i32** %z) {<br>
+entry:<br>
+  %r = load i32, i32* %p<br>
+  %s = load i32, i32* %q<br>
+  %y = load i32*, i32** %z<br>
+<br>
+  %t0 = add i32 %r, %s<br>
+  %t1 = add i32 %t0, 1<br>
+  %t2 = getelementptr i32, i32* %y, i32 1<br>
+  %t3 = getelementptr i32, i32* %t2, i32 %t1<br>
+<br>
+  ret i32* %t3<br>
+}<br>
+<br>
+; CHECK:      addl    $1, %eax<br>
+; CHECK-NEXT: addq    $4, %rcx<br>
+; CHECK-NEXT: cltq<br>
+; CHECK-NEXT: shlq    $2, %rax<br>
+; CHECK-NEXT: addq    %rcx, %rax<br>
+; CHECK-NEXT: retq<br>
+<br>
+; NOISEL:      leal    1(%rax,%rcx), %eax<br>
+; NOISEL-NEXT: cltq<br>
+; NOISEL-NEXT: leaq    4(%rdx,%rax,4), %rax<br>
+; NOISEL-NEXT: retq<br>
Index: ELF/Options.td<br>
===================================================================<br>
--- ELF/Options.td<br>
+++ ELF/Options.td<br>
@@ -253,6 +253,7 @@<br>
 def alias_version_script_version_script : Joined<["--"], "version-script=">, Alias<version_script>;<br>
<br>
 // LTO-related options.<br>
+def lto_fast_isel : Flag<["--"], "lto-fast-isel">;<br>
 def lto_jobs : Joined<["--"], "lto-jobs=">,<br>
   HelpText<"Number of threads to run codegen">;<br>
 def disable_verify : Flag<["-"], "disable-verify">;<br>
Index: ELF/LTO.cpp<br>
===================================================================<br>
--- ELF/LTO.cpp<br>
+++ ELF/LTO.cpp<br>
@@ -199,8 +199,10 @@<br>
   Reloc::Model R = Config->Pic ? Reloc::PIC_ : Reloc::Static;<br>
<br>
   auto CreateTargetMachine = [&]() {<br>
-    return std::unique_ptr<TargetMachine>(<br>
+    auto TM = std::unique_ptr<TargetMachine>(<br>
         T->createTargetMachine(TheTriple, "", "", Options, R));<br>
+    TM->setFastISel(Config->LtoFastIsel);<br>
+    return TM;<br>
   };<br>
<br>
   std::unique_ptr<TargetMachine> TM = CreateTargetMachine();<br>
Index: ELF/Driver.cpp<br>
===================================================================<br>
--- ELF/Driver.cpp<br>
+++ ELF/Driver.cpp<br>
@@ -332,6 +332,7 @@<br>
   Config->ExportDynamic = Args.hasArg(OPT_export_dynamic);<br>
   Config->GcSections = Args.hasArg(OPT_gc_sections);<br>
   Config->ICF = Args.hasArg(OPT_icf);<br>
+  Config->LtoFastIsel = Args.hasArg(OPT_lto_fast_isel);<br>
   Config->NoGnuUnique = Args.hasArg(OPT_no_gnu_unique);<br>
   Config->NoUndefined = Args.hasArg(OPT_no_undefined);<br>
   Config->NoinhibitExec = Args.hasArg(OPT_noinhibit_exec);<br>
Index: ELF/Config.h<br>
===================================================================<br>
--- ELF/Config.h<br>
+++ ELF/Config.h<br>
@@ -68,6 +68,7 @@<br>
   bool GcSections;<br>
   bool GnuHash = false;<br>
   bool ICF;<br>
+  bool LtoFastIsel;<br>
   bool Mips64EL = false;<br>
   bool NoGnuUnique;<br>
   bool NoUndefined;<br>
<br>
<br>
</blockquote></div>