CmdArgs.push_back(Args.MakeArgString("-lto-stats-file=" + StatsFile.str()));
}
+ // Forward -fno-unroll-loops to the linker in LTO.
+ if (Args.hasArg(options::OPT_fno_unroll_loops)) {
+ CmdArgs.push_back("-mllvm");
+ CmdArgs.push_back(Args.MakeArgString("-lto-no-unroll-loops"));
+ }
+
// It seems that the 'e' option is completely ignored for dynamic executables
// (the default), and with static executables, the last one wins, as expected.
Args.AddAllArgs(CmdArgs, {options::OPT_d_Flag, options::OPT_s, options::OPT_t,
--- /dev/null
+// REQUIRES: system-darwin
+
+// RUN: mkdir -p %t/bin
+// RUN: mkdir -p %t/lib
+// RUN: touch %t/lib/libLTO.dylib
+
+// Check that ld gets "-lto-no-unroll-loops" when -fno-unroll-loops is passed.
+//
+// RUN: %clang -target x86_64-apple-darwin10 %s -fno-unroll-loops -flto=full -### 2>&1 | \
+// RUN: FileCheck --check-prefix=NOUNROLL %s
+
+// NOUNROLL: "-mllvm" "-lto-no-unroll-loops"
+//
+// RUN: %clang -target x86_64-apple-darwin10 %s -flto=full -### 2>&1 | \
+// RUN: FileCheck --check-prefix=UNROLL %s
+
+// UNROLL-NOT: -lto-no-unroll-loops
cl::Hidden);
}
+cl::opt<bool> LTONoUnrollLoops("lto-no-unroll-loops",
+ cl::desc("Disable unrolling during LTO."),
+ cl::Hidden, cl::init(false));
+
LTOCodeGenerator::LTOCodeGenerator(LLVMContext &Context)
: Context(Context), MergedModule(new Module("ld-temp.o", Context)),
TheLinker(new Linker(*MergedModule)) {
Triple TargetTriple(TargetMach->getTargetTriple());
PassManagerBuilder PMB;
+ PMB.DisableUnrollLoops = LTONoUnrollLoops;
PMB.DisableGVNLoadPRE = DisableGVNLoadPRE;
PMB.LoopVectorize = !DisableVectorization;
PMB.SLPVectorize = !DisableVectorization;
--- /dev/null
+; REQUIRES: asserts
+
+; RUN: llvm-as < %s > %t1.bc
+
+; Build with unrolling disabled (-lto-no-unroll-loops).
+; RUN: llvm-lto %t1.bc -o %t.nounroll.o -lto-no-unroll-loops --exported-symbol=foo -save-merged-module
+; RUN: llvm-dis -o - %t.nounroll.o.merged.bc | FileCheck --check-prefix=NOUNROLL %s
+
+; NOUNROLL: br label %loop
+; NOUNROLL: br i1 %ec, label %exit, label %loop
+
+; Build with unrolling enabled (by not passing -lto-no-unroll-loops). All
+; branches should be gone.
+; RUN: llvm-lto %t1.bc -o %t.nounroll.o --exported-symbol=foo -save-merged-module
+; RUN: llvm-dis -o - %t.nounroll.o.merged.bc | FileCheck --check-prefix=UNROLL %s
+
+; UNROLL-NOT: br
+
+define void @foo(i32* %ptr) {
+
+entry:
+ br label %loop
+
+loop:
+ %iv = phi i32 [ 0, %entry], [ %iv.next, %loop ]
+ %iv.ptr = getelementptr i32, i32* %ptr, i32 %iv
+ store i32 %iv, i32* %iv.ptr
+ %iv.next = add i32 %iv, 1
+ %ec = icmp eq i32 %iv.next, 10
+ br i1 %ec, label %exit, label %loop
+
+exit:
+ ret void
+}