================
@@ -2474,6 +2475,101 @@ static void AppendConstructTraitsForDirective(
add(llvm::omp::TraitProperty::construct_dispatch_dispatch);
}
+namespace {
+/// Visitor that profiles a user condition for strict-subset checks. Names are
+/// identified by their ultimate symbols and literals by value and kind;
folding
+/// the whole expression would merge conditions on different variables.
+struct ConditionIdentity {
+ SemanticsContext &context;
+ llvm::FoldingSetNodeID id;
+
+ template <typename A> void AddNode() {
+ // Tag and symbol addresses are only compared within this compilation.
+ static char tag;
+ id.AddPointer(&tag);
+ }
+ template <typename A> bool Pre(const A &x) {
+ AddNode<A>();
+ if constexpr (std::is_enum_v<A> || std::is_integral_v<A>)
+ id.AddInteger(static_cast<uint64_t>(x));
+ else if constexpr (std::is_same_v<A, std::string>)
+ id.AddString(x);
+ return true;
+ }
+ template <typename A> void Post(const A &) { id.AddInteger(0); }
+ // CharBlocks in expression nodes carry source locations, not structure.
+ bool Pre(const parser::CharBlock &) { return false; }
+ bool Pre(const parser::Name &name) {
+ AddNode<parser::Name>();
+ if (name.symbol)
+ id.AddPointer(&name.symbol->GetUltimate());
----------------
MattPD wrote:
The parsed-expression profile is removed from this PR, so this case can move to
the condition-identity follow-up.
https://github.com/llvm/llvm-project/pull/231668
_______________________________________________
cfe-commits mailing list
[email protected]
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits