Index: llvm/trunk/lib/Transforms/IPO/FunctionImport.cpp =================================================================== --- llvm/trunk/lib/Transforms/IPO/FunctionImport.cpp +++ llvm/trunk/lib/Transforms/IPO/FunctionImport.cpp @@ -48,10 +48,15 @@ cl::desc("As we import functions, multiply the " "`import-instr-limit` threshold by this factor " "before processing newly imported functions")); + static cl::opt ImportHotMultiplier( "import-hot-multiplier", cl::init(3.0), cl::Hidden, cl::value_desc("x"), - cl::ZeroOrMore, cl::desc("Multiply the `import-instr-limit` threshold for " - "hot callsites")); + cl::desc("Multiply the `import-instr-limit` threshold for hot callsites")); + +// FIXME: This multiplier was not really tuned up. +static cl::opt ImportColdMultiplier( + "import-cold-multiplier", cl::init(0), cl::Hidden, cl::value_desc("N"), + cl::desc("Multiply the `import-instr-limit` threshold for cold callsites")); static cl::opt PrintImports("print-imports", cl::init(false), cl::Hidden, cl::desc("Print imported functions")); @@ -285,11 +290,16 @@ continue; } - // FIXME: Also lower the threshold for cold callsites. + auto GetBonusMultiplier = [](CalleeInfo::HotnessType Hotness) -> float { + if (Hotness == CalleeInfo::HotnessType::Hot) + return ImportHotMultiplier; + if (Hotness == CalleeInfo::HotnessType::Cold) + return ImportColdMultiplier; + return 1.0; + }; + const auto NewThreshold = - Edge.second.Hotness == CalleeInfo::HotnessType::Hot - ? Threshold * ImportHotMultiplier - : Threshold; + Threshold * GetBonusMultiplier(Edge.second.Hotness); auto *CalleeSummary = selectCallee(GUID, NewThreshold, Index); if (!CalleeSummary) { DEBUG(dbgs() << "ignored! No qualifying callee with summary found.\n"); Index: llvm/trunk/test/Transforms/FunctionImport/hotness_based_import.ll =================================================================== --- llvm/trunk/test/Transforms/FunctionImport/hotness_based_import.ll +++ llvm/trunk/test/Transforms/FunctionImport/hotness_based_import.ll @@ -5,12 +5,13 @@ ; Test import with default hot multiplier (3) ; RUN: opt -function-import -summary-file %t3.thinlto.bc %t.bc -import-instr-limit=1 --S | FileCheck %s --check-prefix=CHECK --check-prefix=HOT-DEFAULT -; RUN: opt -function-import -summary-file %t3.thinlto.bc %t.bc -import-instr-limit=1 --S -import-hot-multiplier=3.0 | FileCheck %s --check-prefix=CHECK --check-prefix=HOT-DEFAULT +; RUN: opt -function-import -summary-file %t3.thinlto.bc %t.bc -import-instr-limit=1 --S -import-hot-multiplier=3.0 -import-cold-multiplier=0.0 | FileCheck %s --check-prefix=CHECK --check-prefix=HOT-DEFAULT + ; HOT-DEFAULT-DAG: define available_externally void @hot1() ; HOT-DEFAULT-DAG: define available_externally void @hot2() -; HOT-DEFAULT-DAG: define available_externally void @cold() ; HOT-DEFAULT-DAG: define available_externally void @none1() +; HOT-DEFAULT-NOT: define available_externally void @cold() ; HOT-DEFAULT-NOT: define available_externally void @hot3() ; HOT-DEFAULT-NOT: define available_externally void @none2() ; HOT-DEFAULT-NOT: define available_externally void @none3() @@ -20,17 +21,26 @@ ; Test import with hot multiplier 1.0 - treat hot callsites as normal. ; RUN: opt -function-import -summary-file %t3.thinlto.bc %t.bc -import-instr-limit=1 -import-hot-multiplier=1.0 --S | FileCheck %s --check-prefix=CHECK --check-prefix=HOT-ONE ; HOT-ONE-DAG: define available_externally void @hot1() -; HOT-ONE-DAG: define available_externally void @cold() ; HOT-ONE-DAG: define available_externally void @none1() +; HOT-ONE-NOT: define available_externally void @cold() ; HOT-ONE-NOT: define available_externally void @hot2() ; HOT-ONE-NOT: define available_externally void @hot3() ; HOT-ONE-NOT: define available_externally void @none2() ; HOT-ONE-NOT: define available_externally void @none3() ; HOT-ONE-NOT: define available_externally void @cold2() +; RUN: opt -function-import -summary-file %t3.thinlto.bc %t.bc -import-instr-limit=1 -import-hot-multiplier=1.0 -import-cold-multiplier=1.0 --S | FileCheck %s --check-prefix=CHECK --check-prefix=HOT-COLD-ONE +; HOT-COLD-ONE-DAG: define available_externally void @hot1() +; HOT-COLD-ONE-DAG: define available_externally void @cold() +; HOT-COLD-ONE-DAG: define available_externally void @none1() +; HOT-COLD-ONE-NOT: define available_externally void @hot2() +; HOT-COLD-ONE-NOT: define available_externally void @hot3() +; HOT-COLD-ONE-NOT: define available_externally void @none2() +; HOT-COLD-ONE-NOT: define available_externally void @none3() +; HOT-COLD-ONE-NOT: define available_externally void @cold2() ; Test import with hot multiplier 0.0 and high threshold - don't import functions called from hot callsite. -; RUN: opt -function-import -summary-file %t3.thinlto.bc %t.bc -import-instr-limit=10 -import-hot-multiplier=0.0 --S | FileCheck %s --check-prefix=CHECK --check-prefix=HOT-ZERO +; RUN: opt -function-import -summary-file %t3.thinlto.bc %t.bc -import-instr-limit=10 -import-hot-multiplier=0.0 -import-cold-multiplier=1.0 --S | FileCheck %s --check-prefix=CHECK --check-prefix=HOT-ZERO ; HOT-ZERO-DAG: define available_externally void @cold() ; HOT-ZERO-DAG: define available_externally void @none1() ; HOT-ZERO-DAG: define available_externally void @none2()