jurahul updated this revision to Diff 268618.
jurahul added a comment.
Herald added subscribers: cfe-commits, msifontes.
Herald added a project: clang.
Fix Clang build failure
Repository:
rG LLVM Github Monorepo
CHANGES SINCE LAST ACTION
https://reviews.llvm.org/D81045/new/
https://reviews.llvm.org/D81045
Files:
clang/include/clang/AST/DeclBase.h
llvm/include/llvm/Support/Casting.h
llvm/lib/Analysis/ScalarEvolution.cpp
llvm/lib/Target/PowerPC/PPCBoolRetToInt.cpp
mlir/include/mlir/IR/OpBase.td
mlir/include/mlir/IR/OpDefinition.h
mlir/test/IR/traits.mlir
mlir/test/lib/Dialect/Test/TestOps.td
Index: mlir/test/lib/Dialect/Test/TestOps.td
===================================================================
--- mlir/test/lib/Dialect/Test/TestOps.td
+++ mlir/test/lib/Dialect/Test/TestOps.td
@@ -439,10 +439,18 @@
let results = (outs AnyTensor);
}
-// There the "HasParent" trait.
-def ParentOp : TEST_Op<"parent">;
+// HasParent trait
+def ParentOp : TEST_Op<"parent"> {
+ let regions = (region AnyRegion);
+}
def ChildOp : TEST_Op<"child", [HasParent<"ParentOp">]>;
+// ParentOneOf trait
+def ParentOp1 : TEST_Op<"parent1"> {
+ let regions = (region AnyRegion);
+}
+def ChildWithParentOneOf : TEST_Op<"child_with_parent_one_of",
+ [ParentOneOf<["ParentOp", "ParentOp1"]>]>;
def TerminatorOp : TEST_Op<"finish", [Terminator]>;
def SingleBlockImplicitTerminatorOp : TEST_Op<"SingleBlockImplicitTerminator",
Index: mlir/test/IR/traits.mlir
===================================================================
--- mlir/test/IR/traits.mlir
+++ mlir/test/IR/traits.mlir
@@ -173,6 +173,39 @@
}) : () -> ()
}
+// -----
+
+// CHECK: succeededParentOneOf
+func @succeededParentOneOf() {
+ "test.parent"() ({
+ "test.child_with_parent_one_of"() : () -> ()
+ "test.finish"() : () -> ()
+ }) : () -> ()
+ return
+}
+
+// -----
+
+// CHECK: succeededParent1OneOf
+func @succeededParent1OneOf() {
+ "test.parent1"() ({
+ "test.child_with_parent_one_of"() : () -> ()
+ "test.finish"() : () -> ()
+ }) : () -> ()
+ return
+}
+
+// -----
+
+func @failedParentOneOf_wrong_parent1() {
+ "some.otherop"() ({
+ // expected-error@+1 {{'test.child_with_parent_one_of' op expects parent op to be one of 'test.parent, test.parent1'}}
+ "test.child_with_parent_one_of"() : () -> ()
+ "test.finish"() : () -> ()
+ }) : () -> ()
+}
+
+
// -----
func @failedSingleBlockImplicitTerminator_empty_block() {
Index: mlir/include/mlir/IR/OpDefinition.h
===================================================================
--- mlir/include/mlir/IR/OpDefinition.h
+++ mlir/include/mlir/IR/OpDefinition.h
@@ -1139,16 +1139,24 @@
};
};
-/// This class provides a verifier for ops that are expecting a specific parent.
-template <typename ParentOpType> struct HasParent {
+/// This class provides a verifier for ops that are expecting their parent
+/// to be one of the given parent ops
+template <typename... ParentOpTypes>
+struct HasParent {
template <typename ConcreteType>
class Impl : public TraitBase<ConcreteType, Impl> {
public:
static LogicalResult verifyTrait(Operation *op) {
- if (isa<ParentOpType>(op->getParentOp()))
+ if (llvm::isa<ParentOpTypes...>(op->getParentOp()))
return success();
- return op->emitOpError() << "expects parent op '"
- << ParentOpType::getOperationName() << "'";
+
+ InFlightDiagnostic diag = op->emitOpError();
+ diag << "expects parent op "
+ << (sizeof...(ParentOpTypes) != 1 ? "to be one of '" : "'");
+ llvm::interleaveComma(
+ llvm::makeArrayRef({ParentOpTypes::getOperationName()...}), diag);
+ diag << "'";
+ return diag;
}
};
};
Index: mlir/include/mlir/IR/OpBase.td
===================================================================
--- mlir/include/mlir/IR/OpBase.td
+++ mlir/include/mlir/IR/OpBase.td
@@ -1686,6 +1686,9 @@
class HasParent<string op>
: ParamNativeOpTrait<"HasParent", op>;
+class ParentOneOf<list<string> ops>
+ : ParamNativeOpTrait<"HasParent", StrJoin<ops>.result>;
+
// Op result type is derived from the first attribute. If the attribute is an
// subclass of `TypeAttrBase`, its value is used, otherwise, the type of the
// attribute content is used.
Index: llvm/lib/Target/PowerPC/PPCBoolRetToInt.cpp
===================================================================
--- llvm/lib/Target/PowerPC/PPCBoolRetToInt.cpp
+++ llvm/lib/Target/PowerPC/PPCBoolRetToInt.cpp
@@ -220,7 +220,7 @@
auto Defs = findAllDefs(U);
// If the values are all Constants or Arguments, don't bother
- if (llvm::none_of(Defs, isa<Instruction, Value *>))
+ if (llvm::none_of(Defs, [](Value *V) { return isa<Instruction>(V); }))
return false;
// Presently, we only know how to handle PHINode, Constant, Arguments and
Index: llvm/lib/Analysis/ScalarEvolution.cpp
===================================================================
--- llvm/lib/Analysis/ScalarEvolution.cpp
+++ llvm/lib/Analysis/ScalarEvolution.cpp
@@ -3860,7 +3860,9 @@
if (I != HasRecMap.end())
return I->second;
- bool FoundAddRec = SCEVExprContains(S, isa<SCEVAddRecExpr, const SCEV *>);
+ bool FoundAddRec = SCEVExprContains(S, [](const SCEV *S) {
+ return isa<SCEVAddRecExpr>(S);
+ });
HasRecMap.insert({S, FoundAddRec});
return FoundAddRec;
}
@@ -11203,9 +11205,13 @@
// Returns true when one of the SCEVs of Terms contains a SCEVUnknown parameter.
static inline bool containsParameters(SmallVectorImpl<const SCEV *> &Terms) {
- for (const SCEV *T : Terms)
- if (SCEVExprContains(T, isa<SCEVUnknown, const SCEV *>))
+ for (const SCEV *T : Terms) {
+ bool FoundTerm = SCEVExprContains(T, [](const SCEV *S) {
+ return isa<SCEVAddRecExpr>(S);
+ });
+ if (FoundTerm)
return true;
+ }
return false;
}
Index: llvm/include/llvm/Support/Casting.h
===================================================================
--- llvm/include/llvm/Support/Casting.h
+++ llvm/include/llvm/Support/Casting.h
@@ -132,24 +132,31 @@
}
};
-// isa<X> - Return true if the parameter to the template is an instance of the
-// template type argument. Used like this:
+// isa<X> - Return true if the parameter to the template is an instance of one
+// of the template type argument. Used like this:
//
// if (isa<Type>(myVal)) { ... }
+// if (isa<Type0, Type1, Type2>(myVal)) { ... }
//
template <class X, class Y> LLVM_NODISCARD inline bool isa(const Y &Val) {
return isa_impl_wrap<X, const Y,
typename simplify_type<const Y>::SimpleType>::doit(Val);
}
+template <typename First, typename... Rest, typename Y>
+LLVM_NODISCARD inline typename std::enable_if<sizeof...(Rest) != 0, bool>::type
+isa(const Y &Val) {
+ return isa<First>(Val) || isa<Rest...>(Val);
+}
+
// isa_and_nonnull<X> - Functionally identical to isa, except that a null value
// is accepted.
//
-template <class X, class Y>
+template <typename... X, class Y>
LLVM_NODISCARD inline bool isa_and_nonnull(const Y &Val) {
if (!Val)
return false;
- return isa<X>(Val);
+ return isa<X...>(Val);
}
//===----------------------------------------------------------------------===//
Index: clang/include/clang/AST/DeclBase.h
===================================================================
--- clang/include/clang/AST/DeclBase.h
+++ clang/include/clang/AST/DeclBase.h
@@ -518,7 +518,8 @@
if (!HasAttrs) return;
AttrVec &Vec = getAttrs();
- Vec.erase(std::remove_if(Vec.begin(), Vec.end(), isa<T, Attr*>), Vec.end());
+ auto isa_T = [](Attr *A) { return isa<T>(A); };
+ Vec.erase(std::remove_if(Vec.begin(), Vec.end(), isa_T), Vec.end());
if (Vec.empty())
HasAttrs = false;
_______________________________________________
cfe-commits mailing list
[email protected]
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits