From eb5604a7281cabed331c1a0f3d491868184ce5e2 Mon Sep 17 00:00:00 2001 From: Chuanqi Xu Date: Tue, 15 Oct 2024 11:08:46 +0800 Subject: [PATCH] update --- clang/include/clang/CIR/Dialect/IR/CIROps.td | 2 +- .../include/clang/CIR/Dialect/IR/CIRTypes.td | 3 +- clang/lib/CIR/CodeGen/CIRGenBuilder.h | 2 +- .../CIR/Lowering/DirectToLLVM/LowerToLLVM.cpp | 8 ++-- clang/test/CIR/CodeGen/builtin-isfpclass.c | 48 +++++++------------ 5 files changed, 24 insertions(+), 39 deletions(-) diff --git a/clang/include/clang/CIR/Dialect/IR/CIROps.td b/clang/include/clang/CIR/Dialect/IR/CIROps.td index 6b2cd0835594..55e8aaf86708 100644 --- a/clang/include/clang/CIR/Dialect/IR/CIROps.td +++ b/clang/include/clang/CIR/Dialect/IR/CIROps.td @@ -4046,7 +4046,7 @@ def IsFPClassOp : CIR_Op<"is_fp_class"> { }]; let arguments = (ins CIR_AnyFloat:$src, - UInt32:$flags); + I32Attr:$flags); let results = (outs CIR_BoolType:$result); let assemblyFormat = [{ `(` $src`,` $flags `)` `:` functional-type($src, $result) attr-dict diff --git a/clang/include/clang/CIR/Dialect/IR/CIRTypes.td b/clang/include/clang/CIR/Dialect/IR/CIRTypes.td index c4766f2cb28f..7da8a6800b4a 100644 --- a/clang/include/clang/CIR/Dialect/IR/CIRTypes.td +++ b/clang/include/clang/CIR/Dialect/IR/CIRTypes.td @@ -193,7 +193,8 @@ def CIR_LongDouble : CIR_FloatType<"LongDouble", "long_double"> { // Constraints -def CIR_AnyFloat: AnyTypeOf<[CIR_Single, CIR_Double, CIR_FP80, CIR_LongDouble, CIR_FP16, CIR_BFloat16]>; +def CIR_AnyFloat: AnyTypeOf<[CIR_Single, CIR_Double, CIR_FP80, CIR_LongDouble, + CIR_FP16, CIR_BFloat16]>; def CIR_AnyIntOrFloat: AnyTypeOf<[CIR_AnyFloat, CIR_IntType]>; //===----------------------------------------------------------------------===// diff --git a/clang/lib/CIR/CodeGen/CIRGenBuilder.h b/clang/lib/CIR/CodeGen/CIRGenBuilder.h index 2d2e72edd8b3..55b951244a41 100644 --- a/clang/lib/CIR/CodeGen/CIRGenBuilder.h +++ b/clang/lib/CIR/CodeGen/CIRGenBuilder.h @@ -570,7 +570,7 @@ class CIRGenBuilderTy : public CIRBaseBuilderTy { mlir::cir::IsFPClassOp createIsFPClass(mlir::Location loc, mlir::Value src, unsigned flags) { - return create(loc, src, getUInt32(flags, loc)); + return create(loc, src, flags); } /// Create constant nullptr for pointer-to-data-member type ty. diff --git a/clang/lib/CIR/Lowering/DirectToLLVM/LowerToLLVM.cpp b/clang/lib/CIR/Lowering/DirectToLLVM/LowerToLLVM.cpp index 3d6b21dc8962..fd87234c9e43 100644 --- a/clang/lib/CIR/Lowering/DirectToLLVM/LowerToLLVM.cpp +++ b/clang/lib/CIR/Lowering/DirectToLLVM/LowerToLLVM.cpp @@ -4072,11 +4072,11 @@ class CIRIsFPClassOpLowering auto loc = op->getLoc(); - auto intrinsic = createCallLLVMIntrinsicOp( - rewriter, loc, "llvm.is.fpclass", retTy, mlir::ValueRange{src, flags}); + auto intrinsic = + rewriter.create(loc, retTy, src, flags); // FIMXE: CIR now will convert cir::BoolType to i8 type unconditionally. - // Remove this conversion and use replaceOpWithCallLLVMIntrinsicOp after we - // fix https://github.com/llvm/clangir/issues/480 + // Remove this conversion after we fix + // https://github.com/llvm/clangir/issues/480 auto converted = rewriter.create( loc, rewriter.getI8Type(), intrinsic->getResult(0)); diff --git a/clang/test/CIR/CodeGen/builtin-isfpclass.c b/clang/test/CIR/CodeGen/builtin-isfpclass.c index bffcdd312ef0..2de6f9fcebc6 100644 --- a/clang/test/CIR/CodeGen/builtin-isfpclass.c +++ b/clang/test/CIR/CodeGen/builtin-isfpclass.c @@ -7,47 +7,35 @@ int finite(double); void test_is_finite(__fp16 *H, float F, double D, long double LD) { volatile int res; res = __builtin_isinf(*H); - // CHECK: %[[INF_MASK:.+]] = cir.const #cir.int<516> - // CHECK: cir.is_fp_class(%{{.*}}, %[[INF_MASK]]) : (!cir.f16) -> !cir.bool + // CHECK: cir.is_fp_class(%{{.*}}, 516) : (!cir.f16) -> !cir.bool res = __builtin_isinf(F); - // CHECK: %[[INF_MASK_1:.+]] = cir.const #cir.int<516> - // CHECK: cir.is_fp_class(%{{.*}}, %[[INF_MASK_1]]) : (!cir.float) -> !cir.bool + // CHECK: cir.is_fp_class(%{{.*}}, 516) : (!cir.float) -> !cir.bool res = __builtin_isinf(D); - // CHECK: %[[INF_MASK_2:.+]] = cir.const #cir.int<516> - // CHECK: cir.is_fp_class(%{{.*}}, %[[INF_MASK_2]]) : (!cir.double) -> !cir.bool + // CHECK: cir.is_fp_class(%{{.*}}, 516) : (!cir.double) -> !cir.bool res = __builtin_isinf(LD); - // CHECK: %[[INF_MASK_3:.+]] = cir.const #cir.int<516> - // CHECK: cir.is_fp_class(%{{.*}}, %[[INF_MASK_3]]) : (!cir.long_double) -> !cir.bool + // CHECK: cir.is_fp_class(%{{.*}}, 516) : (!cir.long_double) -> !cir.bool res = __builtin_isfinite(*H); - // CHECK: %[[FINITE_MASK:.+]] = cir.const #cir.int<504> - // CHECK: cir.is_fp_class(%{{.*}}, %[[FINITE_MASK]]) : (!cir.f16) -> !cir.bool + // CHECK: cir.is_fp_class(%{{.*}}, 504) : (!cir.f16) -> !cir.bool res = __builtin_isfinite(F); - // CHECK: %[[FINITE_MASK_1:.+]] = cir.const #cir.int<504> - // CHECK: cir.is_fp_class(%{{.*}}, %[[FINITE_MASK_1]]) : (!cir.float) -> !cir.bool + // CHECK: cir.is_fp_class(%{{.*}}, 504) : (!cir.float) -> !cir.bool res = finite(D); - // CHECK: %[[FINITE_MASK_2:.+]] = cir.const #cir.int<504> - // CHECK: cir.is_fp_class(%{{.*}}, %[[FINITE_MASK_2]]) : (!cir.double) -> !cir.bool + // CHECK: cir.is_fp_class(%{{.*}}, 504) : (!cir.double) -> !cir.bool res = __builtin_isnormal(*H); - // CHECK: %[[NORMAL_MASK:.+]] = cir.const #cir.int<264> - // CHECK: cir.is_fp_class(%{{.*}}, %[[NORMAL_MASK]]) : (!cir.f16) -> !cir.bool + // CHECK: cir.is_fp_class(%{{.*}}, 264) : (!cir.f16) -> !cir.bool res = __builtin_isnormal(F); - // CHECK: %[[NORMAL_MASK_2:.+]] = cir.const #cir.int<264> - // CHECK: cir.is_fp_class(%{{.*}}, %[[NORMAL_MASK_2]]) : (!cir.float) -> !cir.bool + // CHECK: cir.is_fp_class(%{{.*}}, 264) : (!cir.float) -> !cir.bool res = __builtin_issubnormal(F); - // CHECK: %[[SUBNORMAL:.+]] = cir.const #cir.int<144> - // CHECK: cir.is_fp_class(%{{.*}}, %[[SUBNORMAL]]) : (!cir.float) -> !cir.bool + // CHECK: cir.is_fp_class(%{{.*}}, 144) : (!cir.float) -> !cir.bool res = __builtin_iszero(F); - // CHECK: %[[SUBNORMAL:.+]] = cir.const #cir.int<96> - // CHECK: cir.is_fp_class(%{{.*}}, %[[SUBNORMAL]]) : (!cir.float) -> !cir.bool + // CHECK: cir.is_fp_class(%{{.*}}, 96) : (!cir.float) -> !cir.bool res = __builtin_issignaling(F); - // CHECK: %[[SUBNORMAL:.+]] = cir.const #cir.int<1> - // CHECK: cir.is_fp_class(%{{.*}}, %[[SUBNORMAL]]) : (!cir.float) -> !cir.bool + // CHECK: cir.is_fp_class(%{{.*}}, 1) : (!cir.float) -> !cir.bool } _Bool check_isfpclass_finite(float x) { @@ -55,16 +43,14 @@ _Bool check_isfpclass_finite(float x) { } // CHECK: cir.func {{.*}}@check_isfpclass_finite -// CHECK: %[[FINITE_MASK:.+]] = cir.const #cir.int<504> -// CHECK: cir.is_fp_class(%{{.*}}, %[[FINITE_MASK]]) : (!cir.float) +// CHECK: cir.is_fp_class(%{{.*}}, 504) : (!cir.float) _Bool check_isfpclass_nan_f32(float x) { return __builtin_isfpclass(x, 3 /*NaN*/); } // CHECK: cir.func {{.*}}@check_isfpclass_nan_f32 -// CHECK: %[[NAN_MASK:.+]] = cir.const #cir.int<3> -// CHECK: cir.is_fp_class(%{{.*}}, %[[NAN_MASK]]) : (!cir.float) +// CHECK: cir.is_fp_class(%{{.*}}, 3) : (!cir.float) _Bool check_isfpclass_snan_f64(double x) { @@ -72,8 +58,7 @@ _Bool check_isfpclass_snan_f64(double x) { } // CHECK: cir.func {{.*}}@check_isfpclass_snan_f64 -// CHECK: %[[SNAN_MASK:.+]] = cir.const #cir.int<1> -// CHECK: cir.is_fp_class(%{{.*}}, %[[SNAN_MASK]]) : (!cir.double) +// CHECK: cir.is_fp_class(%{{.*}}, 1) : (!cir.double) _Bool check_isfpclass_zero_f16(_Float16 x) { @@ -81,8 +66,7 @@ _Bool check_isfpclass_zero_f16(_Float16 x) { } // CHECK: cir.func {{.*}}@check_isfpclass_zero_f16 -// CHECK: %[[SNAN_MASK:.+]] = cir.const #cir.int<96> -// CHECK: cir.is_fp_class(%{{.*}}, %[[SNAN_MASK]]) : (!cir.f16) +// CHECK: cir.is_fp_class(%{{.*}}, 96) : (!cir.f16) // Update when we support FP pragma in functions and can convert BoolType in prvalue to i1.