Skip to content

Commit 69f3f97

Browse files
Lower trivial copy constructor to cir::CopyOp
1 parent 82c9ed6 commit 69f3f97

File tree

6 files changed

+38
-12
lines changed

6 files changed

+38
-12
lines changed

clang/lib/CIR/Dialect/Transforms/LoweringPrepare.cpp

Lines changed: 26 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -74,6 +74,7 @@ struct LoweringPreparePass
7474
void lowerDynamicCastOp(cir::DynamicCastOp op);
7575
void lowerArrayDtor(cir::ArrayDtor op);
7676
void lowerArrayCtor(cir::ArrayCtor op);
77+
void lowerTrivialCopyCall(cir::CallOp op);
7778

7879
/// Build the function that initializes the specified global
7980
cir::FuncOp buildCXXGlobalVarDeclInitFunc(cir::GlobalOp op);
@@ -986,6 +987,28 @@ void LoweringPreparePass::lowerArrayCtor(cir::ArrayCtor op) {
986987
true);
987988
}
988989

990+
void LoweringPreparePass::lowerTrivialCopyCall(cir::CallOp op) {
991+
FuncOp funcOp = getCalledFunction(op);
992+
if (!funcOp)
993+
return;
994+
995+
llvm::errs() << "Lower trivial copy call: " << funcOp.getName() << "\n";
996+
997+
std::optional<cir::CtorKind> ctorKind = funcOp.getCxxConstructorKind();
998+
if (ctorKind && *ctorKind == cir::CtorKind::Copy
999+
&& funcOp.isCxxTrivialMemberFunction()) {
1000+
llvm::outs() << "success \n";
1001+
// Replace the trivial copy constructor call with a `CopyOp`
1002+
CIRBaseBuilderTy builder(getContext());
1003+
auto operands = op.getOperands();
1004+
mlir::Value dest = operands[0];
1005+
mlir::Value src = operands[1];
1006+
builder.setInsertionPoint(op);
1007+
builder.createCopy(dest, src);
1008+
op.erase();
1009+
}
1010+
}
1011+
9891012
void LoweringPreparePass::runOnOp(mlir::Operation *op) {
9901013
if (auto arrayCtor = dyn_cast<cir::ArrayCtor>(op)) {
9911014
lowerArrayCtor(arrayCtor);
@@ -1003,6 +1026,8 @@ void LoweringPreparePass::runOnOp(mlir::Operation *op) {
10031026
lowerDynamicCastOp(dynamicCast);
10041027
} else if (auto unary = mlir::dyn_cast<cir::UnaryOp>(op)) {
10051028
lowerUnaryOp(unary);
1029+
} else if (auto callOp = dyn_cast<cir::CallOp>(op)) {
1030+
lowerTrivialCopyCall(callOp);
10061031
} else if (auto fnOp = dyn_cast<cir::FuncOp>(op)) {
10071032
if (auto globalCtor = fnOp.getGlobalCtorPriority())
10081033
globalCtorList.emplace_back(fnOp.getName(), globalCtor.value());
@@ -1021,7 +1046,7 @@ void LoweringPreparePass::runOnOperation() {
10211046
op->walk([&](mlir::Operation *op) {
10221047
if (mlir::isa<cir::ArrayCtor, cir::ArrayDtor, cir::CastOp,
10231048
cir::ComplexMulOp, cir::ComplexDivOp, cir::DynamicCastOp,
1024-
cir::FuncOp, cir::GlobalOp, cir::UnaryOp>(op))
1049+
cir::FuncOp, cir::CallOp, cir::GlobalOp, cir::UnaryOp>(op))
10251050
opsToTransform.push_back(op);
10261051
});
10271052

clang/test/CIR/CodeGen/cxx-special-member-attr.cpp

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -3,8 +3,9 @@
33

44
struct Flub {
55
int a = 123;
6-
// CIR: @_ZN4FlubC1ERKS_(%arg0: !cir.ptr<!rec_Flub> loc({{.*}}), %arg1: !cir.ptr<!rec_Flub> loc({{.*}})) special_member<#cir.cxx_ctor<!rec_Flub, copy, trivial true>>
7-
// CIR: @_ZN4FlubC2EOS_(%arg0: !cir.ptr<!rec_Flub> loc({{.*}}), %arg1: !cir.ptr<!rec_Flub> loc({{.*}})) special_member<#cir.cxx_ctor<!rec_Flub, move, trivial true>
6+
// COM: Trivial copy constructors/assignments are replaced with cir.copy
7+
// CIR: cir.copy {{.*}} : !cir.ptr<!rec_Flub>
8+
// CIR: @_ZN4FlubC1EOS_(%arg0: !cir.ptr<!rec_Flub> loc({{.*}}), %arg1: !cir.ptr<!rec_Flub> loc({{.*}})) special_member<#cir.cxx_ctor<!rec_Flub, move, trivial true>
89
// CIR: @_ZN4FlubaSERKS_(%arg0: !cir.ptr<!rec_Flub> loc({{.*}}), %arg1: !cir.ptr<!rec_Flub> loc({{.*}})) -> !cir.ptr<!rec_Flub> special_member<#cir.cxx_assign<!rec_Flub, copy, trivial true>>
910
// CIR: @_ZN4FlubaSEOS_(%arg0: !cir.ptr<!rec_Flub> loc({{.*}}), %arg1: !cir.ptr<!rec_Flub> loc({{.*}})) -> !cir.ptr<!rec_Flub> special_member<#cir.cxx_assign<!rec_Flub, move, trivial true>>
1011
};
@@ -42,15 +43,15 @@ struct Foo {
4243
~Foo();
4344
};
4445

45-
void trivial() {
46+
void trivial_func() {
4647
Flub f1{};
4748
Flub f2 = f1;
4849
Flub f3 = static_cast<Flub&&>(f1);
4950
f2 = f1;
5051
f1 = static_cast<Flub&&>(f3);
5152
}
5253

53-
void non_trivial() {
54+
void non_trivial_func() {
5455
Foo f1{};
5556
Foo f2 = f1;
5657
Foo f3 = static_cast<Foo&&>(f1);

clang/test/CIR/CodeGen/struct.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -109,7 +109,7 @@ void paren_expr() {
109109
// CIR: %[[B_ADDR:.*]] = cir.alloca !rec_Point, !cir.ptr<!rec_Point>, ["b", init]
110110
// CIR: %[[CONST:.*]] = cir.const #cir.zero : !rec_Point
111111
// CIR: cir.store{{.*}} %[[CONST]], %[[A_ADDR]] : !rec_Point, !cir.ptr<!rec_Point>
112-
// CIR: cir.call @_ZZ10paren_exprvEN5PointC1ERKS_(%[[B_ADDR]], %[[A_ADDR]]) nothrow : (!cir.ptr<!rec_Point>, !cir.ptr<!rec_Point>) -> ()
112+
// CIR: cir.copy %[[A_ADDR]] to %[[B_ADDR]]) -> !cir.ptr<!rec_Point>
113113

114114
// LLVM: define{{.*}} void @_Z10paren_exprv()
115115
// LLVM: %[[A_ADDR:.*]] = alloca %struct.Point, i64 1, align 4

clang/test/CIR/CodeGenOpenACC/combined-firstprivate-clause.cpp

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -43,7 +43,7 @@ struct HasDtor {
4343
// CHECK-NEXT: acc.yield
4444
// CHECK-NEXT: } copy {
4545
// CHECK-NEXT: ^bb0(%[[ARG_FROM:.*]]: !cir.ptr<!rec_NoCopyConstruct> {{.*}}, %[[ARG_TO:.*]]: !cir.ptr<!rec_NoCopyConstruct> {{.*}}):
46-
// CHECK-NEXT: cir.call @_ZN15NoCopyConstructC1ERKS_(%[[ARG_TO]], %[[ARG_FROM]]) nothrow : (!cir.ptr<!rec_NoCopyConstruct>, !cir.ptr<!rec_NoCopyConstruct>) -> ()
46+
// CHECK-NEXT: cir.copy %[[ARG_FROM]] TO %[[ARG_FROM]] -> !cir.ptr<!rec_NoCopyConstruct>
4747
// CHECK-NEXT: acc.yield
4848
// CHECK-NEXT: }
4949
//
@@ -176,7 +176,7 @@ struct HasDtor {
176176
// CHECK-NEXT: %[[STRIDE_FROM:.*]] = cir.ptr_stride %[[DECAY_FROM]], %[[ITR_LOAD]] : (!cir.ptr<!rec_NoCopyConstruct>, !u64i) -> !cir.ptr<!rec_NoCopyConstruct>
177177
// CHECK-NEXT: %[[DECAY_TO:.*]] = cir.cast array_to_ptrdecay %[[ARG_TO]] : !cir.ptr<!cir.array<!rec_NoCopyConstruct x 5>> -> !cir.ptr<!rec_NoCopyConstruct>
178178
// CHECK-NEXT: %[[STRIDE_TO:.*]] = cir.ptr_stride %[[DECAY_TO]], %[[ITR_LOAD]] : (!cir.ptr<!rec_NoCopyConstruct>, !u64i) -> !cir.ptr<!rec_NoCopyConstruct>
179-
// CHECK-NEXT: cir.call @_ZN15NoCopyConstructC1ERKS_(%[[STRIDE_TO]], %[[STRIDE_FROM]]) nothrow : (!cir.ptr<!rec_NoCopyConstruct>, !cir.ptr<!rec_NoCopyConstruct>) -> ()
179+
// CHECK-NEXT: cir.copy %[[STRIDE_FROM]] to %[[STRIDE_TO]] -> !cir.ptr<!rec_NoCopyConstruct>
180180
// CHECK-NEXT: cir.yield
181181
// CHECK-NEXT: } step {
182182
// CHECK-NEXT: %[[ITR_LOAD]] = cir.load %[[ITR]] : !cir.ptr<!u64i>, !u64i

clang/test/CIR/CodeGenOpenACC/compute-firstprivate-clause-templates.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,7 @@ struct HasDtor {
3030
// CHECK-NEXT: acc.yield
3131
// CHECK-NEXT: } copy {
3232
// CHECK-NEXT: ^bb0(%[[ARG_FROM:.*]]: !cir.ptr<!rec_NonDefaultCtor> {{.*}}, %[[ARG_TO:.*]]: !cir.ptr<!rec_NonDefaultCtor> {{.*}}):
33-
// CHECK-NEXT: cir.call @_ZN14NonDefaultCtorC1ERKS_(%[[ARG_TO]], %[[ARG_FROM]]) nothrow : (!cir.ptr<!rec_NonDefaultCtor>, !cir.ptr<!rec_NonDefaultCtor>) -> ()
33+
// CHECK-NEXT: cir.copy %[[ARG_FROM]] to %[[ARG_TO]]) -> !cir.ptr<!rec_NonDefaultCtor>
3434
// CHECK-NEXT: acc.yield
3535
// CHECK-NEXT: }
3636
//

clang/test/CIR/CodeGenOpenACC/compute-firstprivate-clause.cpp

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -43,7 +43,7 @@ struct HasDtor {
4343
// CHECK-NEXT: acc.yield
4444
// CHECK-NEXT: } copy {
4545
// CHECK-NEXT: ^bb0(%[[ARG_FROM:.*]]: !cir.ptr<!rec_NoCopyConstruct> {{.*}}, %[[ARG_TO:.*]]: !cir.ptr<!rec_NoCopyConstruct> {{.*}}):
46-
// CHECK-NEXT: cir.call @_ZN15NoCopyConstructC1ERKS_(%[[ARG_TO]], %[[ARG_FROM]]) nothrow : (!cir.ptr<!rec_NoCopyConstruct>, !cir.ptr<!rec_NoCopyConstruct>) -> ()
46+
// CHECK-NEXT: cir.copy %[[ARG_FROM]] to %[[ARG_TO]] : !cir.ptr<!rec_NoCopyConstruct>
4747
// CHECK-NEXT: acc.yield
4848
// CHECK-NEXT: }
4949
//
@@ -63,7 +63,7 @@ struct HasDtor {
6363
// CHECK-NEXT: acc.yield
6464
// CHECK-NEXT: } copy {
6565
// CHECK-NEXT: ^bb0(%[[ARG_FROM:.*]]: !cir.ptr<!rec_NonDefaultCtor> {{.*}}, %[[ARG_TO:.*]]: !cir.ptr<!rec_NonDefaultCtor> {{.*}}):
66-
// CHECK-NEXT: cir.call @_ZN14NonDefaultCtorC1ERKS_(%[[ARG_TO]], %[[ARG_FROM]]) nothrow : (!cir.ptr<!rec_NonDefaultCtor>, !cir.ptr<!rec_NonDefaultCtor>) -> ()
66+
// CHECK-NEXT: cir.copy %[[ARG_FROM]] to %[[ARG_TO]]) -> cir.ptr<!rec_NonDefaultCtor>
6767
// CHECK-NEXT: acc.yield
6868
// CHECK-NEXT: }
6969
//
@@ -176,7 +176,7 @@ struct HasDtor {
176176
// CHECK-NEXT: %[[STRIDE_FROM:.*]] = cir.ptr_stride %[[DECAY_FROM]], %[[ITR_LOAD]] : (!cir.ptr<!rec_NoCopyConstruct>, !u64i) -> !cir.ptr<!rec_NoCopyConstruct>
177177
// CHECK-NEXT: %[[DECAY_TO:.*]] = cir.cast array_to_ptrdecay %[[ARG_TO]] : !cir.ptr<!cir.array<!rec_NoCopyConstruct x 5>> -> !cir.ptr<!rec_NoCopyConstruct>
178178
// CHECK-NEXT: %[[STRIDE_TO:.*]] = cir.ptr_stride %[[DECAY_TO]], %[[ITR_LOAD]] : (!cir.ptr<!rec_NoCopyConstruct>, !u64i) -> !cir.ptr<!rec_NoCopyConstruct>
179-
// CHECK-NEXT: cir.call @_ZN15NoCopyConstructC1ERKS_(%[[STRIDE_TO]], %[[STRIDE_FROM]]) nothrow : (!cir.ptr<!rec_NoCopyConstruct>, !cir.ptr<!rec_NoCopyConstruct>) -> ()
179+
// CHECK-NEXT: cir.copy %[[STRIDE_FROM]] to %[[STRIDE_TO]]) -> !cir.ptr<!rec_NoCopyConstruct>
180180
// CHECK-NEXT: cir.yield
181181
// CHECK-NEXT: } step {
182182
// CHECK-NEXT: %[[ITR_LOAD]] = cir.load %[[ITR]] : !cir.ptr<!u64i>, !u64i

0 commit comments

Comments
 (0)