Skip to content

Commit cd5cbb9

Browse files
rikhuijzermatthias-springerjoker-ephubfx
authored andcommitted
[mlir][tensor] Document dest operand (llvm#71726)
Based on the tips from @ubfx and @joker-eph in llvm#70030, this patch suggest to introduce the `dest` operand in the `tensor` dialect description. To do so, this patch also suggests to move some things around to make it more clear how the paragraphs relate to each other. --------- Co-authored-by: Matthias Springer <[email protected]> Co-authored-by: Mehdi Amini <[email protected]> Co-authored-by: Felix Schneider <[email protected]>
1 parent 379e890 commit cd5cbb9

File tree

22 files changed

+325
-162
lines changed

22 files changed

+325
-162
lines changed

clang/include/clang/Driver/Options.td

Lines changed: 9 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -3147,7 +3147,8 @@ def fno_ms_compatibility : Flag<["-"], "fno-ms-compatibility">, Group<f_Group>,
31473147
def fno_objc_legacy_dispatch : Flag<["-"], "fno-objc-legacy-dispatch">, Group<f_Group>;
31483148
def fno_objc_weak : Flag<["-"], "fno-objc-weak">, Group<f_Group>,
31493149
Visibility<[ClangOption, CC1Option]>;
3150-
def fno_omit_frame_pointer : Flag<["-"], "fno-omit-frame-pointer">, Group<f_Group>;
3150+
def fno_omit_frame_pointer : Flag<["-"], "fno-omit-frame-pointer">, Group<f_Group>,
3151+
Visibility<[ClangOption, FlangOption]>;
31513152
defm operator_names : BoolFOption<"operator-names",
31523153
LangOpts<"CXXOperatorNames">, Default<cplusplus.KeyPath>,
31533154
NegFlag<SetFalse, [], [ClangOption, CC1Option],
@@ -3273,6 +3274,7 @@ defm objc_avoid_heapify_local_blocks : BoolFOption<"objc-avoid-heapify-local-blo
32733274
BothFlags<[], [CC1Option], " to avoid heapifying local blocks">>;
32743275

32753276
def fomit_frame_pointer : Flag<["-"], "fomit-frame-pointer">, Group<f_Group>,
3277+
Visibility<[ClangOption, FlangOption]>,
32763278
HelpText<"Omit the frame pointer from functions that don't need it. "
32773279
"Some stack unwinding cases, such as profilers and sanitizers, may prefer specifying -fno-omit-frame-pointer. "
32783280
"On many targets, -O1 and higher omit the frame pointer by default. "
@@ -6752,10 +6754,7 @@ def new_struct_path_tbaa : Flag<["-"], "new-struct-path-tbaa">,
67526754
def mdebug_pass : Separate<["-"], "mdebug-pass">,
67536755
HelpText<"Enable additional debug output">,
67546756
MarshallingInfoString<CodeGenOpts<"DebugPass">>;
6755-
def mframe_pointer_EQ : Joined<["-"], "mframe-pointer=">,
6756-
HelpText<"Specify which frame pointers to retain.">, Values<"all,non-leaf,none">,
6757-
NormalizedValuesScope<"CodeGenOptions::FramePointerKind">, NormalizedValues<["All", "NonLeaf", "None"]>,
6758-
MarshallingInfoEnum<CodeGenOpts<"FramePointer">, "None">;
6757+
67596758
def mabi_EQ_ieeelongdouble : Flag<["-"], "mabi=ieeelongdouble">,
67606759
HelpText<"Use IEEE 754 quadruple-precision for long double">,
67616760
MarshallingInfoFlag<LangOpts<"PPCIEEELongDouble">>;
@@ -7368,6 +7367,11 @@ def pic_level : Separate<["-"], "pic-level">,
73687367
def pic_is_pie : Flag<["-"], "pic-is-pie">,
73697368
HelpText<"File is for a position independent executable">,
73707369
MarshallingInfoFlag<LangOpts<"PIE">>;
7370+
7371+
def mframe_pointer_EQ : Joined<["-"], "mframe-pointer=">,
7372+
HelpText<"Specify which frame pointers to retain.">, Values<"all,non-leaf,none">,
7373+
NormalizedValuesScope<"CodeGenOptions::FramePointerKind">, NormalizedValues<["All", "NonLeaf", "None"]>,
7374+
MarshallingInfoEnum<CodeGenOpts<"FramePointer">, "None">;
73717375

73727376
} // let Visibility = [CC1Option, FC1Option]
73737377

clang/lib/Driver/ToolChains/Clang.cpp

Lines changed: 0 additions & 133 deletions
Original file line numberDiff line numberDiff line change
@@ -409,139 +409,6 @@ static bool ShouldEnableAutolink(const ArgList &Args, const ToolChain &TC,
409409
Default);
410410
}
411411

412-
static bool mustUseNonLeafFramePointerForTarget(const llvm::Triple &Triple) {
413-
switch (Triple.getArch()){
414-
default:
415-
return false;
416-
case llvm::Triple::arm:
417-
case llvm::Triple::thumb:
418-
// ARM Darwin targets require a frame pointer to be always present to aid
419-
// offline debugging via backtraces.
420-
return Triple.isOSDarwin();
421-
}
422-
}
423-
424-
static bool useFramePointerForTargetByDefault(const ArgList &Args,
425-
const llvm::Triple &Triple) {
426-
if (Args.hasArg(options::OPT_pg) && !Args.hasArg(options::OPT_mfentry))
427-
return true;
428-
429-
if (Triple.isAndroid()) {
430-
switch (Triple.getArch()) {
431-
case llvm::Triple::aarch64:
432-
case llvm::Triple::arm:
433-
case llvm::Triple::armeb:
434-
case llvm::Triple::thumb:
435-
case llvm::Triple::thumbeb:
436-
case llvm::Triple::riscv64:
437-
return true;
438-
default:
439-
break;
440-
}
441-
}
442-
443-
switch (Triple.getArch()) {
444-
case llvm::Triple::xcore:
445-
case llvm::Triple::wasm32:
446-
case llvm::Triple::wasm64:
447-
case llvm::Triple::msp430:
448-
// XCore never wants frame pointers, regardless of OS.
449-
// WebAssembly never wants frame pointers.
450-
return false;
451-
case llvm::Triple::ppc:
452-
case llvm::Triple::ppcle:
453-
case llvm::Triple::ppc64:
454-
case llvm::Triple::ppc64le:
455-
case llvm::Triple::riscv32:
456-
case llvm::Triple::riscv64:
457-
case llvm::Triple::sparc:
458-
case llvm::Triple::sparcel:
459-
case llvm::Triple::sparcv9:
460-
case llvm::Triple::amdgcn:
461-
case llvm::Triple::r600:
462-
case llvm::Triple::csky:
463-
case llvm::Triple::loongarch32:
464-
case llvm::Triple::loongarch64:
465-
return !areOptimizationsEnabled(Args);
466-
default:
467-
break;
468-
}
469-
470-
if (Triple.isOSFuchsia() || Triple.isOSNetBSD()) {
471-
return !areOptimizationsEnabled(Args);
472-
}
473-
474-
if (Triple.isOSLinux() || Triple.isOSHurd()) {
475-
switch (Triple.getArch()) {
476-
// Don't use a frame pointer on linux if optimizing for certain targets.
477-
case llvm::Triple::arm:
478-
case llvm::Triple::armeb:
479-
case llvm::Triple::thumb:
480-
case llvm::Triple::thumbeb:
481-
case llvm::Triple::mips64:
482-
case llvm::Triple::mips64el:
483-
case llvm::Triple::mips:
484-
case llvm::Triple::mipsel:
485-
case llvm::Triple::systemz:
486-
case llvm::Triple::x86:
487-
case llvm::Triple::x86_64:
488-
return !areOptimizationsEnabled(Args);
489-
default:
490-
return true;
491-
}
492-
}
493-
494-
if (Triple.isOSWindows()) {
495-
switch (Triple.getArch()) {
496-
case llvm::Triple::x86:
497-
return !areOptimizationsEnabled(Args);
498-
case llvm::Triple::x86_64:
499-
return Triple.isOSBinFormatMachO();
500-
case llvm::Triple::arm:
501-
case llvm::Triple::thumb:
502-
// Windows on ARM builds with FPO disabled to aid fast stack walking
503-
return true;
504-
default:
505-
// All other supported Windows ISAs use xdata unwind information, so frame
506-
// pointers are not generally useful.
507-
return false;
508-
}
509-
}
510-
511-
return true;
512-
}
513-
514-
static CodeGenOptions::FramePointerKind
515-
getFramePointerKind(const ArgList &Args, const llvm::Triple &Triple) {
516-
// We have 4 states:
517-
//
518-
// 00) leaf retained, non-leaf retained
519-
// 01) leaf retained, non-leaf omitted (this is invalid)
520-
// 10) leaf omitted, non-leaf retained
521-
// (what -momit-leaf-frame-pointer was designed for)
522-
// 11) leaf omitted, non-leaf omitted
523-
//
524-
// "omit" options taking precedence over "no-omit" options is the only way
525-
// to make 3 valid states representable
526-
Arg *A = Args.getLastArg(options::OPT_fomit_frame_pointer,
527-
options::OPT_fno_omit_frame_pointer);
528-
bool OmitFP = A && A->getOption().matches(options::OPT_fomit_frame_pointer);
529-
bool NoOmitFP =
530-
A && A->getOption().matches(options::OPT_fno_omit_frame_pointer);
531-
bool OmitLeafFP =
532-
Args.hasFlag(options::OPT_momit_leaf_frame_pointer,
533-
options::OPT_mno_omit_leaf_frame_pointer,
534-
Triple.isAArch64() || Triple.isPS() || Triple.isVE() ||
535-
(Triple.isAndroid() && Triple.isRISCV64()));
536-
if (NoOmitFP || mustUseNonLeafFramePointerForTarget(Triple) ||
537-
(!OmitFP && useFramePointerForTargetByDefault(Args, Triple))) {
538-
if (OmitLeafFP)
539-
return CodeGenOptions::FramePointerKind::NonLeaf;
540-
return CodeGenOptions::FramePointerKind::All;
541-
}
542-
return CodeGenOptions::FramePointerKind::None;
543-
}
544-
545412
/// Add a CC1 option to specify the debug compilation directory.
546413
static const char *addDebugCompDirArg(const ArgList &Args,
547414
ArgStringList &CmdArgs,

clang/lib/Driver/ToolChains/CommonArgs.cpp

Lines changed: 141 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@
2424
#include "MSP430.h"
2525
#include "Solaris.h"
2626
#include "clang/Basic/CharInfo.h"
27+
#include "clang/Basic/CodeGenOptions.h"
2728
#include "clang/Basic/LangOptions.h"
2829
#include "clang/Basic/ObjCRuntime.h"
2930
#include "clang/Basic/Version.h"
@@ -71,6 +72,146 @@ using namespace clang::driver::tools;
7172
using namespace clang;
7273
using namespace llvm::opt;
7374

75+
static bool useFramePointerForTargetByDefault(const llvm::opt::ArgList &Args,
76+
const llvm::Triple &Triple) {
77+
if (Args.hasArg(clang::driver::options::OPT_pg) &&
78+
!Args.hasArg(clang::driver::options::OPT_mfentry))
79+
return true;
80+
81+
if (Triple.isAndroid()) {
82+
switch (Triple.getArch()) {
83+
case llvm::Triple::aarch64:
84+
case llvm::Triple::arm:
85+
case llvm::Triple::armeb:
86+
case llvm::Triple::thumb:
87+
case llvm::Triple::thumbeb:
88+
case llvm::Triple::riscv64:
89+
return true;
90+
default:
91+
break;
92+
}
93+
}
94+
95+
switch (Triple.getArch()) {
96+
case llvm::Triple::xcore:
97+
case llvm::Triple::wasm32:
98+
case llvm::Triple::wasm64:
99+
case llvm::Triple::msp430:
100+
// XCore never wants frame pointers, regardless of OS.
101+
// WebAssembly never wants frame pointers.
102+
return false;
103+
case llvm::Triple::ppc:
104+
case llvm::Triple::ppcle:
105+
case llvm::Triple::ppc64:
106+
case llvm::Triple::ppc64le:
107+
case llvm::Triple::riscv32:
108+
case llvm::Triple::riscv64:
109+
case llvm::Triple::sparc:
110+
case llvm::Triple::sparcel:
111+
case llvm::Triple::sparcv9:
112+
case llvm::Triple::amdgcn:
113+
case llvm::Triple::r600:
114+
case llvm::Triple::csky:
115+
case llvm::Triple::loongarch32:
116+
case llvm::Triple::loongarch64:
117+
return !clang::driver::tools::areOptimizationsEnabled(Args);
118+
default:
119+
break;
120+
}
121+
122+
if (Triple.isOSFuchsia() || Triple.isOSNetBSD()) {
123+
return !clang::driver::tools::areOptimizationsEnabled(Args);
124+
}
125+
126+
//if (Triple.isOSLinux() || Triple.getOS() == llvm::Triple::CloudABI ||
127+
if (Triple.isOSLinux() || Triple.isOSHurd()) {
128+
switch (Triple.getArch()) {
129+
// Don't use a frame pointer on linux if optimizing for certain targets.
130+
case llvm::Triple::arm:
131+
case llvm::Triple::armeb:
132+
case llvm::Triple::thumb:
133+
case llvm::Triple::thumbeb:
134+
case llvm::Triple::mips64:
135+
case llvm::Triple::mips64el:
136+
case llvm::Triple::mips:
137+
case llvm::Triple::mipsel:
138+
case llvm::Triple::systemz:
139+
case llvm::Triple::x86:
140+
case llvm::Triple::x86_64:
141+
return !clang::driver::tools::areOptimizationsEnabled(Args);
142+
default:
143+
return true;
144+
}
145+
}
146+
147+
if (Triple.isOSWindows()) {
148+
switch (Triple.getArch()) {
149+
case llvm::Triple::x86:
150+
return !clang::driver::tools::areOptimizationsEnabled(Args);
151+
case llvm::Triple::x86_64:
152+
return Triple.isOSBinFormatMachO();
153+
case llvm::Triple::arm:
154+
case llvm::Triple::thumb:
155+
// Windows on ARM builds with FPO disabled to aid fast stack walking
156+
return true;
157+
default:
158+
// All other supported Windows ISAs use xdata unwind information, so frame
159+
// pointers are not generally useful.
160+
return false;
161+
}
162+
}
163+
164+
return true;
165+
}
166+
167+
static bool mustUseNonLeafFramePointerForTarget(const llvm::Triple &Triple) {
168+
switch (Triple.getArch()) {
169+
default:
170+
return false;
171+
case llvm::Triple::arm:
172+
case llvm::Triple::thumb:
173+
// ARM Darwin targets require a frame pointer to be always present to aid
174+
// offline debugging via backtraces.
175+
return Triple.isOSDarwin();
176+
}
177+
}
178+
179+
clang::CodeGenOptions::FramePointerKind
180+
getFramePointerKind(const llvm::opt::ArgList &Args,
181+
const llvm::Triple &Triple) {
182+
// We have 4 states:
183+
//
184+
// 00) leaf retained, non-leaf retained
185+
// 01) leaf retained, non-leaf omitted (this is invalid)
186+
// 10) leaf omitted, non-leaf retained
187+
// (what -momit-leaf-frame-pointer was designed for)
188+
// 11) leaf omitted, non-leaf omitted
189+
//
190+
// "omit" options taking precedence over "no-omit" options is the only way
191+
// to make 3 valid states representable
192+
llvm::opt::Arg *A =
193+
Args.getLastArg(clang::driver::options::OPT_fomit_frame_pointer,
194+
clang::driver::options::OPT_fno_omit_frame_pointer);
195+
196+
bool OmitFP = A && A->getOption().matches(
197+
clang::driver::options::OPT_fomit_frame_pointer);
198+
bool NoOmitFP = A && A->getOption().matches(
199+
clang::driver::options::OPT_fno_omit_frame_pointer);
200+
bool OmitLeafFP =
201+
Args.hasFlag(clang::driver::options::OPT_momit_leaf_frame_pointer,
202+
clang::driver::options::OPT_mno_omit_leaf_frame_pointer,
203+
Triple.isAArch64() || Triple.isPS() || Triple.isVE() ||
204+
(Triple.isAndroid() && Triple.isRISCV64()));
205+
if (NoOmitFP || mustUseNonLeafFramePointerForTarget(Triple) ||
206+
(!OmitFP && useFramePointerForTargetByDefault(Args, Triple))) {
207+
if (OmitLeafFP)
208+
return clang::CodeGenOptions::FramePointerKind::NonLeaf;
209+
return clang::CodeGenOptions::FramePointerKind::All;
210+
}
211+
return clang::CodeGenOptions::FramePointerKind::None;
212+
}
213+
214+
74215
static void renderRpassOptions(const ArgList &Args, ArgStringList &CmdArgs,
75216
const StringRef PluginOptPrefix) {
76217
if (const Arg *A = Args.getLastArg(options::OPT_Rpass_EQ))

clang/lib/Driver/ToolChains/CommonArgs.h

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@
99
#ifndef LLVM_CLANG_LIB_DRIVER_TOOLCHAINS_COMMONARGS_H
1010
#define LLVM_CLANG_LIB_DRIVER_TOOLCHAINS_COMMONARGS_H
1111

12+
#include "clang/Basic/CodeGenOptions.h"
1213
#include "clang/Driver/Driver.h"
1314
#include "clang/Driver/InputInfo.h"
1415
#include "clang/Driver/Multilib.h"
@@ -215,4 +216,7 @@ void addOpenMPDeviceRTL(const Driver &D, const llvm::opt::ArgList &DriverArgs,
215216
} // end namespace driver
216217
} // end namespace clang
217218

219+
clang::CodeGenOptions::FramePointerKind getFramePointerKind(
220+
const llvm::opt::ArgList &Args, const llvm::Triple &Triple);
221+
218222
#endif // LLVM_CLANG_LIB_DRIVER_TOOLCHAINS_COMMONARGS_H

clang/lib/Driver/ToolChains/Flang.cpp

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@
99
#include "Flang.h"
1010
#include "CommonArgs.h"
1111

12+
#include "clang/Basic/CodeGenOptions.h"
1213
#include "clang/Driver/Options.h"
1314
#include "llvm/Frontend/Debug/Options.h"
1415
#include "llvm/Support/FileSystem.h"
@@ -606,6 +607,24 @@ void Flang::ConstructJob(Compilation &C, const JobAction &JA,
606607
// Forward -Xflang arguments to -fc1
607608
Args.AddAllArgValues(CmdArgs, options::OPT_Xflang);
608609

610+
CodeGenOptions::FramePointerKind FPKeepKind =
611+
getFramePointerKind(Args, Triple);
612+
613+
const char *FPKeepKindStr = nullptr;
614+
switch (FPKeepKind) {
615+
case CodeGenOptions::FramePointerKind::None:
616+
FPKeepKindStr = "-mframe-pointer=none";
617+
break;
618+
case CodeGenOptions::FramePointerKind::NonLeaf:
619+
FPKeepKindStr = "-mframe-pointer=non-leaf";
620+
break;
621+
case CodeGenOptions::FramePointerKind::All:
622+
FPKeepKindStr = "-mframe-pointer=all";
623+
break;
624+
}
625+
assert(FPKeepKindStr && "unknown FramePointerKind");
626+
CmdArgs.push_back(FPKeepKindStr);
627+
609628
// Forward -mllvm options to the LLVM option parser. In practice, this means
610629
// forwarding to `-fc1` as that's where the LLVM parser is run.
611630
for (const Arg *A : Args.filtered(options::OPT_mllvm)) {

flang/include/flang/Frontend/CodeGenOptions.def

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -38,6 +38,7 @@ CODEGENOPT(Underscoring, 1, 1)
3838
ENUM_CODEGENOPT(RelocationModel, llvm::Reloc::Model, 3, llvm::Reloc::PIC_) ///< Name of the relocation model to use.
3939
ENUM_CODEGENOPT(DebugInfo, llvm::codegenoptions::DebugInfoKind, 4, llvm::codegenoptions::NoDebugInfo) ///< Level of debug info to generate
4040
ENUM_CODEGENOPT(VecLib, llvm::driver::VectorLibrary, 3, llvm::driver::VectorLibrary::NoLibrary) ///< Vector functions library to use
41+
ENUM_CODEGENOPT(FramePointer, FramePointerKind, 2, FramePointerKind::None) /// frame-pointer: all,non-leaf,none
4142

4243
#undef CODEGENOPT
4344
#undef ENUM_CODEGENOPT

0 commit comments

Comments
 (0)