brintos

brintos / llvm-project-archived public Read only

0
0
Text · 4.7 KiB · 006b5e3 Raw
136 lines · c
1// RUN: %clang_cc1 %s -O0 -emit-llvm -triple x86_64-unknown-unknown \2// RUN: -verify -complex-range=promoted -o - | FileCheck %s3 4// RUN: %clang_cc1 %s -O0 -emit-llvm -triple x86_64-unknown-unknown \5// RUN: -verify=nopromotion -complex-range=promoted -target-feature -x87 \6// RUN: -o - | FileCheck %s --check-prefix=NOX877 8// RUN: %clang_cc1 %s -O0 -emit-llvm -triple x86_64-unknown-windows \9// RUN: -verify=nopromotion -complex-range=promoted -o - \10// RUN: | FileCheck %s --check-prefix=NOX8711 12// RUN: %clang_cc1 %s -O0 -emit-llvm -triple x86_64-unknown-windows \13// RUN: -verify=nopromotion -complex-range=promoted -target-feature -x87 \14// RUN: -o - | FileCheck %s --check-prefix=NOX8715 16 17 18// expected-no-diagnostics19 20// CHECK-LABEL: define dso_local <2 x float> @divd21_Complex float divd(_Complex float a, _Complex float b) {22  // CHECK: fpext float {{.*}} to double23  // CHECK: fpext float {{.*}} to double24  // CHECK: fdiv double25  // CHECK: fdiv double26  // CHECK: fptrunc double {{.*}} to float27  // CHECK: fptrunc double {{.*}} to float28 29  // NOX87: fpext float {{.*}} to double30  // NOX87: fpext float {{.*}} to double31  // NOX87: fdiv double32  // NOX87: fdiv double33  // NOX87: fptrunc double {{.*}} to float34  // NOX87: fptrunc double {{.*}} to float35 36  return a / b;37}38 39// CHECK-LABEL: define dso_local { double, double } @divf40_Complex double divf(_Complex double a, _Complex double b) {41  // CHECK: fpext double {{.*}} to x86_fp8042  // CHECK: fpext double {{.*}} to x86_fp8043  // CHECK: fdiv x86_fp8044  // CHECK: fdiv x86_fp8045  // CHECK: fptrunc x86_fp8046  // CHECK: fptrunc x86_fp8047 48  // NOX87: call double @llvm.fabs.f64(double {{.*}})49  // NOX87-NEXT: call double @llvm.fabs.f64(double {{.*}})50  // NOX87-NEXT: fcmp ugt double %{{.*}}, {{.*}}51  // NOX87-NEXT: br i1 {{.*}}, label52  // NOX87: abs_rhsr_greater_or_equal_abs_rhsi:53  // NOX87-NEXT: fdiv double54  // NOX87-NEXT: fmul double55  // NOX87-NEXT: fadd double56  // NOX87-NEXT: fmul double57  // NOX87-NEXT: fadd double58  // NOX87-NEXT: fdiv double59  // NOX87-NEXT: fmul double60  // NOX87-NEXT: fsub double61  // NOX87-NEXT: fdiv double62  // NOX87-NEXT: br label {{.*}}63  // NOX87: abs_rhsr_less_than_abs_rhsi:64  // NOX87-NEXT: fdiv double65  // NOX87-NEXT: fmul double66  // NOX87-NEXT: fadd double67  // NOX87-NEXT: fmul double68  // NOX87-NEXT: fadd double69  // NOX87-NEXT: fdiv double70  // NOX87-NEXT: fmul double71  // NOX87-NEXT: fsub double72  // NOX87-NEXT: fdiv double73  // NOX87-NEXT: br label74  // NOX87: complex_div:75  // NOX87-NEXT: phi double76  // NOX87-NEXT: phi double77  // NOX87-NEXT: getelementptr inbounds nuw { double, double }, ptr {{.*}}, i32 0, i32 078  // NOX87-NEXT: getelementptr inbounds nuw { double, double }, ptr {{.*}}, i32 0, i32 179  // NOX87-NEXT: store double80  // NOX87-NEXT: store double81 82  return a / b; // nopromotion-warning{{excess precision is requested but the target does not support excess precision which may result in observable differences in complex division behavior}}83}84 85// This test ensures that Clang does not crash when complex element types86// require desugaring under -complex-range=promoted. Previously, a sugared87// typedef element type (e.g., 'typedef double a') caused a crash during88// complex range evaluation in both Sema and CodeGen.89typedef double a;90_Complex double *b;91// CHECK-LABEL: define dso_local void @DivideByComplexZero92void DivideByComplexZero() {93  // CHECK: fpext double {{.*}} to x86_fp8094  // CHECK: fpext double {{.*}} to x86_fp8095  // CHECK: fmul x86_fp8096  // CHECK: fmul x86_fp8097  // CHECK: fadd x86_fp8098  // CHECK: fmul x86_fp8099  // CHECK: fmul x86_fp80100  // CHECK: fsub x86_fp80101  // CHECK: fdiv x86_fp80102  // CHECK: fdiv x86_fp80103  // CHECK: fptrunc x86_fp80104  // CHECK: fptrunc x86_fp80105 106  // NOX87: call double @llvm.fabs.f64(double {{.*}})107  // NOX87-NEXT: call double @llvm.fabs.f64(double {{.*}}108  // NOX87-NEXT: fcmp ugt double {{.*}}, {{.*}}109  // NOX87-NEXT: br i1 {{.*}}, label110  // NOX87: abs_rhsr_greater_or_equal_abs_rhsi:111  // NOX87-NEXT: fmul double112  // NOX87-NEXT: fadd double113  // NOX87-NEXT: fdiv double114  // NOX87-NEXT: fmul double115  // NOX87-NEXT: fsub double116  // NOX87-NEXT: fdiv double117  // NOX87-NEXT: br label {{.*}}118  // NOX87: abs_rhsr_less_than_abs_rhsi:119  // NOX87-NEXT: fmul double120  // NOX87-NEXT: fadd double121  // NOX87-NEXT: fdiv double122  // NOX87-NEXT: fmul double123  // NOX87-NEXT: fsub double124  // NOX87-NEXT: fdiv double125  // NOX87-NEXT: br label {{.*}}126  // NOX87: complex_div:127  // NOX87-NEXT: phi double128  // NOX87-NEXT: phi double129  // NOX87-NEXT: getelementptr inbounds nuw { double, double }, ptr {{.*}}, i32 0, i32 0130  // NOX87-NEXT: getelementptr inbounds nuw { double, double }, ptr {{.*}}, i32 0, i32 1131  // NOX87-NEXT: store double132  // NOX87-NEXT: store double133 134  *b /= 1.0iF * (a)0;135}136