[PATCH] D113738: [LTO] Allow passing -Os/-Oz as the optimization level

2022-02-15 Thread Arthur Eubanks via Phabricator via cfe-commits
aeubanks abandoned this revision.
aeubanks added a comment.

I posted an RFC a while back for basically removing size levels from 
optimization levels but never seriously looked into it: 
https://groups.google.com/g/llvm-dev/c/NrZsR8OZTts/m/P5t14TKaAQAJ


Repository:
  rG LLVM Github Monorepo

CHANGES SINCE LAST ACTION
  https://reviews.llvm.org/D113738/new/

https://reviews.llvm.org/D113738

___
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits


[PATCH] D113738: [LTO] Allow passing -Os/-Oz as the optimization level

2022-02-14 Thread Fangrui Song via Phabricator via cfe-commits
MaskRay requested changes to this revision.
MaskRay added a comment.
This revision now requires changes to proceed.

D72404  has some comments why the -Os/-Oz 
levels are discouraged.


Repository:
  rG LLVM Github Monorepo

CHANGES SINCE LAST ACTION
  https://reviews.llvm.org/D113738/new/

https://reviews.llvm.org/D113738

___
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits


[PATCH] D113738: [LTO] Allow passing -Os/-Oz as the optimization level

2021-11-15 Thread Vincent Lee via Phabricator via cfe-commits
thevinster added inline comments.



Comment at: lld/Common/Args.cpp:29
 
+OptimizationLevel args::getOptLevel(llvm::opt::InputArgList ,
+unsigned int key,

nit: `getOptLevel` seems a bit too generic for something that's LTO specific. 
The MachO port has the concept of passing an opt level that generates more 
efficient opcodes. Suggestions are welcome here - perhaps `getLTOOptLevel` 
would be better here? 


Repository:
  rG LLVM Github Monorepo

CHANGES SINCE LAST ACTION
  https://reviews.llvm.org/D113738/new/

https://reviews.llvm.org/D113738

___
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits


[PATCH] D113738: [LTO] Allow passing -Os/-Oz as the optimization level

2021-11-12 Thread Peter Collingbourne via Phabricator via cfe-commits
pcc added a comment.

Please see D63976  where we rejected a similar 
change in favor of just letting this be controllable at compile time.

To the extent that the pass pipeline is affected by the size optimization 
level, I think we should change the passes so that they respect the 
`optsize`/`minsize` attributes.


Repository:
  rG LLVM Github Monorepo

CHANGES SINCE LAST ACTION
  https://reviews.llvm.org/D113738/new/

https://reviews.llvm.org/D113738

___
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits


[PATCH] D113738: [LTO] Allow passing -Os/-Oz as the optimization level

2021-11-12 Thread Arthur Eubanks via Phabricator via cfe-commits
aeubanks updated this revision to Diff 386882.
aeubanks added a comment.

add more tests


Repository:
  rG LLVM Github Monorepo

CHANGES SINCE LAST ACTION
  https://reviews.llvm.org/D113738/new/

https://reviews.llvm.org/D113738

Files:
  clang/lib/CodeGen/BackendUtil.cpp
  lld/COFF/Config.h
  lld/COFF/Driver.cpp
  lld/Common/Args.cpp
  lld/Common/CMakeLists.txt
  lld/ELF/Config.h
  lld/ELF/Driver.cpp
  lld/ELF/LTO.cpp
  lld/MachO/Config.h
  lld/MachO/Driver.cpp
  lld/include/lld/Common/Args.h
  lld/test/COFF/lto-opt-level.ll
  lld/test/ELF/lto/opt-level.ll
  lld/test/MachO/lto-opt-level.ll
  lld/test/wasm/lto/opt-level.ll
  lld/wasm/Config.h
  lld/wasm/Driver.cpp
  llvm/include/llvm/LTO/Config.h
  llvm/include/llvm/LTO/legacy/LTOCodeGenerator.h
  llvm/include/llvm/LTO/legacy/ThinLTOCodeGenerator.h
  llvm/include/llvm/Passes/OptimizationLevel.h
  llvm/lib/LTO/LTO.cpp
  llvm/lib/LTO/LTOBackend.cpp
  llvm/lib/LTO/LTOCodeGenerator.cpp
  llvm/lib/LTO/ThinLTOCodeGenerator.cpp
  llvm/test/tools/llvm-lto2/X86/opt-levels.ll
  llvm/test/tools/llvm-lto2/X86/slp-vectorize-pm.ll
  llvm/test/tools/lto/opt-level.ll
  llvm/tools/llvm-lto/llvm-lto.cpp
  llvm/tools/llvm-lto2/llvm-lto2.cpp
  llvm/tools/lto/lto.cpp
  llvm/utils/gn/secondary/lld/Common/BUILD.gn

Index: llvm/utils/gn/secondary/lld/Common/BUILD.gn
===
--- llvm/utils/gn/secondary/lld/Common/BUILD.gn
+++ llvm/utils/gn/secondary/lld/Common/BUILD.gn
@@ -27,6 +27,7 @@
 "//llvm/lib/IR",
 "//llvm/lib/MC",
 "//llvm/lib/Option",
+"//llvm/lib/Passes",
 "//llvm/lib/Support",
 "//llvm/lib/Target",
   ]
Index: llvm/tools/lto/lto.cpp
===
--- llvm/tools/lto/lto.cpp
+++ llvm/tools/lto/lto.cpp
@@ -23,6 +23,7 @@
 #include "llvm/LTO/legacy/LTOCodeGenerator.h"
 #include "llvm/LTO/legacy/LTOModule.h"
 #include "llvm/LTO/legacy/ThinLTOCodeGenerator.h"
+#include "llvm/Passes/OptimizationLevel.h"
 #include "llvm/Support/MemoryBuffer.h"
 #include "llvm/Support/Signals.h"
 #include "llvm/Support/TargetSelect.h"
@@ -34,12 +35,10 @@
 
 // extra command-line flags needed for LTOCodeGenerator
 static cl::opt
-OptLevel("O",
- cl::desc("Optimization level. [-O0, -O1, -O2, or -O3] "
-  "(default = '-O2')"),
- cl::Prefix,
- cl::ZeroOrMore,
- cl::init('2'));
+OptLevel("O",
+ cl::desc("Optimization level. [-O0, -O1, -O2, -O3, -Os, or -Oz] "
+  "(default = '-O2')"),
+ cl::Prefix, cl::ZeroOrMore, cl::init('2'));
 
 static cl::opt EnableFreestanding(
 "lto-freestanding", cl::init(false),
@@ -152,9 +151,10 @@
   LTOCodeGenerator *CG = unwrap(cg);
   CG->setAttrs(codegen::getMAttrs());
 
-  if (OptLevel < '0' || OptLevel > '3')
-report_fatal_error("Optimization level must be between 0 and 3");
-  CG->setOptLevel(OptLevel - '0');
+  Optional OL = OptimizationLevel::forChar(OptLevel);
+  if (!OL)
+report_fatal_error("invalid optimization level: -O" + Twine(OptLevel));
+  CG->setOptLevel(*OL);
   CG->setFreestanding(EnableFreestanding);
   CG->setDisableVerify(DisableVerify);
 }
@@ -525,20 +525,21 @@
   CodeGen->setFreestanding(EnableFreestanding);
 
   if (OptLevel.getNumOccurrences()) {
-if (OptLevel < '0' || OptLevel > '3')
-  report_fatal_error("Optimization level must be between 0 and 3");
-CodeGen->setOptLevel(OptLevel - '0');
-switch (OptLevel) {
-case '0':
+Optional OL = OptimizationLevel::forChar(OptLevel);
+if (!OL)
+  report_fatal_error("Invalid optimization level: " + Twine(OptLevel));
+CodeGen->setOptLevel(*OL);
+switch (OL->getSpeedupLevel()) {
+case 0:
   CodeGen->setCodeGenOptLevel(CodeGenOpt::None);
   break;
-case '1':
+case 1:
   CodeGen->setCodeGenOptLevel(CodeGenOpt::Less);
   break;
-case '2':
+case 2:
   CodeGen->setCodeGenOptLevel(CodeGenOpt::Default);
   break;
-case '3':
+case 3:
   CodeGen->setCodeGenOptLevel(CodeGenOpt::Aggressive);
   break;
 }
Index: llvm/tools/llvm-lto2/llvm-lto2.cpp
===
--- llvm/tools/llvm-lto2/llvm-lto2.cpp
+++ llvm/tools/llvm-lto2/llvm-lto2.cpp
@@ -20,6 +20,7 @@
 #include "llvm/Config/llvm-config.h"
 #include "llvm/IR/DiagnosticPrinter.h"
 #include "llvm/LTO/LTO.h"
+#include "llvm/Passes/OptimizationLevel.h"
 #include "llvm/Passes/PassPlugin.h"
 #include "llvm/Remarks/HotnessThresholdParser.h"
 #include "llvm/Support/Caching.h"
@@ -36,8 +37,9 @@
 static codegen::RegisterCodeGenFlags CGF;
 
 static cl::opt
-OptLevel("O", cl::desc("Optimization level. [-O0, -O1, -O2, or -O3] "
-   "(default = '-O2')"),
+OptLevel("O",
+ cl::desc("Optimization level. [-O0, -O1, -O2, -O3, -Os, or -Oz] "
+  "(default = '-O2')"),
  cl::Prefix, cl::ZeroOrMore, cl::init('2'));
 
 

[PATCH] D113738: [LTO] Allow passing -Os/-Oz as the optimization level

2021-11-12 Thread Florian Hahn via Phabricator via cfe-commits
fhahn added a comment.

Could you add tests on the LLVM side for the new options as well? See also 
D95541 


Repository:
  rG LLVM Github Monorepo

CHANGES SINCE LAST ACTION
  https://reviews.llvm.org/D113738/new/

https://reviews.llvm.org/D113738

___
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits


[PATCH] D113738: [LTO] Allow passing -Os/-Oz as the optimization level

2021-11-11 Thread Arthur Eubanks via Phabricator via cfe-commits
aeubanks updated this revision to Diff 386748.
aeubanks added a comment.

update


Repository:
  rG LLVM Github Monorepo

CHANGES SINCE LAST ACTION
  https://reviews.llvm.org/D113738/new/

https://reviews.llvm.org/D113738

Files:
  clang/lib/CodeGen/BackendUtil.cpp
  lld/COFF/Config.h
  lld/COFF/Driver.cpp
  lld/Common/Args.cpp
  lld/Common/CMakeLists.txt
  lld/ELF/Config.h
  lld/ELF/Driver.cpp
  lld/ELF/LTO.cpp
  lld/MachO/Config.h
  lld/MachO/Driver.cpp
  lld/include/lld/Common/Args.h
  lld/test/COFF/lto-opt-level.ll
  lld/test/ELF/lto/opt-level.ll
  lld/test/MachO/lto-opt-level.ll
  lld/test/wasm/lto/opt-level.ll
  lld/wasm/Config.h
  lld/wasm/Driver.cpp
  llvm/include/llvm/LTO/Config.h
  llvm/include/llvm/LTO/legacy/LTOCodeGenerator.h
  llvm/include/llvm/LTO/legacy/ThinLTOCodeGenerator.h
  llvm/include/llvm/Passes/OptimizationLevel.h
  llvm/lib/LTO/LTO.cpp
  llvm/lib/LTO/LTOBackend.cpp
  llvm/lib/LTO/LTOCodeGenerator.cpp
  llvm/lib/LTO/ThinLTOCodeGenerator.cpp
  llvm/tools/llvm-lto/llvm-lto.cpp
  llvm/tools/llvm-lto2/llvm-lto2.cpp
  llvm/tools/lto/lto.cpp
  llvm/utils/gn/secondary/lld/Common/BUILD.gn

Index: llvm/utils/gn/secondary/lld/Common/BUILD.gn
===
--- llvm/utils/gn/secondary/lld/Common/BUILD.gn
+++ llvm/utils/gn/secondary/lld/Common/BUILD.gn
@@ -27,6 +27,7 @@
 "//llvm/lib/IR",
 "//llvm/lib/MC",
 "//llvm/lib/Option",
+"//llvm/lib/Passes",
 "//llvm/lib/Support",
 "//llvm/lib/Target",
   ]
Index: llvm/tools/lto/lto.cpp
===
--- llvm/tools/lto/lto.cpp
+++ llvm/tools/lto/lto.cpp
@@ -23,6 +23,7 @@
 #include "llvm/LTO/legacy/LTOCodeGenerator.h"
 #include "llvm/LTO/legacy/LTOModule.h"
 #include "llvm/LTO/legacy/ThinLTOCodeGenerator.h"
+#include "llvm/Passes/OptimizationLevel.h"
 #include "llvm/Support/MemoryBuffer.h"
 #include "llvm/Support/Signals.h"
 #include "llvm/Support/TargetSelect.h"
@@ -34,12 +35,10 @@
 
 // extra command-line flags needed for LTOCodeGenerator
 static cl::opt
-OptLevel("O",
- cl::desc("Optimization level. [-O0, -O1, -O2, or -O3] "
-  "(default = '-O2')"),
- cl::Prefix,
- cl::ZeroOrMore,
- cl::init('2'));
+OptLevel("O",
+ cl::desc("Optimization level. [-O0, -O1, -O2, -O3, -Os, or -Oz] "
+  "(default = '-O2')"),
+ cl::Prefix, cl::ZeroOrMore, cl::init('2'));
 
 static cl::opt EnableFreestanding(
 "lto-freestanding", cl::init(false),
@@ -152,9 +151,10 @@
   LTOCodeGenerator *CG = unwrap(cg);
   CG->setAttrs(codegen::getMAttrs());
 
-  if (OptLevel < '0' || OptLevel > '3')
-report_fatal_error("Optimization level must be between 0 and 3");
-  CG->setOptLevel(OptLevel - '0');
+  Optional OL = OptimizationLevel::forChar(OptLevel);
+  if (!OL)
+report_fatal_error("invalid optimization level: -O" + Twine(OptLevel));
+  CG->setOptLevel(*OL);
   CG->setFreestanding(EnableFreestanding);
   CG->setDisableVerify(DisableVerify);
 }
@@ -525,20 +525,21 @@
   CodeGen->setFreestanding(EnableFreestanding);
 
   if (OptLevel.getNumOccurrences()) {
-if (OptLevel < '0' || OptLevel > '3')
-  report_fatal_error("Optimization level must be between 0 and 3");
-CodeGen->setOptLevel(OptLevel - '0');
-switch (OptLevel) {
-case '0':
+Optional OL = OptimizationLevel::forChar(OptLevel);
+if (!OL)
+  report_fatal_error("Invalid optimization level: " + Twine(OptLevel));
+CodeGen->setOptLevel(*OL);
+switch (OL->getSpeedupLevel()) {
+case 0:
   CodeGen->setCodeGenOptLevel(CodeGenOpt::None);
   break;
-case '1':
+case 1:
   CodeGen->setCodeGenOptLevel(CodeGenOpt::Less);
   break;
-case '2':
+case 2:
   CodeGen->setCodeGenOptLevel(CodeGenOpt::Default);
   break;
-case '3':
+case 3:
   CodeGen->setCodeGenOptLevel(CodeGenOpt::Aggressive);
   break;
 }
Index: llvm/tools/llvm-lto2/llvm-lto2.cpp
===
--- llvm/tools/llvm-lto2/llvm-lto2.cpp
+++ llvm/tools/llvm-lto2/llvm-lto2.cpp
@@ -20,6 +20,7 @@
 #include "llvm/Config/llvm-config.h"
 #include "llvm/IR/DiagnosticPrinter.h"
 #include "llvm/LTO/LTO.h"
+#include "llvm/Passes/OptimizationLevel.h"
 #include "llvm/Passes/PassPlugin.h"
 #include "llvm/Remarks/HotnessThresholdParser.h"
 #include "llvm/Support/Caching.h"
@@ -36,8 +37,9 @@
 static codegen::RegisterCodeGenFlags CGF;
 
 static cl::opt
-OptLevel("O", cl::desc("Optimization level. [-O0, -O1, -O2, or -O3] "
-   "(default = '-O2')"),
+OptLevel("O",
+ cl::desc("Optimization level. [-O0, -O1, -O2, -O3, -Os, or -Oz] "
+  "(default = '-O2')"),
  cl::Prefix, cl::ZeroOrMore, cl::init('2'));
 
 static cl::opt CGOptLevel(
@@ -272,7 +274,12 @@
   Conf.OptPipeline = OptPipeline;
   Conf.AAPipeline = AAPipeline;
 
-  Conf.OptLevel = 

[PATCH] D113738: [LTO] Allow passing -Os/-Oz as the optimization level

2021-11-11 Thread Arthur Eubanks via Phabricator via cfe-commits
aeubanks created this revision.
Herald added subscribers: ormris, steven_wu, hiraditya, arichardson, inglorion, 
sbc100, mgorny, emaste.
Herald added a reviewer: MaskRay.
Herald added a reviewer: gkm.
Herald added a project: lld-macho.
Herald added a reviewer: lld-macho.
aeubanks requested review of this revision.
Herald added subscribers: llvm-commits, cfe-commits, aheejin.
Herald added projects: clang, LLVM.

Repository:
  rG LLVM Github Monorepo

https://reviews.llvm.org/D113738

Files:
  clang/lib/CodeGen/BackendUtil.cpp
  lld/COFF/Config.h
  lld/COFF/Driver.cpp
  lld/Common/Args.cpp
  lld/Common/CMakeLists.txt
  lld/ELF/Config.h
  lld/ELF/Driver.cpp
  lld/ELF/LTO.cpp
  lld/MachO/Config.h
  lld/MachO/Driver.cpp
  lld/include/lld/Common/Args.h
  lld/test/COFF/lto-opt-level.ll
  lld/test/ELF/lto/opt-level.ll
  lld/test/MachO/lto-opt-level.ll
  lld/test/wasm/lto/opt-level.ll
  lld/wasm/Config.h
  lld/wasm/Driver.cpp
  llvm/include/llvm/LTO/Config.h
  llvm/include/llvm/LTO/legacy/LTOCodeGenerator.h
  llvm/include/llvm/LTO/legacy/ThinLTOCodeGenerator.h
  llvm/include/llvm/Passes/OptimizationLevel.h
  llvm/lib/LTO/LTO.cpp
  llvm/lib/LTO/LTOBackend.cpp
  llvm/lib/LTO/LTOCodeGenerator.cpp
  llvm/lib/LTO/ThinLTOCodeGenerator.cpp
  llvm/tools/llvm-lto/llvm-lto.cpp
  llvm/tools/llvm-lto2/llvm-lto2.cpp
  llvm/tools/lto/lto.cpp
  llvm/utils/gn/secondary/lld/Common/BUILD.gn

Index: llvm/utils/gn/secondary/lld/Common/BUILD.gn
===
--- llvm/utils/gn/secondary/lld/Common/BUILD.gn
+++ llvm/utils/gn/secondary/lld/Common/BUILD.gn
@@ -27,6 +27,7 @@
 "//llvm/lib/IR",
 "//llvm/lib/MC",
 "//llvm/lib/Option",
+"//llvm/lib/Passes",
 "//llvm/lib/Support",
 "//llvm/lib/Target",
   ]
Index: llvm/tools/lto/lto.cpp
===
--- llvm/tools/lto/lto.cpp
+++ llvm/tools/lto/lto.cpp
@@ -23,6 +23,7 @@
 #include "llvm/LTO/legacy/LTOCodeGenerator.h"
 #include "llvm/LTO/legacy/LTOModule.h"
 #include "llvm/LTO/legacy/ThinLTOCodeGenerator.h"
+#include "llvm/Passes/OptimizationLevel.h"
 #include "llvm/Support/MemoryBuffer.h"
 #include "llvm/Support/Signals.h"
 #include "llvm/Support/TargetSelect.h"
@@ -34,12 +35,10 @@
 
 // extra command-line flags needed for LTOCodeGenerator
 static cl::opt
-OptLevel("O",
- cl::desc("Optimization level. [-O0, -O1, -O2, or -O3] "
-  "(default = '-O2')"),
- cl::Prefix,
- cl::ZeroOrMore,
- cl::init('2'));
+OptLevel("O",
+ cl::desc("Optimization level. [-O0, -O1, -O2, -O3, -Os, or -Oz] "
+  "(default = '-O2')"),
+ cl::Prefix, cl::ZeroOrMore, cl::init('2'));
 
 static cl::opt EnableFreestanding(
 "lto-freestanding", cl::init(false),
@@ -152,9 +151,10 @@
   LTOCodeGenerator *CG = unwrap(cg);
   CG->setAttrs(codegen::getMAttrs());
 
-  if (OptLevel < '0' || OptLevel > '3')
-report_fatal_error("Optimization level must be between 0 and 3");
-  CG->setOptLevel(OptLevel - '0');
+  Optional OL = OptimizationLevel::forChar(OptLevel);
+  if (!OL)
+report_fatal_error("invalid optimization level: -O" + Twine(OptLevel));
+  CG->setOptLevel(*OL);
   CG->setFreestanding(EnableFreestanding);
   CG->setDisableVerify(DisableVerify);
 }
@@ -525,20 +525,21 @@
   CodeGen->setFreestanding(EnableFreestanding);
 
   if (OptLevel.getNumOccurrences()) {
-if (OptLevel < '0' || OptLevel > '3')
-  report_fatal_error("Optimization level must be between 0 and 3");
-CodeGen->setOptLevel(OptLevel - '0');
-switch (OptLevel) {
-case '0':
+Optional OL = OptimizationLevel::forChar(OptLevel);
+if (!OL)
+  report_fatal_error("Invalid optimization level: " + Twine(OptLevel));
+CodeGen->setOptLevel(*OL);
+switch (OL->getSpeedupLevel()) {
+case 0:
   CodeGen->setCodeGenOptLevel(CodeGenOpt::None);
   break;
-case '1':
+case 1:
   CodeGen->setCodeGenOptLevel(CodeGenOpt::Less);
   break;
-case '2':
+case 2:
   CodeGen->setCodeGenOptLevel(CodeGenOpt::Default);
   break;
-case '3':
+case 3:
   CodeGen->setCodeGenOptLevel(CodeGenOpt::Aggressive);
   break;
 }
Index: llvm/tools/llvm-lto2/llvm-lto2.cpp
===
--- llvm/tools/llvm-lto2/llvm-lto2.cpp
+++ llvm/tools/llvm-lto2/llvm-lto2.cpp
@@ -20,6 +20,7 @@
 #include "llvm/Config/llvm-config.h"
 #include "llvm/IR/DiagnosticPrinter.h"
 #include "llvm/LTO/LTO.h"
+#include "llvm/Passes/OptimizationLevel.h"
 #include "llvm/Passes/PassPlugin.h"
 #include "llvm/Remarks/HotnessThresholdParser.h"
 #include "llvm/Support/Caching.h"
@@ -36,8 +37,9 @@
 static codegen::RegisterCodeGenFlags CGF;
 
 static cl::opt
-OptLevel("O", cl::desc("Optimization level. [-O0, -O1, -O2, or -O3] "
-   "(default = '-O2')"),
+OptLevel("O",
+ cl::desc("Optimization level. [-O0, -O1, -O2, -O3,