Skip to content

Commit 2e60f8f

Browse files
committed
add lowering and test
1 parent 514b3cb commit 2e60f8f

File tree

3 files changed

+44
-4
lines changed

3 files changed

+44
-4
lines changed

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

Lines changed: 31 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -84,6 +84,8 @@ struct LoweringPreparePass : public LoweringPrepareBase<LoweringPreparePass> {
8484
void lowerGlobalOp(GlobalOp op);
8585
void lowerDynamicCastOp(DynamicCastOp op);
8686
void lowerStdFindOp(StdFindOp op);
87+
void lowerStdVectorCtorOp(StdVectorCtorOp op);
88+
void lowerStdVectorDtorOp(StdVectorDtorOp op);
8789
void lowerIterBeginOp(IterBeginOp op);
8890
void lowerIterEndOp(IterEndOp op);
8991
void lowerToMemCpy(StoreOp op);
@@ -1496,6 +1498,28 @@ void LoweringPreparePass::lowerStdFindOp(StdFindOp op) {
14961498
op.erase();
14971499
}
14981500

1501+
void LoweringPreparePass::lowerStdVectorCtorOp(StdVectorCtorOp op) {
1502+
CIRBaseBuilderTy builder(getContext());
1503+
builder.setInsertionPointAfter(op.getOperation());
1504+
auto call =
1505+
builder.createCallOp(op.getLoc(), op.getOriginalFnAttr(), mlir::Type{},
1506+
mlir::ValueRange{op.getOperand()});
1507+
1508+
op.replaceAllUsesWith(call);
1509+
op.erase();
1510+
}
1511+
1512+
void LoweringPreparePass::lowerStdVectorDtorOp(StdVectorDtorOp op) {
1513+
CIRBaseBuilderTy builder(getContext());
1514+
builder.setInsertionPointAfter(op.getOperation());
1515+
auto call =
1516+
builder.createCallOp(op.getLoc(), op.getOriginalFnAttr(), mlir::Type{},
1517+
mlir::ValueRange{op.getOperand()});
1518+
1519+
op.replaceAllUsesWith(call);
1520+
op.erase();
1521+
}
1522+
14991523
void LoweringPreparePass::lowerIterBeginOp(IterBeginOp op) {
15001524
CIRBaseBuilderTy builder(getContext());
15011525
builder.setInsertionPointAfter(op.getOperation());
@@ -1607,6 +1631,10 @@ void LoweringPreparePass::runOnOp(Operation *op) {
16071631
lowerDynamicCastOp(dynamicCast);
16081632
} else if (auto stdFind = dyn_cast<StdFindOp>(op)) {
16091633
lowerStdFindOp(stdFind);
1634+
} else if (auto stdVectorCtorOp = dyn_cast<StdVectorCtorOp>(op)) {
1635+
lowerStdVectorCtorOp(stdVectorCtorOp);
1636+
} else if (auto stdVectorDtorOp = dyn_cast<StdVectorDtorOp>(op)) {
1637+
lowerStdVectorDtorOp(stdVectorDtorOp);
16101638
} else if (auto iterBegin = dyn_cast<IterBeginOp>(op)) {
16111639
lowerIterBeginOp(iterBegin);
16121640
} else if (auto iterEnd = dyn_cast<IterEndOp>(op)) {
@@ -1652,8 +1680,9 @@ void LoweringPreparePass::runOnOperation() {
16521680

16531681
op->walk([&](Operation *op) {
16541682
if (isa<UnaryOp, BinOp, CastOp, ComplexBinOp, CmpThreeWayOp, VAArgOp,
1655-
GlobalOp, DynamicCastOp, StdFindOp, IterEndOp, IterBeginOp,
1656-
ArrayCtor, ArrayDtor, cir::FuncOp, StoreOp, ThrowOp, CallOp>(op))
1683+
GlobalOp, DynamicCastOp, StdFindOp, StdVectorCtorOp,
1684+
StdVectorDtorOp, IterEndOp, IterBeginOp, ArrayCtor, ArrayDtor,
1685+
cir::FuncOp, StoreOp, ThrowOp, CallOp>(op))
16571686
opsToTransform.push_back(op);
16581687
});
16591688

clang/test/CIR/Inputs/std-cxx.h

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -288,13 +288,13 @@ namespace std {
288288
typedef __vector_iterator<T, T *, T &> iterator;
289289
typedef __vector_iterator<T, const T *, const T &> const_iterator;
290290

291-
vector() : _start(0), _finish(0), _end_of_storage(0) {}
291+
vector() : _start(0), _finish(0), _end_of_storage(0) {} // expected-remark {{found call to std::vector_cxx_ctor()}}
292292
template <typename InputIterator>
293293
vector(InputIterator first, InputIterator last);
294294
vector(const vector &other);
295295
vector(vector &&other);
296296
explicit vector(size_type count);
297-
~vector();
297+
~vector(); // expected-remark{{found call to std::vector_cxx_dtor()}}
298298

299299
size_t size() const {
300300
return size_t(_finish - _start);

clang/test/CIR/Transforms/idiom-recognizer.cpp

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -47,3 +47,14 @@ void iter_test() {
4747
yolo::array<unsigned char, 3> v = {1, 2, 3};
4848
(void)v.begin(); // no remark should be produced.
4949
}
50+
51+
void vector_test() {
52+
std::vector<int> v; // expected-remark {{found call to std::vector_cxx_ctor()}}
53+
54+
// BEFORE-IDIOM: cir.call @_ZNSt6vectorIiEC1Ev(
55+
// BEFORE-IDIOM: cir.call @_ZNSt6vectorIiED1Ev(
56+
// AFTER-IDIOM: cir.std.vector_cxx_ctor(
57+
// AFTER-IDIOM: cir.std.vector_cxx_dtor(
58+
// AFTER-LOWERING-PREPARE: cir.call @_ZNSt6vectorIiEC1Ev(
59+
// AFTER-LOWERING-PREPARE: cir.call @_ZNSt6vectorIiED1Ev(
60+
}

0 commit comments

Comments
 (0)