diff --git a/clang/include/clang/CIR/Dialect/IR/CIROps.td b/clang/include/clang/CIR/Dialect/IR/CIROps.td index c5255624a7e5..1a9028889dc3 100644 --- a/clang/include/clang/CIR/Dialect/IR/CIROps.td +++ b/clang/include/clang/CIR/Dialect/IR/CIROps.td @@ -1383,6 +1383,9 @@ def StructElementAddr : CIR_Op<"struct_element_addr"> { The `cir.struct_element_addr` operaration gets the address of a particular named member from the input struct. + It expects a pointer to the base struct as well as the name of the member + and its field index. + Example: ```mlir !ty_22struct2EBar22 = type !cir.struct<"struct.Bar", i32, i8> @@ -1397,10 +1400,25 @@ def StructElementAddr : CIR_Op<"struct_element_addr"> { let arguments = (ins Arg:$struct_addr, - StrAttr:$member_name); + StrAttr:$member_name, + IndexAttr:$member_index); let results = (outs Res:$result); + let builders = [ + OpBuilder<(ins "Type":$type, "Value":$value, "llvm::StringRef":$name, + "unsigned":$index), + [{ + mlir::APInt fieldIdx(64, index); + build($_builder, $_state, type, value, name, fieldIdx); + }]> + ]; + + let extraClassDeclaration = [{ + /// Return the index of the struct member being accessed. + uint64_t getIndex() { return getMemberIndex().getZExtValue(); } + }]; + // FIXME: add verifier. } diff --git a/clang/lib/CIR/CodeGen/CIRGenClass.cpp b/clang/lib/CIR/CodeGen/CIRGenClass.cpp index c7aaf78ff3a9..82b6e0938cb9 100644 --- a/clang/lib/CIR/CodeGen/CIRGenClass.cpp +++ b/clang/lib/CIR/CodeGen/CIRGenClass.cpp @@ -208,7 +208,8 @@ static void buildLValueForAnyFieldInitialization(CIRGenFunction &CGF, if (MemberInit->isIndirectMemberInitializer()) { llvm_unreachable("NYI"); } else { - LHS = CGF.buildLValueForFieldInitialization(LHS, Field, Field->getName()); + LHS = CGF.buildLValueForFieldInitialization(LHS, Field, Field->getName(), + Field->getFieldIndex()); } } diff --git a/clang/lib/CIR/CodeGen/CIRGenExpr.cpp b/clang/lib/CIR/CodeGen/CIRGenExpr.cpp index c281904cc140..9e65dd75cdd9 100644 --- a/clang/lib/CIR/CodeGen/CIRGenExpr.cpp +++ b/clang/lib/CIR/CodeGen/CIRGenExpr.cpp @@ -52,7 +52,8 @@ static Address buildPreserveStructAccess(CIRGenFunction &CGF, LValue base, /// doesn't necessarily have the right type. static Address buildAddrOfFieldStorage(CIRGenFunction &CGF, Address Base, const FieldDecl *field, - llvm::StringRef fieldName) { + llvm::StringRef fieldName, + unsigned fieldIndex) { if (field->isZeroSize(CGF.getContext())) llvm_unreachable("NYI"); @@ -65,7 +66,7 @@ static Address buildAddrOfFieldStorage(CIRGenFunction &CGF, Address Base, // which do not currently carry the name, so it can be passed down from the // CaptureStmt. auto sea = CGF.getBuilder().create( - loc, fieldPtr, Base.getPointer(), fieldName); + loc, fieldPtr, Base.getPointer(), fieldName, fieldIndex); // TODO: We could get the alignment from the CIRGenRecordLayout, but given the // member name based lookup of the member here we probably shouldn't be. We'll @@ -237,9 +238,10 @@ LValue CIRGenFunction::buildLValueForField(LValue base, if (!IsInPreservedAIRegion && (!getDebugInfo() || !rec->hasAttr())) { llvm::StringRef fieldName = field->getName(); + unsigned fieldIndex = field->getFieldIndex(); if (CGM.LambdaFieldToName.count(field)) fieldName = CGM.LambdaFieldToName[field]; - addr = buildAddrOfFieldStorage(*this, addr, field, fieldName); + addr = buildAddrOfFieldStorage(*this, addr, field, fieldName, fieldIndex); } else // Remember the original struct field index addr = buildPreserveStructAccess(*this, base, addr, field); @@ -283,14 +285,15 @@ LValue CIRGenFunction::buildLValueForField(LValue base, } LValue CIRGenFunction::buildLValueForFieldInitialization( - LValue Base, const clang::FieldDecl *Field, llvm::StringRef FieldName) { + LValue Base, const clang::FieldDecl *Field, llvm::StringRef FieldName, + unsigned FieldIndex) { QualType FieldType = Field->getType(); if (!FieldType->isReferenceType()) return buildLValueForField(Base, Field); - Address V = - buildAddrOfFieldStorage(*this, Base.getAddress(), Field, FieldName); + Address V = buildAddrOfFieldStorage(*this, Base.getAddress(), Field, + FieldName, FieldIndex); // Make sure that the address is pointing to the right type. auto memTy = getTypes().convertTypeForMem(FieldType); diff --git a/clang/lib/CIR/CodeGen/CIRGenExprAgg.cpp b/clang/lib/CIR/CodeGen/CIRGenExprAgg.cpp index 5f70a36450e9..6f38a235c755 100644 --- a/clang/lib/CIR/CodeGen/CIRGenExprAgg.cpp +++ b/clang/lib/CIR/CodeGen/CIRGenExprAgg.cpp @@ -445,8 +445,8 @@ void AggExprEmitter::VisitLambdaExpr(LambdaExpr *E) { } // Emit initialization - LValue LV = - CGF.buildLValueForFieldInitialization(SlotLV, *CurField, fieldName); + LValue LV = CGF.buildLValueForFieldInitialization( + SlotLV, *CurField, fieldName, CurField->getFieldIndex()); if (CurField->hasCapturedVLAType()) { llvm_unreachable("NYI"); } @@ -701,8 +701,8 @@ void AggExprEmitter::VisitCXXParenListOrInitListExpr( CGF.getTypes().isZeroInitializable(ExprToVisit->getType())) break; - LValue LV = - CGF.buildLValueForFieldInitialization(DestLV, field, field->getName()); + LValue LV = CGF.buildLValueForFieldInitialization( + DestLV, field, field->getName(), field->getFieldIndex()); // We never generate write-barries for initialized fields. assert(!UnimplementedFeature::setNonGC()); diff --git a/clang/lib/CIR/CodeGen/CIRGenFunction.h b/clang/lib/CIR/CodeGen/CIRGenFunction.h index cfa43350d561..5f57488b407e 100644 --- a/clang/lib/CIR/CodeGen/CIRGenFunction.h +++ b/clang/lib/CIR/CodeGen/CIRGenFunction.h @@ -44,7 +44,7 @@ class CallOp; namespace { class ScalarExprEmitter; class AggExprEmitter; -} +} // namespace namespace cir { @@ -1448,7 +1448,8 @@ class CIRGenFunction : public CIRGenTypeCache { /// stored in the reference. LValue buildLValueForFieldInitialization(LValue Base, const clang::FieldDecl *Field, - llvm::StringRef FieldName); + llvm::StringRef FieldName, + unsigned FieldIndex); void buildInitializerForField(clang::FieldDecl *Field, LValue LHS, clang::Expr *Init); diff --git a/clang/test/CIR/CodeGen/String.cpp b/clang/test/CIR/CodeGen/String.cpp index 724b2a145935..c5e9b46a3130 100644 --- a/clang/test/CIR/CodeGen/String.cpp +++ b/clang/test/CIR/CodeGen/String.cpp @@ -21,10 +21,10 @@ void test() { // CHECK-NEXT: %0 = cir.alloca !cir.ptr // CHECK-NEXT: cir.store %arg0, %0 // CHECK-NEXT: %1 = cir.load %0 -// CHECK-NEXT: %2 = "cir.struct_element_addr"(%1) <{member_name = "storage"}> +// CHECK-NEXT: %2 = "cir.struct_element_addr"(%1) <{member_index = 0 : index, member_name = "storage"}> // CHECK-NEXT: %3 = cir.const(#cir.null : !cir.ptr) : !cir.ptr // CHECK-NEXT: cir.store %3, %2 : !cir.ptr, cir.ptr > -// CHECK-NEXT: %4 = "cir.struct_element_addr"(%1) <{member_name = "size"}> : (!cir.ptr) -> !cir.ptr +// CHECK-NEXT: %4 = "cir.struct_element_addr"(%1) <{member_index = 1 : index, member_name = "size"}> : (!cir.ptr) -> !cir.ptr // CHECK-NEXT: %5 = cir.const(#cir.int<0> : !s32i) : !s32i // CHECK-NEXT: %6 = cir.cast(integral, %5 : !s32i), !s64i // CHECK-NEXT: cir.store %6, %4 : !s64i, cir.ptr @@ -36,10 +36,10 @@ void test() { // CHECK-NEXT: cir.store %arg0, %0 // CHECK-NEXT: cir.store %arg1, %1 // CHECK-NEXT: %2 = cir.load %0 -// CHECK-NEXT: %3 = "cir.struct_element_addr"(%2) <{member_name = "storage"}> +// CHECK-NEXT: %3 = "cir.struct_element_addr"(%2) <{member_index = 0 : index, member_name = "storage"}> // CHECK-NEXT: %4 = cir.const(#cir.null : !cir.ptr) // CHECK-NEXT: cir.store %4, %3 -// CHECK-NEXT: %5 = "cir.struct_element_addr"(%2) <{member_name = "size"}> : (!cir.ptr) -> !cir.ptr +// CHECK-NEXT: %5 = "cir.struct_element_addr"(%2) <{member_index = 1 : index, member_name = "size"}> : (!cir.ptr) -> !cir.ptr // CHECK-NEXT: %6 = cir.load %1 : cir.ptr , !s32i // CHECK-NEXT: %7 = cir.cast(integral, %6 : !s32i), !s64i // CHECK-NEXT: cir.store %7, %5 : !s64i, cir.ptr @@ -52,7 +52,7 @@ void test() { // CHECK-NEXT: cir.store %arg0, %0 : !cir.ptr, cir.ptr > // CHECK-NEXT: cir.store %arg1, %1 : !cir.ptr, cir.ptr > // CHECK-NEXT: %2 = cir.load %0 : cir.ptr >, !cir.ptr -// CHECK-NEXT: %3 = "cir.struct_element_addr"(%2) <{member_name = "storage"}> : (!cir.ptr) -> !cir.ptr> +// CHECK-NEXT: %3 = "cir.struct_element_addr"(%2) <{member_index = 0 : index, member_name = "storage"}> : (!cir.ptr) -> !cir.ptr> // CHECK-NEXT: %4 = cir.const(#cir.null : !cir.ptr) : !cir.ptr // CHECK-NEXT: cir.store %4, %3 : !cir.ptr, cir.ptr > // CHECK-NEXT: cir.return diff --git a/clang/test/CIR/CodeGen/agg-init.cpp b/clang/test/CIR/CodeGen/agg-init.cpp index 8209df9d153b..6e0115ae90e1 100644 --- a/clang/test/CIR/CodeGen/agg-init.cpp +++ b/clang/test/CIR/CodeGen/agg-init.cpp @@ -35,10 +35,10 @@ void use() { yop{}; } // CHECK: cir.func @_Z3usev() { // CHECK: %0 = cir.alloca !ty_22struct2Eyep_22, cir.ptr , ["agg.tmp0"] {alignment = 4 : i64} -// CHECK: %1 = "cir.struct_element_addr"(%0) <{member_name = "Status"}> : (!cir.ptr) -> !cir.ptr +// CHECK: %1 = "cir.struct_element_addr"(%0) <{member_index = 0 : index, member_name = "Status"}> : (!cir.ptr) -> !cir.ptr // CHECK: %2 = cir.const(#cir.int<0> : !u32i) : !u32i // CHECK: cir.store %2, %1 : !u32i, cir.ptr -// CHECK: %3 = "cir.struct_element_addr"(%0) <{member_name = "HC"}> : (!cir.ptr) -> !cir.ptr +// CHECK: %3 = "cir.struct_element_addr"(%0) <{member_index = 1 : index, member_name = "HC"}> : (!cir.ptr) -> !cir.ptr // CHECK: %4 = cir.const(#cir.int<0> : !u32i) : !u32i // CHECK: cir.store %4, %3 : !u32i, cir.ptr // CHECK: cir.return @@ -68,12 +68,12 @@ void yo() { // CHECK: %1 = cir.alloca !ty_22struct2EYo22, cir.ptr , ["ext2", init] {alignment = 8 : i64} // CHECK: %2 = cir.const(#cir.const_struct<{#cir.int<1000070000> : !u32i,#cir.null : !cir.ptr,#cir.int<0> : !u64i}> : !ty_22struct2EYo22) : !ty_22struct2EYo22 // CHECK: cir.store %2, %0 : !ty_22struct2EYo22, cir.ptr -// CHECK: %3 = "cir.struct_element_addr"(%1) <{member_name = "type"}> : (!cir.ptr) -> !cir.ptr +// CHECK: %3 = "cir.struct_element_addr"(%1) <{member_index = 0 : index, member_name = "type"}> : (!cir.ptr) -> !cir.ptr // CHECK: %4 = cir.const(#cir.int<1000066001> : !u32i) : !u32i // CHECK: cir.store %4, %3 : !u32i, cir.ptr -// CHECK: %5 = "cir.struct_element_addr"(%1) <{member_name = "next"}> : (!cir.ptr) -> !cir.ptr> +// CHECK: %5 = "cir.struct_element_addr"(%1) <{member_index = 1 : index, member_name = "next"}> : (!cir.ptr) -> !cir.ptr> // CHECK: %6 = cir.cast(bitcast, %0 : !cir.ptr), !cir.ptr // CHECK: cir.store %6, %5 : !cir.ptr, cir.ptr > -// CHECK: %7 = "cir.struct_element_addr"(%1) <{member_name = "createFlags"}> : (!cir.ptr) -> !cir.ptr +// CHECK: %7 = "cir.struct_element_addr"(%1) <{member_index = 2 : index, member_name = "createFlags"}> : (!cir.ptr) -> !cir.ptr // CHECK: %8 = cir.const(#cir.int<0> : !u64i) : !u64i // CHECK: cir.store %8, %7 : !u64i, cir.ptr diff --git a/clang/test/CIR/CodeGen/assign-operator.cpp b/clang/test/CIR/CodeGen/assign-operator.cpp index 6fd7da66c6d1..5a0261d3ddca 100644 --- a/clang/test/CIR/CodeGen/assign-operator.cpp +++ b/clang/test/CIR/CodeGen/assign-operator.cpp @@ -23,7 +23,7 @@ struct String { // Get address of `this->size` - // CHECK: %3 = "cir.struct_element_addr"(%2) <{member_name = "size"}> + // CHECK: %3 = "cir.struct_element_addr"(%2) <{member_index = 0 : index, member_name = "size"}> // Get address of `s` @@ -31,7 +31,7 @@ struct String { // Get the address of s.size - // CHECK: %5 = "cir.struct_element_addr"(%4) <{member_name = "size"}> + // CHECK: %5 = "cir.struct_element_addr"(%4) <{member_index = 0 : index, member_name = "size"}> // Load value from s.size and store in this->size @@ -53,9 +53,9 @@ struct String { // CHECK: cir.store %arg1, %1 : !cir.ptr // CHECK: %3 = cir.load deref %0 : cir.ptr > // CHECK: %4 = cir.load %1 : cir.ptr > - // CHECK: %5 = "cir.struct_element_addr"(%4) <{member_name = "size"}> + // CHECK: %5 = "cir.struct_element_addr"(%4) <{member_index = 0 : index, member_name = "size"}> // CHECK: %6 = cir.load %5 : cir.ptr , !s64i - // CHECK: %7 = "cir.struct_element_addr"(%3) <{member_name = "size"}> + // CHECK: %7 = "cir.struct_element_addr"(%3) <{member_index = 0 : index, member_name = "size"}> // CHECK: cir.store %6, %7 : !s64i, cir.ptr // CHECK: cir.store %3, %2 : !cir.ptr // CHECK: %8 = cir.load %2 : cir.ptr > diff --git a/clang/test/CIR/CodeGen/ctor-member-lvalue-to-rvalue.cpp b/clang/test/CIR/CodeGen/ctor-member-lvalue-to-rvalue.cpp index a35517850d75..77240b8e04f9 100644 --- a/clang/test/CIR/CodeGen/ctor-member-lvalue-to-rvalue.cpp +++ b/clang/test/CIR/CodeGen/ctor-member-lvalue-to-rvalue.cpp @@ -11,9 +11,9 @@ struct String { // CHECK: cir.store %arg0, %0 // CHECK: cir.store %arg1, %1 // CHECK: %2 = cir.load %0 -// CHECK: %3 = "cir.struct_element_addr"(%2) <{member_name = "size"}> +// CHECK: %3 = "cir.struct_element_addr"(%2) <{member_index = 0 : index, member_name = "size"}> // CHECK: %4 = cir.load %1 -// CHECK: %5 = "cir.struct_element_addr"(%4) <{member_name = "size"}> +// CHECK: %5 = "cir.struct_element_addr"(%4) <{member_index = 0 : index, member_name = "size"}> // CHECK: %6 = cir.load %5 : cir.ptr , !s64i // CHECK: cir.store %6, %3 : !s64i, cir.ptr // CHECK: cir.return diff --git a/clang/test/CIR/CodeGen/derived-to-base.cpp b/clang/test/CIR/CodeGen/derived-to-base.cpp index f8d28396873f..57ac3a4676e0 100644 --- a/clang/test/CIR/CodeGen/derived-to-base.cpp +++ b/clang/test/CIR/CodeGen/derived-to-base.cpp @@ -82,7 +82,7 @@ void C3::Layer::Initialize() { // CHECK: cir.scope { // CHECK: %2 = cir.base_class_addr(%1 : cir.ptr ) -> cir.ptr -// CHECK: %3 = "cir.struct_element_addr"(%2) <{member_name = "m_C1"}> : (!cir.ptr) -> !cir.ptr> +// CHECK: %3 = "cir.struct_element_addr"(%2) <{member_index = 0 : index, member_name = "m_C1"}> : (!cir.ptr) -> !cir.ptr> // CHECK: %4 = cir.load %3 : cir.ptr >, !cir.ptr // CHECK: %5 = cir.const(#cir.null : !cir.ptr) : !cir.ptr // CHECK: %6 = cir.cmp(eq, %4, %5) : !cir.ptr, !cir.bool diff --git a/clang/test/CIR/CodeGen/lambda.cpp b/clang/test/CIR/CodeGen/lambda.cpp index 4bb5b9438e2e..73cfaebfd752 100644 --- a/clang/test/CIR/CodeGen/lambda.cpp +++ b/clang/test/CIR/CodeGen/lambda.cpp @@ -26,12 +26,12 @@ void l0() { // CHECK: %0 = cir.alloca !cir.ptr, cir.ptr >, ["this", init] {alignment = 8 : i64} // CHECK: cir.store %arg0, %0 : !cir.ptr, cir.ptr > // CHECK: %1 = cir.load %0 : cir.ptr >, !cir.ptr -// CHECK: %2 = "cir.struct_element_addr"(%1) <{member_name = "i"}> : (!cir.ptr) -> !cir.ptr> +// CHECK: %2 = "cir.struct_element_addr"(%1) <{member_index = 0 : index, member_name = "i"}> : (!cir.ptr) -> !cir.ptr> // CHECK: %3 = cir.load %2 : cir.ptr >, !cir.ptr // CHECK: %4 = cir.load %3 : cir.ptr , !s32i // CHECK: %5 = cir.const(#cir.int<1> : !s32i) : !s32i // CHECK: %6 = cir.binop(add, %4, %5) : !s32i -// CHECK: %7 = "cir.struct_element_addr"(%1) <{member_name = "i"}> : (!cir.ptr) -> !cir.ptr> +// CHECK: %7 = "cir.struct_element_addr"(%1) <{member_index = 0 : index, member_name = "i"}> : (!cir.ptr) -> !cir.ptr> // CHECK: %8 = cir.load %7 : cir.ptr >, !cir.ptr // CHECK: cir.store %6, %8 : !s32i, cir.ptr @@ -50,7 +50,7 @@ auto g() { // CHECK: %1 = cir.alloca !s32i, cir.ptr , ["i", init] {alignment = 4 : i64} // CHECK: %2 = cir.const(#cir.int<12> : !s32i) : !s32i // CHECK: cir.store %2, %1 : !s32i, cir.ptr -// CHECK: %3 = "cir.struct_element_addr"(%0) <{member_name = "i"}> : (!cir.ptr) -> !cir.ptr> +// CHECK: %3 = "cir.struct_element_addr"(%0) <{member_index = 0 : index, member_name = "i"}> : (!cir.ptr) -> !cir.ptr> // CHECK: cir.store %1, %3 : !cir.ptr, cir.ptr > // CHECK: %4 = cir.load %0 : cir.ptr , !ty_22class2Eanon223 // CHECK: cir.return %4 : !ty_22class2Eanon223 @@ -70,7 +70,7 @@ auto g2() { // CHECK-NEXT: %1 = cir.alloca !s32i, cir.ptr , ["i", init] {alignment = 4 : i64} // CHECK-NEXT: %2 = cir.const(#cir.int<12> : !s32i) : !s32i // CHECK-NEXT: cir.store %2, %1 : !s32i, cir.ptr -// CHECK-NEXT: %3 = "cir.struct_element_addr"(%0) <{member_name = "i"}> : (!cir.ptr) -> !cir.ptr> +// CHECK-NEXT: %3 = "cir.struct_element_addr"(%0) <{member_index = 0 : index, member_name = "i"}> : (!cir.ptr) -> !cir.ptr> // CHECK-NEXT: cir.store %1, %3 : !cir.ptr, cir.ptr > // CHECK-NEXT: %4 = cir.load %0 : cir.ptr , !ty_22class2Eanon224 // CHECK-NEXT: cir.return %4 : !ty_22class2Eanon224 diff --git a/clang/test/CIR/CodeGen/rangefor.cpp b/clang/test/CIR/CodeGen/rangefor.cpp index d49014de7904..d9e82a8de7e1 100644 --- a/clang/test/CIR/CodeGen/rangefor.cpp +++ b/clang/test/CIR/CodeGen/rangefor.cpp @@ -61,11 +61,11 @@ void init(unsigned numImages) { // CHECK: %13 = cir.alloca !ty_22struct2Etriple22, cir.ptr , ["ref.tmp0"] {alignment = 8 : i64} // CHECK: %14 = cir.const(#cir.zero : !ty_22struct2Etriple22) : !ty_22struct2Etriple22 // CHECK: cir.store %14, %13 : !ty_22struct2Etriple22, cir.ptr -// CHECK: %15 = "cir.struct_element_addr"(%13) <{member_name = "type"}> : (!cir.ptr) -> !cir.ptr +// CHECK: %15 = "cir.struct_element_addr"(%13) <{member_index = 0 : index, member_name = "type"}> : (!cir.ptr) -> !cir.ptr // CHECK: %16 = cir.const(#cir.int<1000024002> : !u32i) : !u32i // CHECK: cir.store %16, %15 : !u32i, cir.ptr -// CHECK: %17 = "cir.struct_element_addr"(%13) <{member_name = "next"}> : (!cir.ptr) -> !cir.ptr> -// CHECK: %18 = "cir.struct_element_addr"(%13) <{member_name = "image"}> : (!cir.ptr) -> !cir.ptr +// CHECK: %17 = "cir.struct_element_addr"(%13) <{member_index = 1 : index, member_name = "next"}> : (!cir.ptr) -> !cir.ptr> +// CHECK: %18 = "cir.struct_element_addr"(%13) <{member_index = 2 : index, member_name = "image"}> : (!cir.ptr) -> !cir.ptr // CHECK: %19 = cir.load %7 : cir.ptr >, !cir.ptr // CHECK: %20 = cir.call @_ZN6tripleaSEOS_(%19, %13) : (!cir.ptr, !cir.ptr) -> !cir.ptr // CHECK: } diff --git a/clang/test/CIR/CodeGen/struct.cpp b/clang/test/CIR/CodeGen/struct.cpp index 0fcab0300640..b54a45ef4b18 100644 --- a/clang/test/CIR/CodeGen/struct.cpp +++ b/clang/test/CIR/CodeGen/struct.cpp @@ -98,14 +98,14 @@ void m() { Adv C; } // CHECK: %0 = cir.alloca !cir.ptr, cir.ptr >, ["this", init] {alignment = 8 : i64} // CHECK: cir.store %arg0, %0 : !cir.ptr, cir.ptr > // CHECK: %1 = cir.load %0 : cir.ptr >, !cir.ptr -// CHECK: %2 = "cir.struct_element_addr"(%1) <{member_name = "x"}> : (!cir.ptr) -> !cir.ptr -// CHECK: %3 = "cir.struct_element_addr"(%2) <{member_name = "w"}> : (!cir.ptr) -> !cir.ptr +// CHECK: %2 = "cir.struct_element_addr"(%1) <{member_index = 0 : index, member_name = "x"}> : (!cir.ptr) -> !cir.ptr +// CHECK: %3 = "cir.struct_element_addr"(%2) <{member_index = 0 : index, member_name = "w"}> : (!cir.ptr) -> !cir.ptr // CHECK: %4 = cir.const(#cir.int<1000024001> : !u32i) : !u32i // CHECK: cir.store %4, %3 : !u32i, cir.ptr -// CHECK: %5 = "cir.struct_element_addr"(%2) <{member_name = "n"}> : (!cir.ptr) -> !cir.ptr> +// CHECK: %5 = "cir.struct_element_addr"(%2) <{member_index = 1 : index, member_name = "n"}> : (!cir.ptr) -> !cir.ptr> // CHECK: %6 = cir.const(#cir.null : !cir.ptr) : !cir.ptr // CHECK: cir.store %6, %5 : !cir.ptr, cir.ptr > -// CHECK: %7 = "cir.struct_element_addr"(%2) <{member_name = "d"}> : (!cir.ptr) -> !cir.ptr +// CHECK: %7 = "cir.struct_element_addr"(%2) <{member_index = 2 : index, member_name = "d"}> : (!cir.ptr) -> !cir.ptr // CHECK: %8 = cir.const(#cir.int<0> : !s32i) : !s32i // CHECK: cir.store %8, %7 : !s32i, cir.ptr // CHECK: cir.return @@ -147,4 +147,4 @@ void ppp() { Entry x; } // CHECK: cir.func linkonce_odr @_ZN5EntryC2Ev(%arg0: !cir.ptr -// CHECK: = "cir.struct_element_addr"(%1) <{member_name = "procAddr"}> : (!cir.ptr) -> !cir.ptr, !cir.ptr)>>> +// CHECK: = "cir.struct_element_addr"(%1) <{member_index = 0 : index, member_name = "procAddr"}> : (!cir.ptr) -> !cir.ptr, !cir.ptr)>>> diff --git a/clang/test/CIR/CodeGen/unary-deref.cpp b/clang/test/CIR/CodeGen/unary-deref.cpp index 15501e6f1ba0..23a54e4442ba 100644 --- a/clang/test/CIR/CodeGen/unary-deref.cpp +++ b/clang/test/CIR/CodeGen/unary-deref.cpp @@ -12,6 +12,6 @@ void foo() { // CHECK: cir.func linkonce_odr @_ZNK12MyIntPointer4readEv // CHECK: %2 = cir.load %0 -// CHECK: %3 = "cir.struct_element_addr"(%2) <{member_name = "ptr"}> +// CHECK: %3 = "cir.struct_element_addr"(%2) <{member_index = 0 : index, member_name = "ptr"}> // CHECK: %4 = cir.load deref %3 : cir.ptr > // CHECK: %5 = cir.load %4