================
@@ -2727,6 +2727,55 @@ def CIR_GetMemberOp : CIR_Op<"get_member"> {
let hasVerifier = 1;
}
+//===----------------------------------------------------------------------===//
+// ExtractMemberOp
+//===----------------------------------------------------------------------===//
+
+def CIR_ExtractMemberOp : CIR_Op<"extract_member", [Pure]> {
+ let summary = "Extract the value of a member of a record value";
+ let description = [{
+ The `cir.extract_member` operation extracts the value of a particular
member
+ from the input record. Unlike `cir.get_member` which derives pointers, this
+ operation operates on values. It takes a value of record type, and extract
+ the value of the specified record member from the input record value.
+
+ Currently `cir.extract_member` does not work on unions.
+
+ Example:
+
+ ```mlir
+ // Suppose we have a record with multiple members.
+ !s32i = !cir.int<s, 32>
+ !s8i = !cir.int<s, 32>
+ !record_ty = !cir.record<"struct.Bar" {!s32i, !s8i}>
+
+ // And suppose we have a value of the record type.
+ %0 = cir.const #cir.const_record<{#cir.int<1> : !s32i, #cir.int<2> :
!s8i}> : !record_ty
+
+ // Extract the value of the second member of the record.
+ %1 = cir.extract_member %0[1] : !record_ty -> !s8i
+ ```
+ }];
+
+ let arguments = (ins CIRRecordType:$record, I64Attr:$index);
+ let results = (outs CIR_AnyType:$result);
+
+ let assemblyFormat = [{
----------------
AmrDeveloper wrote:
Can you please add a test for the format similar to
`clang/test/CIR/IR/vector.cir`
https://github.com/llvm/llvm-project/pull/173512
_______________________________________________
cfe-commits mailing list
[email protected]
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits