<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>