Skip to content

Commit

Permalink
update
Browse files Browse the repository at this point in the history
  • Loading branch information
ChuanqiXu9 committed Oct 15, 2024
1 parent 0616ae3 commit eb5604a
Show file tree
Hide file tree
Showing 5 changed files with 24 additions and 39 deletions.
2 changes: 1 addition & 1 deletion clang/include/clang/CIR/Dialect/IR/CIROps.td
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down
3 changes: 2 additions & 1 deletion clang/include/clang/CIR/Dialect/IR/CIRTypes.td
Original file line number Diff line number Diff line change
Expand Up @@ -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]>;

//===----------------------------------------------------------------------===//
Expand Down
2 changes: 1 addition & 1 deletion clang/lib/CIR/CodeGen/CIRGenBuilder.h
Original file line number Diff line number Diff line change
Expand Up @@ -570,7 +570,7 @@ class CIRGenBuilderTy : public CIRBaseBuilderTy {

mlir::cir::IsFPClassOp createIsFPClass(mlir::Location loc, mlir::Value src,
unsigned flags) {
return create<mlir::cir::IsFPClassOp>(loc, src, getUInt32(flags, loc));
return create<mlir::cir::IsFPClassOp>(loc, src, flags);
}

/// Create constant nullptr for pointer-to-data-member type ty.
Expand Down
8 changes: 4 additions & 4 deletions clang/lib/CIR/Lowering/DirectToLLVM/LowerToLLVM.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -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<mlir::LLVM::IsFPClass>(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<mlir::LLVM::ZExtOp>(
loc, rewriter.getI8Type(), intrinsic->getResult(0));

Expand Down
48 changes: 16 additions & 32 deletions clang/test/CIR/CodeGen/builtin-isfpclass.c
Original file line number Diff line number Diff line change
Expand Up @@ -7,82 +7,66 @@ 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.f80>) -> !cir.bool
// CHECK: cir.is_fp_class(%{{.*}}, 516) : (!cir.long_double<!cir.f80>) -> !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) {
return __builtin_isfpclass(x, 504 /*Finite*/);
}

// 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) {
return __builtin_isfpclass(x, 1 /*SNaN*/);
}

// 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) {
return __builtin_isfpclass(x, 96 /*Zero*/);
}

// 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.

Expand Down

0 comments on commit eb5604a

Please sign in to comment.