From: Nicolai Haehnle Date: Mon, 19 Mar 2018 14:14:04 +0000 (+0000) Subject: TableGen: Only fold when some operand made resolve progress X-Git-Tag: llvmorg-7.0.0-rc1~10291 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=335c70f55ed2101ef7e7411a33b6af7eb2a4384b;p=platform%2Fupstream%2Fllvm.git TableGen: Only fold when some operand made resolve progress Summary: Make sure that we always fold immediately, so there's no point in attempting to re-fold when nothing changes. Change-Id: I069e1989455b6f2ca8606152f6adc1a5e817f1c8 Reviewers: arsenm, craig.topper, tra, MartinO Subscribers: wdng, llvm-commits Differential Revision: https://reviews.llvm.org/D44198 llvm-svn: 327847 --- diff --git a/llvm/lib/TableGen/Record.cpp b/llvm/lib/TableGen/Record.cpp index e76f2a0..331e2bc 100644 --- a/llvm/lib/TableGen/Record.cpp +++ b/llvm/lib/TableGen/Record.cpp @@ -765,7 +765,7 @@ Init *UnOpInit::resolveReferences(Resolver &R) const { if (LHS != lhs) return (UnOpInit::get(getOpcode(), lhs, getType())) ->Fold(R.getCurrentRecord()); - return Fold(R.getCurrentRecord()); + return const_cast(this); } std::string UnOpInit::getAsString() const { @@ -948,7 +948,7 @@ Init *BinOpInit::resolveReferences(Resolver &R) const { if (LHS != lhs || RHS != rhs) return (BinOpInit::get(getOpcode(), lhs, rhs, getType())) ->Fold(R.getCurrentRecord()); - return Fold(R.getCurrentRecord()); + return const_cast(this); } std::string BinOpInit::getAsString() const { @@ -1173,7 +1173,7 @@ Init *TernOpInit::resolveReferences(Resolver &R) const { if (LHS != lhs || MHS != mhs || RHS != rhs) return (TernOpInit::get(getOpcode(), lhs, mhs, rhs, getType())) ->Fold(R.getCurrentRecord()); - return Fold(R.getCurrentRecord()); + return const_cast(this); } std::string TernOpInit::getAsString() const { diff --git a/llvm/lib/TableGen/TGParser.cpp b/llvm/lib/TableGen/TGParser.cpp index 5f19d55..0c92cf7 100644 --- a/llvm/lib/TableGen/TGParser.cpp +++ b/llvm/lib/TableGen/TGParser.cpp @@ -1961,7 +1961,14 @@ Init *TGParser::ParseValue(Record *CurRec, RecTy *ItemType, IDParseMode Mode) { } if (LHS->getType() != StringRecTy::get()) { - LHS = UnOpInit::get(UnOpInit::CAST, LHS, StringRecTy::get()); + LHS = dyn_cast( + UnOpInit::get(UnOpInit::CAST, LHS, StringRecTy::get()) + ->Fold(CurRec)); + if (!LHS) { + Error(PasteLoc, Twine("can't cast '") + LHS->getAsString() + + "' to string"); + return nullptr; + } } TypedInit *RHS = nullptr; @@ -1988,7 +1995,14 @@ Init *TGParser::ParseValue(Record *CurRec, RecTy *ItemType, IDParseMode Mode) { } if (RHS->getType() != StringRecTy::get()) { - RHS = UnOpInit::get(UnOpInit::CAST, RHS, StringRecTy::get()); + RHS = dyn_cast( + UnOpInit::get(UnOpInit::CAST, RHS, StringRecTy::get()) + ->Fold(CurRec)); + if (!RHS) { + Error(PasteLoc, Twine("can't cast '") + RHS->getAsString() + + "' to string"); + return nullptr; + } } break;