|
| 1 | +// RUN: %clang_cc1 -triple x86_64-unknown-linux-gnu -fclangir -emit-cir %s -o %t.cir |
| 2 | +// RUN: FileCheck --check-prefix=CIR --input-file=%t.cir %s |
| 3 | +// RUN: %clang_cc1 -triple x86_64-unknown-linux-gnu -fclangir -emit-llvm %s -o %t.ll |
| 4 | +// RUN: FileCheck --check-prefix=LLVM --input-file=%t.ll %s |
| 5 | + |
| 6 | +int test_float_isinf_sign(float x) { |
| 7 | + // CIR-LABEL: test_float_isinf_sign |
| 8 | + // CIR: %[[TMP0:.*]] = cir.load %{{.*}} : !cir.ptr<!cir.float>, !cir.float |
| 9 | + // CIR: %[[TMP1:.*]] = cir.fabs %[[TMP0]] : !cir.float |
| 10 | + // CIR: %[[IS_INF:.*]] = cir.is_fp_class %[[TMP1]], 516 : (!cir.float) -> !cir.bool |
| 11 | + // CIR: %[[IS_NEG:.*]] = cir.signbit %[[TMP0]] : !cir.float -> !cir.bool |
| 12 | + // CIR: %[[C_0:.*]] = cir.const #cir.int<0> : !s32i |
| 13 | + // CIR: %[[C_1:.*]] = cir.const #cir.int<1> : !s32i |
| 14 | + // CIR: %[[C_m1:.*]] = cir.const #cir.int<-1> : !s32i |
| 15 | + // CIR: %[[TMP4:.*]] = cir.select if %[[IS_NEG]] then %[[C_m1]] else %[[C_1]] : (!cir.bool, !s32i, !s32i) -> !s32i |
| 16 | + // CIR: %[[RET:.*]] = cir.select if %[[IS_INF]] then %[[TMP4]] else %[[C_0]] : (!cir.bool, !s32i, !s32i) -> !s32i |
| 17 | + // CIR: cir.store %[[RET]], %{{.*}} : !s32i, !cir.ptr<!s32i> |
| 18 | + |
| 19 | + // LLVM-LABEL: test_float_isinf_sign |
| 20 | + // LLVM: %[[TMP0:.*]] = load float, ptr %{{.*}} |
| 21 | + // LLVM: %[[TMP1:.*]] = call float @llvm.fabs.f32(float %[[TMP0]]) |
| 22 | + // LLVM: %[[IS_INF:.*]] = call i1 @llvm.is.fpclass.f32(float %[[TMP1]], i32 516) |
| 23 | + // LLVM: %[[IS_INF_I8:.*]] = zext i1 %[[IS_INF]] to i8 |
| 24 | + // LLVM: %[[TMP1:.*]] = bitcast float %[[TMP0]] to i32 |
| 25 | + // LLVM: %[[IS_NEG:.*]] = icmp slt i32 %[[TMP1]], 0 |
| 26 | + // LLVM: %[[IS_NEG_I8:.*]] = zext i1 %[[IS_NEG]] to i8 |
| 27 | + // LLVM: %[[IS_NEG_I1:.*]] = trunc i8 %[[IS_NEG_I8]] to i1 |
| 28 | + // LLVM: %[[TMP2:.*]] = select i1 %[[IS_NEG_I1]], i32 -1, i32 1 |
| 29 | + // LLVM: %[[IS_INF_I1:.*]] = trunc i8 %[[IS_INF_I8]] to i1 |
| 30 | + // LLVM: %[[RET:.*]] = select i1 %[[IS_INF_I1]], i32 %[[TMP2]], i32 0 |
| 31 | + // LLVM: store i32 %[[RET]], ptr %{{.*}}, align 4 |
| 32 | + return __builtin_isinf_sign(x); |
| 33 | +} |
0 commit comments