forked from OSchip/llvm-project
[mlir][LLVMIR] Add support for translating insert/extractvalue
Add support for translating llvm::InsertValue and llvm::ExtractValue. Differential Revision: https://reviews.llvm.org/D125028
This commit is contained in:
parent
5a19fbad83
commit
b8f52c08f8
|
@ -619,8 +619,8 @@ static StringRef lookupOperationNameFromOpcode(unsigned opcode) {
|
||||||
// FIXME: extractelement
|
// FIXME: extractelement
|
||||||
// FIXME: insertelement
|
// FIXME: insertelement
|
||||||
// FIXME: shufflevector
|
// FIXME: shufflevector
|
||||||
// FIXME: extractvalue
|
// InsertValue is handled specially.
|
||||||
// FIXME: insertvalue
|
// ExtractValue is handled specially.
|
||||||
// FIXME: landingpad
|
// FIXME: landingpad
|
||||||
};
|
};
|
||||||
#undef INST
|
#undef INST
|
||||||
|
@ -1031,6 +1031,41 @@ LogicalResult Importer::processInstruction(llvm::Instruction *inst) {
|
||||||
dynamicIndices, staticIndices);
|
dynamicIndices, staticIndices);
|
||||||
return success();
|
return success();
|
||||||
}
|
}
|
||||||
|
case llvm::Instruction::InsertValue: {
|
||||||
|
auto *ivInst = cast<llvm::InsertValueInst>(inst);
|
||||||
|
Value inserted = processValue(ivInst->getInsertedValueOperand());
|
||||||
|
if (!inserted)
|
||||||
|
return failure();
|
||||||
|
Value aggOperand = processValue(ivInst->getAggregateOperand());
|
||||||
|
if (!aggOperand)
|
||||||
|
return failure();
|
||||||
|
|
||||||
|
SmallVector<int32_t> idxValues;
|
||||||
|
for (unsigned idx : ivInst->getIndices())
|
||||||
|
idxValues.push_back(static_cast<int32_t>(idx));
|
||||||
|
ArrayAttr indices = b.getI32ArrayAttr(idxValues);
|
||||||
|
|
||||||
|
instMap[inst] = b.create<InsertValueOp>(loc, aggOperand, inserted, indices);
|
||||||
|
return success();
|
||||||
|
}
|
||||||
|
case llvm::Instruction::ExtractValue: {
|
||||||
|
auto *evInst = cast<llvm::ExtractValueInst>(inst);
|
||||||
|
Value aggOperand = processValue(evInst->getAggregateOperand());
|
||||||
|
if (!aggOperand)
|
||||||
|
return failure();
|
||||||
|
|
||||||
|
Type type = processType(inst->getType());
|
||||||
|
if (!type)
|
||||||
|
return failure();
|
||||||
|
|
||||||
|
SmallVector<int32_t> idxValues;
|
||||||
|
for (unsigned idx : evInst->getIndices())
|
||||||
|
idxValues.push_back(static_cast<int32_t>(idx));
|
||||||
|
ArrayAttr indices = b.getI32ArrayAttr(idxValues);
|
||||||
|
|
||||||
|
instMap[inst] = b.create<ExtractValueOp>(loc, type, aggOperand, indices);
|
||||||
|
return success();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -541,3 +541,34 @@ def: ; pred: bb3, bbs
|
||||||
call void @g(i32 %v2)
|
call void @g(i32 %v2)
|
||||||
ret void
|
ret void
|
||||||
}
|
}
|
||||||
|
|
||||||
|
; Insert/ExtractValue
|
||||||
|
; CHECK-LABEL: llvm.func @insert_extract_value_struct
|
||||||
|
define float @insert_extract_value_struct({{i32},{float, double}}* %p) {
|
||||||
|
; CHECK: %[[C0:.+]] = llvm.mlir.constant(2.000000e+00 : f64)
|
||||||
|
; CHECK: %[[VT:.+]] = llvm.load %{{.+}}
|
||||||
|
%t = load {{i32},{float, double}}, {{i32},{float, double}}* %p
|
||||||
|
; CHECK: %[[EV:.+]] = llvm.extractvalue %[[VT]][1 : i32, 0 : i32] :
|
||||||
|
; CHECK-SAME: !llvm.struct<(struct<(i32)>, struct<(f32, f64)>)>
|
||||||
|
%s = extractvalue {{i32},{float, double}} %t, 1, 0
|
||||||
|
; CHECK: %[[IV:.+]] = llvm.insertvalue %[[C0]], %[[VT]][1 : i32, 1 : i32] :
|
||||||
|
; CHECK-SAME: !llvm.struct<(struct<(i32)>, struct<(f32, f64)>)>
|
||||||
|
%r = insertvalue {{i32},{float, double}} %t, double 2.0, 1, 1
|
||||||
|
; CHECK: llvm.store %[[IV]], %{{.+}}
|
||||||
|
store {{i32},{float, double}} %r, {{i32},{float, double}}* %p
|
||||||
|
; CHECK: llvm.return %[[EV]]
|
||||||
|
ret float %s
|
||||||
|
}
|
||||||
|
|
||||||
|
; CHECK-LABEL: llvm.func @insert_extract_value_array
|
||||||
|
define void @insert_extract_value_array([4 x [4 x i8]] %x1) {
|
||||||
|
; CHECK: %[[C0:.+]] = llvm.mlir.constant(0 : i8)
|
||||||
|
; CHECK: llvm.insertvalue %[[C0]], %{{.+}}[0 : i32, 0 : i32] : !llvm.array<4 x array<4 x i8>>
|
||||||
|
%res1 = insertvalue [4 x [4 x i8 ]] %x1, i8 0, 0, 0
|
||||||
|
; CHECK: llvm.extractvalue %{{.+}}[1 : i32] : !llvm.array<4 x array<4 x i8>>
|
||||||
|
%res2 = extractvalue [4 x [4 x i8 ]] %x1, 1
|
||||||
|
; CHECK: llvm.extractvalue %{{.+}}[0 : i32, 1 : i32] : !llvm.array<4 x array<4 x i8>>
|
||||||
|
%res3 = extractvalue [4 x [4 x i8 ]] %x1, 0, 1
|
||||||
|
ret void
|
||||||
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue