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