-
Notifications
You must be signed in to change notification settings - Fork 15.1k
[CIR] Upstream FPToFPBuiltin ASinOp #157350
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Conversation
|
@llvm/pr-subscribers-clangir @llvm/pr-subscribers-clang Author: Amr Hesham (AmrDeveloper) ChangesUpstream support for FPToFPBuiltin ASinOp Full diff: https://github.com/llvm/llvm-project/pull/157350.diff 5 Files Affected:
diff --git a/clang/include/clang/CIR/Dialect/IR/CIROps.td b/clang/include/clang/CIR/Dialect/IR/CIROps.td
index 4592078af966b..6534104703182 100644
--- a/clang/include/clang/CIR/Dialect/IR/CIROps.td
+++ b/clang/include/clang/CIR/Dialect/IR/CIROps.td
@@ -3808,6 +3808,16 @@ def CIR_ACosOp : CIR_UnaryFPToFPBuiltinOp<"acos", "ACosOp"> {
}];
}
+def CIR_ASinOp : CIR_UnaryFPToFPBuiltinOp<"asin", "ASinOp"> {
+ let summary = "Computes the arcus sine of the specified value";
+ let description = [{
+ `cir.asin`computes the arcus sine of a given value and
+ returns a result of the same type.
+
+ Floating-point exceptions are ignored, and it does not set `errno`.
+ }];
+}
+
def CIR_FAbsOp : CIR_UnaryFPToFPBuiltinOp<"fabs", "FAbsOp"> {
let summary = "Computes the floating-point absolute value";
let description = [{
diff --git a/clang/lib/CIR/CodeGen/CIRGenBuiltin.cpp b/clang/lib/CIR/CodeGen/CIRGenBuiltin.cpp
index b68e91f64dc84..eb524ea41f1ea 100644
--- a/clang/lib/CIR/CodeGen/CIRGenBuiltin.cpp
+++ b/clang/lib/CIR/CodeGen/CIRGenBuiltin.cpp
@@ -360,6 +360,8 @@ RValue CIRGenFunction::emitBuiltinExpr(const GlobalDecl &gd, unsigned builtinID,
case Builtin::BI__builtin_elementwise_acos:
return emitUnaryFPBuiltin<cir::ACosOp>(*this, *e);
+ case Builtin::BI__builtin_elementwise_asin:
+ return emitUnaryFPBuiltin<cir::ASinOp>(*this, *e);
}
// If this is an alias for a lib function (e.g. __builtin_sin), emit
diff --git a/clang/lib/CIR/Lowering/DirectToLLVM/LowerToLLVM.cpp b/clang/lib/CIR/Lowering/DirectToLLVM/LowerToLLVM.cpp
index ee9f58c829ca9..4069656434f07 100644
--- a/clang/lib/CIR/Lowering/DirectToLLVM/LowerToLLVM.cpp
+++ b/clang/lib/CIR/Lowering/DirectToLLVM/LowerToLLVM.cpp
@@ -598,6 +598,15 @@ mlir::LogicalResult CIRToLLVMACosOpLowering::matchAndRewrite(
return mlir::success();
}
+mlir::LogicalResult CIRToLLVMASinOpLowering::matchAndRewrite(
+ cir::ASinOp op, OpAdaptor adaptor,
+ mlir::ConversionPatternRewriter &rewriter) const {
+ mlir::Type resTy = typeConverter->convertType(op.getType());
+ rewriter.replaceOpWithNewOp<mlir::LLVM::ASinOp>(op, resTy,
+ adaptor.getOperands()[0]);
+ return mlir::success();
+}
+
mlir::LogicalResult CIRToLLVMAssumeOpLowering::matchAndRewrite(
cir::AssumeOp op, OpAdaptor adaptor,
mlir::ConversionPatternRewriter &rewriter) const {
@@ -2427,6 +2436,7 @@ void ConvertCIRToLLVMPass::runOnOperation() {
patterns.add<
// clang-format off
CIRToLLVMACosOpLowering,
+ CIRToLLVMASinOpLowering,
CIRToLLVMAssumeOpLowering,
CIRToLLVMAssumeAlignedOpLowering,
CIRToLLVMAssumeSepStorageOpLowering,
diff --git a/clang/lib/CIR/Lowering/DirectToLLVM/LowerToLLVM.h b/clang/lib/CIR/Lowering/DirectToLLVM/LowerToLLVM.h
index 2c2aede09b0b2..e2966f20d2efc 100644
--- a/clang/lib/CIR/Lowering/DirectToLLVM/LowerToLLVM.h
+++ b/clang/lib/CIR/Lowering/DirectToLLVM/LowerToLLVM.h
@@ -736,6 +736,15 @@ class CIRToLLVMACosOpLowering : public mlir::OpConversionPattern<cir::ACosOp> {
mlir::ConversionPatternRewriter &) const override;
};
+class CIRToLLVMASinOpLowering : public mlir::OpConversionPattern<cir::ASinOp> {
+public:
+ using mlir::OpConversionPattern<cir::ASinOp>::OpConversionPattern;
+
+ mlir::LogicalResult
+ matchAndRewrite(cir::ASinOp op, OpAdaptor,
+ mlir::ConversionPatternRewriter &) const override;
+};
+
class CIRToLLVMInlineAsmOpLowering
: public mlir::OpConversionPattern<cir::InlineAsmOp> {
mlir::DataLayout const &dataLayout;
diff --git a/clang/test/CIR/CodeGen/builtins-elementwise.c b/clang/test/CIR/CodeGen/builtins-elementwise.c
index 1898f56a33628..431558d7e9697 100644
--- a/clang/test/CIR/CodeGen/builtins-elementwise.c
+++ b/clang/test/CIR/CodeGen/builtins-elementwise.c
@@ -36,3 +36,29 @@ void test_builtin_elementwise_acos(float f, double d, vfloat4 vf4,
vd4 = __builtin_elementwise_acos(vd4);
}
+void test_builtin_elementwise_asin(float f, double d, vfloat4 vf4,
+ vdouble4 vd4) {
+ // CIR-LABEL: test_builtin_elementwise_asin
+ // LLVM-LABEL: test_builtin_elementwise_asin
+ // OGCG-LABEL: test_builtin_elementwise_asin
+
+ // CIR: %{{.*}} = cir.asin %{{.*}} : !cir.float
+ // LLVM: %{{.*}} = call float @llvm.asin.f32(float %{{.*}})
+ // OGCG: %{{.*}} = call float @llvm.asin.f32(float %{{.*}})
+ f = __builtin_elementwise_asin(f);
+
+ // CIR: %{{.*}} = cir.asin %{{.*}} : !cir.double
+ // LLVM: %{{.*}} = call double @llvm.asin.f64(double %{{.*}})
+ // OGCG: %{{.*}} = call double @llvm.asin.f64(double %{{.*}})
+ d = __builtin_elementwise_asin(d);
+
+ // CIR: %{{.*}} = cir.asin %{{.*}} : !cir.vector<4 x !cir.float>
+ // LLVM: %{{.*}} = call <4 x float> @llvm.asin.v4f32(<4 x float> %{{.*}})
+ // OGCG: %{{.*}} = call <4 x float> @llvm.asin.v4f32(<4 x float> %{{.*}})
+ vf4 = __builtin_elementwise_asin(vf4);
+
+ // CIR: %{{.*}} = cir.asin %{{.*}} : !cir.vector<4 x !cir.double>
+ // LLVM: %{{.*}} = call <4 x double> @llvm.asin.v4f64(<4 x double> %{{.*}})
+ // OGCG: %{{.*}} = call <4 x double> @llvm.asin.v4f64(<4 x double> %{{.*}})
+ vd4 = __builtin_elementwise_asin(vd4);
+}
|
xlauko
left a comment
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
lgtm
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
| rewriter.replaceOpWithNewOp<mlir::LLVM::ASinOp>(op, resTy, | |
| adaptor.getOperands()[0]); | |
| rewriter.replaceOpWithNewOp<mlir::LLVM::ASinOp>(op, resTy, | |
| adaptor.getSrc()); |
d8334fc to
edbdcb1
Compare
|
✅ With the latest revision this PR passed the C/C++ code formatter. |
andykaylor
left a comment
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
lgtm
Upstream support for FPToFPBuiltin ASinOp