[mlir][LLVMIR] Fold ExtractValueOp coming from InsertValueOp

Differential Revision: https://reviews.llvm.org/D104769
This commit is contained in:
Nicolas Vasilache 2021-06-23 09:03:08 +00:00
parent dfb8c08739
commit f0d43a29e3
3 changed files with 34 additions and 0 deletions

View File

@ -534,6 +534,7 @@ def LLVM_ExtractValueOp : LLVM_Op<"extractvalue", [NoSideEffect]> {
let builders = [LLVM_OneResultOpBuilder];
let parser = [{ return parseExtractValueOp(parser, result); }];
let printer = [{ printExtractValueOp(p, *this); }];
let hasFolder = 1;
}
def LLVM_InsertElementOp : LLVM_Op<"insertelement", [NoSideEffect]> {
let arguments = (ins LLVM_AnyVector:$vector, LLVM_PrimitiveType:$value,

View File

@ -1050,6 +1050,16 @@ static ParseResult parseExtractValueOp(OpAsmParser &parser,
return success();
}
OpFoldResult LLVM::ExtractValueOp::fold(ArrayRef<Attribute> operands) {
auto insertValueOp = container().getDefiningOp<InsertValueOp>();
while (insertValueOp) {
if (position() == insertValueOp.position())
return insertValueOp.value();
insertValueOp = insertValueOp.container().getDefiningOp<InsertValueOp>();
}
return {};
}
//===----------------------------------------------------------------------===//
// Printing/parsing for LLVM::InsertElementOp.
//===----------------------------------------------------------------------===//

View File

@ -0,0 +1,23 @@
// RUN: mlir-opt -canonicalize %s -split-input-file | FileCheck %s
// CHECK-LABEL: fold_extractvalue
llvm.func @fold_extractvalue() -> i32 {
// CHECK-DAG: %[[C0:.*]] = constant 0 : i32
%c0 = constant 0 : i32
// CHECK-DAG: %[[C1:.*]] = constant 1 : i32
%c1 = constant 1 : i32
%0 = llvm.mlir.undef : !llvm.struct<(i32, i32)>
// CHECK-NOT: insertvalue
%1 = llvm.insertvalue %c0, %0[0] : !llvm.struct<(i32, i32)>
%2 = llvm.insertvalue %c1, %1[1] : !llvm.struct<(i32, i32)>
// CHECK-NOT: extractvalue
%3 = llvm.extractvalue %2[0] : !llvm.struct<(i32, i32)>
%4 = llvm.extractvalue %2[1] : !llvm.struct<(i32, i32)>
// CHECK: llvm.add %[[C0]], %[[C1]]
%5 = llvm.add %3, %4 : i32
llvm.return %5 : i32
}