Skip to content

Commit 0af4ac7

Browse files
authored
[Driver] Allow for -O3 on Windows using clang-cl (#12504)
We currently support -O3 for Linux compilations, expand this to also be available on Windows. This also better aligns with our existing product offerings.
1 parent f7a360d commit 0af4ac7

File tree

4 files changed

+20
-8
lines changed

4 files changed

+20
-8
lines changed

clang/include/clang/Driver/Options.td

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8404,6 +8404,9 @@ def : CLFlag<"O1">, Alias<_SLASH_O>, AliasArgs<["1"]>,
84048404
HelpText<"Optimize for size (like /Og /Os /Oy /Ob2 /GF /Gy)">;
84058405
def : CLFlag<"O2">, Alias<_SLASH_O>, AliasArgs<["2"]>,
84068406
HelpText<"Optimize for speed (like /Og /Oi /Ot /Oy /Ob2 /GF /Gy)">;
8407+
def : CLFlag<"O3">, Alias<_SLASH_O>, AliasArgs<["3"]>,
8408+
HelpText<"Optimize for maximum speed and enable more aggressive optimizations"
8409+
" that may not improve performance on some programs">;
84078410
def : CLFlag<"Ob0">, Alias<_SLASH_O>, AliasArgs<["b0"]>,
84088411
HelpText<"Disable function inlining">;
84098412
def : CLFlag<"Ob1">, Alias<_SLASH_O>, AliasArgs<["b1"]>,

clang/lib/Driver/ToolChains/MSVC.cpp

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -930,6 +930,7 @@ static void TranslateOptArg(Arg *A, llvm::opt::DerivedArgList &DAL,
930930
break;
931931
case '1':
932932
case '2':
933+
case '3':
933934
case 'x':
934935
case 'd':
935936
// Ignore /O[12xd] flags that aren't the last one on the command line.
@@ -946,11 +947,14 @@ static void TranslateOptArg(Arg *A, llvm::opt::DerivedArgList &DAL,
946947
} else if (OptChar == '2' || OptChar == 'x') {
947948
DAL.AddFlagArg(A, Opts.getOption(options::OPT_fbuiltin));
948949
DAL.AddJoinedArg(A, Opts.getOption(options::OPT_O), "2");
950+
} else if (OptChar == '3') {
951+
DAL.AddFlagArg(A, Opts.getOption(options::OPT_fbuiltin));
952+
DAL.AddJoinedArg(A, Opts.getOption(options::OPT_O), "3");
949953
}
950954
if (SupportsForcingFramePointer &&
951955
!DAL.hasArgNoClaim(options::OPT_fno_omit_frame_pointer))
952956
DAL.AddFlagArg(A, Opts.getOption(options::OPT_fomit_frame_pointer));
953-
if (OptChar == '1' || OptChar == '2')
957+
if (OptChar == '1' || OptChar == '2' || OptChar == '3')
954958
DAL.AddFlagArg(A, Opts.getOption(options::OPT_ffunction_sections));
955959
}
956960
break;
@@ -1070,7 +1074,8 @@ MSVCToolChain::TranslateArgs(const llvm::opt::DerivedArgList &Args,
10701074
// OptChar does not expand; it's an argument to the previous char.
10711075
continue;
10721076
}
1073-
if (OptChar == '1' || OptChar == '2' || OptChar == 'x' || OptChar == 'd')
1077+
if (OptChar == '1' || OptChar == '2' || OptChar == 'x' ||
1078+
OptChar == 'd' || OptChar == '3')
10741079
ExpandChar = OptStr.data() + I;
10751080
}
10761081
}

clang/test/Driver/Xarch.c

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,10 @@
1-
// RUN: %clang -target i386-apple-darwin11 -m32 -Xarch_i386 -O3 %s -S -### 2>&1 | FileCheck -check-prefix=O3ONCE %s
2-
// O3ONCE: "-O3"
3-
// O3ONCE-NOT: "-O3"
1+
// RUN: %clang -target i386-apple-darwin11 -m32 -Xarch_i386 -O5 %s -S -### 2>&1 | FileCheck -check-prefix=O5ONCE %s
2+
// O5ONCE: "-O5"
3+
// O5ONCE-NOT: "-O5"
44

5-
// RUN: %clang -target i386-apple-darwin11 -m64 -Xarch_i386 -O3 %s -S -### 2>&1 | FileCheck -check-prefix=O3NONE %s
6-
// O3NONE-NOT: "-O3"
7-
// O3NONE: argument unused during compilation: '-Xarch_i386 -O3'
5+
// RUN: %clang -target i386-apple-darwin11 -m64 -Xarch_i386 -O5 %s -S -### 2>&1 | FileCheck -check-prefix=O5NONE %s
6+
// O5NONE-NOT: "-O5"
7+
// O5NONE: argument unused during compilation: '-Xarch_i386 -O5'
88

99
// RUN: not %clang -target i386-apple-darwin11 -m32 -Xarch_i386 -o -Xarch_i386 -S %s -S -Xarch_i386 -o 2>&1 | FileCheck -check-prefix=INVALID %s
1010
// INVALID: error: invalid Xarch argument: '-Xarch_i386 -o'

clang/test/Driver/cl-options.c

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -207,6 +207,10 @@
207207
// RUN: %clang_cl --target=i686-pc-win32 -Werror -Wno-msvc-not-found /O2 /O2 -### -- %s 2>&1 | FileCheck -check-prefix=O2O2 %s
208208
// O2O2: "-O2"
209209

210+
// RUN: %clang_cl --target=i686-pc-win32 -Werror -Wno-msvc-not-found /O3 -### -- %s 2>&1 | FileCheck -check-prefix=O3 %s
211+
// O3: -mframe-pointer=none
212+
// O3: -O3
213+
210214
// RUN: %clang_cl /Zs -Werror /Oy -- %s 2>&1
211215

212216
// RUN: %clang_cl --target=i686-pc-win32 -Werror -Wno-msvc-not-found /Oy- -### -- %s 2>&1 | FileCheck -check-prefix=Oy_ %s

0 commit comments

Comments
 (0)