Skip to content

Commit 54fc10b

Browse files
committed
[CIR] Add assume_separate_storage operation
This patch adds the `cir.assume_separate_storage` operation for the `__builtin_assume_separate_storage` builtin function.
1 parent 58c3aff commit 54fc10b

File tree

5 files changed

+65
-0
lines changed

5 files changed

+65
-0
lines changed

clang/include/clang/CIR/Dialect/IR/CIROps.td

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3004,6 +3004,26 @@ def CIR_AssumeOp : CIR_Op<"assume"> {
30043004
}];
30053005
}
30063006

3007+
def CIR_AssumeSepStorageOp : CIR_Op<"assume_separate_storage",
3008+
[SameTypeOperands]> {
3009+
let summary =
3010+
"Tell the optimizer that two pointers point to different allocations";
3011+
let description = [{
3012+
The `cir.assume.separate_storage` operation takes two pointers as arguments,
3013+
and the operation tells the optimizer that these two pointers point to
3014+
different allocations.
3015+
3016+
This operation corresponds to the `__builtin_assume_separate_storage`
3017+
builtin function.
3018+
}];
3019+
3020+
let arguments = (ins CIR_VoidPtrType:$ptr1, CIR_VoidPtrType:$ptr2);
3021+
3022+
let assemblyFormat = [{
3023+
$ptr1 `,` $ptr2 `:` qualified(type($ptr1)) attr-dict
3024+
}];
3025+
}
3026+
30073027
//===----------------------------------------------------------------------===//
30083028
// Branch Probability Operations
30093029
//===----------------------------------------------------------------------===//

clang/lib/CIR/CodeGen/CIRGenBuiltin.cpp

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -121,6 +121,13 @@ RValue CIRGenFunction::emitBuiltinExpr(const GlobalDecl &gd, unsigned builtinID,
121121
return RValue::get(nullptr);
122122
}
123123

124+
case Builtin::BI__builtin_assume_separate_storage: {
125+
mlir::Value value0 = emitScalarExpr(e->getArg(0));
126+
mlir::Value value1 = emitScalarExpr(e->getArg(1));
127+
builder.create<cir::AssumeSepStorageOp>(loc, value0, value1);
128+
return RValue::get(nullptr);
129+
}
130+
124131
case Builtin::BI__builtin_complex: {
125132
mlir::Value real = emitScalarExpr(e->getArg(0));
126133
mlir::Value imag = emitScalarExpr(e->getArg(1));

clang/lib/CIR/Lowering/DirectToLLVM/LowerToLLVM.cpp

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -460,6 +460,17 @@ mlir::LogicalResult CIRToLLVMAssumeOpLowering::matchAndRewrite(
460460
return mlir::success();
461461
}
462462

463+
mlir::LogicalResult CIRToLLVMAssumeSepStorageOpLowering::matchAndRewrite(
464+
cir::AssumeSepStorageOp op, OpAdaptor adaptor,
465+
mlir::ConversionPatternRewriter &rewriter) const {
466+
auto cond = rewriter.create<mlir::LLVM::ConstantOp>(op.getLoc(),
467+
rewriter.getI1Type(), 1);
468+
rewriter.replaceOpWithNewOp<mlir::LLVM::AssumeOp>(
469+
op, cond, mlir::LLVM::AssumeSeparateStorageTag{}, adaptor.getPtr1(),
470+
adaptor.getPtr2());
471+
return mlir::success();
472+
}
473+
463474
mlir::LogicalResult CIRToLLVMBitClrsbOpLowering::matchAndRewrite(
464475
cir::BitClrsbOp op, OpAdaptor adaptor,
465476
mlir::ConversionPatternRewriter &rewriter) const {
@@ -2066,6 +2077,7 @@ void ConvertCIRToLLVMPass::runOnOperation() {
20662077
patterns.add<
20672078
// clang-format off
20682079
CIRToLLVMAssumeOpLowering,
2080+
CIRToLLVMAssumeSepStorageOpLowering,
20692081
CIRToLLVMBaseClassAddrOpLowering,
20702082
CIRToLLVMBinOpLowering,
20712083
CIRToLLVMBitClrsbOpLowering,

clang/lib/CIR/Lowering/DirectToLLVM/LowerToLLVM.h

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -44,6 +44,16 @@ class CIRToLLVMAssumeOpLowering
4444
mlir::ConversionPatternRewriter &) const override;
4545
};
4646

47+
class CIRToLLVMAssumeSepStorageOpLowering
48+
: public mlir::OpConversionPattern<cir::AssumeSepStorageOp> {
49+
public:
50+
using mlir::OpConversionPattern<cir::AssumeSepStorageOp>::OpConversionPattern;
51+
52+
mlir::LogicalResult
53+
matchAndRewrite(cir::AssumeSepStorageOp op, OpAdaptor,
54+
mlir::ConversionPatternRewriter &) const override;
55+
};
56+
4757
class CIRToLLVMBitClrsbOpLowering
4858
: public mlir::OpConversionPattern<cir::BitClrsbOp> {
4959
public:

clang/test/CIR/CodeGen/builtin_call.cpp

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -111,6 +111,22 @@ void assume(bool arg) {
111111
// OGCG: call void @llvm.assume(i1 %{{.+}})
112112
// OGCG: }
113113

114+
void assume_separate_storage(void *p1, void *p2) {
115+
__builtin_assume_separate_storage(p1, p2);
116+
}
117+
118+
// CIR: cir.func{{.*}} @_Z23assume_separate_storagePvS_
119+
// CIR: cir.assume_separate_storage %{{.+}}, %{{.+}} : !cir.ptr<!void>
120+
// CIR: }
121+
122+
// LLVM: define {{.*}}void @_Z23assume_separate_storagePvS_
123+
// LLVM: call void @llvm.assume(i1 true) [ "separate_storage"(ptr %{{.+}}, ptr %{{.+}}) ]
124+
// LLVM: }
125+
126+
// OGCG: define {{.*}}void @_Z23assume_separate_storagePvS_
127+
// OGCG: call void @llvm.assume(i1 true) [ "separate_storage"(ptr %{{.+}}, ptr %{{.+}}) ]
128+
// OGCG: }
129+
114130
void expect(int x, int y) {
115131
__builtin_expect(x, y);
116132
}

0 commit comments

Comments
 (0)