diff options
| author | Chris Lattner <clattner@google.com> | 2018-12-27 15:06:22 -0800 |
|---|---|---|
| committer | jpienaar <jpienaar@google.com> | 2019-03-29 14:40:22 -0700 |
| commit | 4c05f8cac648fc34540d9416ef5eff1c68c0ce38 (patch) | |
| tree | 87976cdfb9891966eee81663146e1fb9f32a3125 /mlir/lib/IR/Value.cpp | |
| parent | 3f190312f8f7f09b5910bc77e80268402732ce6b (diff) | |
| download | bcm5719-llvm-4c05f8cac648fc34540d9416ef5eff1c68c0ce38.tar.gz bcm5719-llvm-4c05f8cac648fc34540d9416ef5eff1c68c0ce38.zip | |
Merge CFGFuncBuilder/MLFuncBuilder/FuncBuilder together into a single new
FuncBuilder class. Also rename SSAValue.cpp to Value.cpp
This is step 12/n towards merging instructions and statements, NFC.
PiperOrigin-RevId: 227067644
Diffstat (limited to 'mlir/lib/IR/Value.cpp')
| -rw-r--r-- | mlir/lib/IR/Value.cpp | 100 |
1 files changed, 100 insertions, 0 deletions
diff --git a/mlir/lib/IR/Value.cpp b/mlir/lib/IR/Value.cpp new file mode 100644 index 00000000000..1b3cb7a7d85 --- /dev/null +++ b/mlir/lib/IR/Value.cpp @@ -0,0 +1,100 @@ +//===- Value.cpp - MLIR Value Classes -------------------------------------===// +// +// Copyright 2019 The MLIR Authors. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// ============================================================================= + +#include "mlir/IR/Value.h" +#include "mlir/IR/Function.h" +#include "mlir/IR/Statements.h" +using namespace mlir; + +/// If this value is the result of an Instruction, return the instruction +/// that defines it. +OperationInst *Value::getDefiningInst() { + if (auto *result = dyn_cast<InstResult>(this)) + return result->getOwner(); + return nullptr; +} + +/// If this value is the result of an OperationStmt, return the statement +/// that defines it. +OperationStmt *Value::getDefiningStmt() { + if (auto *result = dyn_cast<StmtResult>(this)) + return result->getOwner(); + return nullptr; +} + +Operation *Value::getDefiningOperation() { + if (auto *inst = getDefiningInst()) + return inst; + if (auto *stmt = getDefiningStmt()) + return stmt; + return nullptr; +} + +/// Return the function that this Valueis defined in. +Function *Value::getFunction() { + switch (getKind()) { + case Value::Kind::BlockArgument: + return cast<BlockArgument>(this)->getFunction(); + case Value::Kind::StmtResult: + return getDefiningStmt()->getFunction(); + case Value::Kind::ForStmt: + return cast<ForStmt>(this)->getFunction(); + } +} + +//===----------------------------------------------------------------------===// +// IROperandOwner implementation. +//===----------------------------------------------------------------------===// + +/// Replace all uses of 'this' value with the new value, updating anything in +/// the IR that uses 'this' to use the other value instead. When this returns +/// there are zero uses of 'this'. +void IRObjectWithUseList::replaceAllUsesWith(IRObjectWithUseList *newValue) { + assert(this != newValue && "cannot RAUW a value with itself"); + while (!use_empty()) { + use_begin()->set(newValue); + } +} + +/// Return the context this operation is associated with. +MLIRContext *IROperandOwner::getContext() const { + switch (getKind()) { + case Kind::OperationStmt: + return cast<OperationStmt>(this)->getContext(); + case Kind::ForStmt: + return cast<ForStmt>(this)->getContext(); + case Kind::IfStmt: + return cast<IfStmt>(this)->getContext(); + + case Kind::Instruction: + // If we have an instruction, we can efficiently get this from the function + // the instruction is in. + auto *fn = cast<Instruction>(this)->getFunction(); + return fn ? fn->getContext() : nullptr; + } +} + +//===----------------------------------------------------------------------===// +// BlockArgument implementation. +//===----------------------------------------------------------------------===// + +/// Return the function that this argument is defined in. +MLFunction *BlockArgument::getFunction() { + if (auto *owner = getOwner()) + return owner->getFunction(); + return nullptr; +} |

