242 lines · c
1// RUN: %clang_cc1 %s -O0 -emit-llvm -triple x86_64-unknown-unknown \2// RUN: -o - | FileCheck %s --check-prefix=FULL3 4// RUN: %clang_cc1 %s -O0 -emit-llvm -triple x86_64-unknown-unknown \5// RUN: -complex-range=basic -o - | FileCheck --check-prefix=BASIC %s6 7// RUN: %clang_cc1 %s -O0 -emit-llvm -triple x86_64-unknown-unknown \8// RUN: -fno-cx-limited-range -o - | FileCheck %s --check-prefix=FULL9 10// RUN: %clang_cc1 %s -O0 -emit-llvm -triple x86_64-unknown-unknown \11// RUN: -complex-range=improved -o - | FileCheck --check-prefix=IMPRVD %s12 13// RUN: %clang_cc1 %s -O0 -emit-llvm -triple x86_64-unknown-unknown \14// RUN: -complex-range=promoted -o - | FileCheck --check-prefix=PRMTD %s15 16// RUN: %clang_cc1 %s -O0 -emit-llvm -triple x86_64-unknown-unknown \17// RUN: -complex-range=full -o - | FileCheck --check-prefix=FULL %s18 19_Complex float pragma_on_mul(_Complex float a, _Complex float b) {20#pragma STDC CX_LIMITED_RANGE ON21 // LABEL: define {{.*}} @pragma_on_mul(22 23 // FULL: fmul float24 // FULL-NEXT: fmul float25 // FULL-NEXT: fmul float26 // FULL-NEXT: fmul float27 // FULL-NEXT: fsub float28 // FULL-NEXT: fadd float29 30 // BASIC: fmul float31 // BASIC-NEXT: fmul float32 // BASIC-NEXT: fmul float33 // BASIC-NEXT: fmul float34 // BASIC-NEXT: fsub float35 // BASIC-NEXT: fadd float36 37 // IMPRVD: fmul float38 // IMPRVD-NEXT: fmul float39 // IMPRVD-NEXT: fmul float40 // IMPRVD-NEXT: fmul float41 // IMPRVD-NEXT: fsub float42 // IMPRVD-NEXT: fadd float43 44 // PRMTD: fmul float45 // PRMTD-NEXT: fmul float46 // PRMTD-NEXT: fmul float47 // PRMTD-NEXT: fmul float48 // PRMTD-NEXT: fsub float49 // PRMTD-NEXT: fadd float50 51 return a * b;52}53 54_Complex float pragma_off_mul(_Complex float a, _Complex float b) {55#pragma STDC CX_LIMITED_RANGE OFF56 // LABEL: define {{.*}} @pragma_off_mul(57 58 // FULL: call {{.*}} @__mulsc359 60 // BASIC: call {{.*}} @__mulsc361 62 // IMPRVD: call {{.*}} @__mulsc363 64 // PRMTD: call {{.*}} @__mulsc365 66 return a * b;67}68 69_Complex float pragma_on_div(_Complex float a, _Complex float b) {70#pragma STDC CX_LIMITED_RANGE ON71 // LABEL: define {{.*}} @pragma_on_div(72 73 // FULL: fmul float74 // FULL-NEXT: fmul float75 // FULL-NEXT: fadd float76 // FULL-NEXT: fmul float77 // FULL-NEXT: fmul float78 // FULL-NEXT: fadd float79 // FULL-NEXT: fmul float80 // FULL-NEXT: fmul float81 // FULL-NEXT: fsub float82 // FULL-NEXT: fdiv float83 // FULL: fdiv float84 85 // BASIC: fmul float86 // BASIC-NEXT: fmul float87 // BASIC-NEXT: fadd float88 // BASIC-NEXT: fmul float89 // BASIC-NEXT: fmul float90 // BASIC-NEXT: fadd float91 // BASIC-NEXT: fmul float92 // BASIC-NEXT: fmul float93 // BASIC-NEXT: fsub float94 // BASIC-NEXT: fdiv float95 // BASIC-NEXT: fdiv float96 97 // IMPRVD: fmul float98 // IMPRVD-NEXT: fmul float99 // IMPRVD-NEXT: fadd float100 // IMPRVD-NEXT: fmul float101 // IMPRVD-NEXT: fmul float102 // IMPRVD-NEXT: fadd float103 // IMPRVD-NEXT: fmul float104 // IMPRVD-NEXT: fmul float105 // IMPRVD-NEXT: fsub float106 // IMPRVD-NEXT: fdiv float107 // IMPRVD-NEXT: fdiv float108 109 // PRMTD: fmul float110 // PRMTD-NEXT: fmul float111 // PRMTD-NEXT: fadd float112 // PRMTD-NEXT: fmul float113 // PRMTD-NEXT: fmul float114 // PRMTD-NEXT: fadd float115 // PRMTD-NEXT: fmul float116 // PRMTD-NEXT: fmul float117 // PRMTD-NEXT: fsub float118 // PRMTD-NEXT: fdiv float119 // PRMTD-NEXT: fdiv float120 121 return a / b;122}123 124_Complex float pragma_off_div(_Complex float a, _Complex float b) {125#pragma STDC CX_LIMITED_RANGE OFF126 // LABEL: define {{.*}} @pragma_off_div(127 128 // FULL: call {{.*}} @__divsc3129 130 // BASIC: call {{.*}} @__divsc3131 132 // IMPRVD: call {{.*}} @__divsc3133 134 // PRMTD: call {{.*}} @__divsc3135 136 return a / b;137}138 139_Complex float pragma_default_mul(_Complex float a, _Complex float b) {140#pragma STDC CX_LIMITED_RANGE DEFAULT141 // LABEL: define {{.*}} @pragma_on_mul(142 143 // FULL: fmul float144 // FULL-NEXT: fmul float145 // FULL-NEXT: fmul float146 // FULL-NEXT: fmul float147 // FULL-NEXT: fsub float148 // FULL-NEXT: fadd float149 150 // BASIC: fmul float151 // BASIC-NEXT: fmul float152 // BASIC-NEXT: fmul float153 // BASIC-NEXT: fmul float154 // BASIC-NEXT: fsub float155 // BASIC-NEXT: fadd float156 157 // IMPRVD: fmul float158 // IMPRVD-NEXT: fmul float159 // IMPRVD-NEXT: fmul float160 // IMPRVD-NEXT: fmul float161 // IMPRVD-NEXT: fsub float162 // IMPRVD-NEXT: fadd float163 164 // PRMTD: fmul float165 // PRMTD-NEXT: fmul float166 // PRMTD-NEXT: fmul float167 // PRMTD-NEXT: fmul float168 // PRMTD-NEXT: fsub float169 // PRMTD-NEXT: fadd float170 171 return a * b;172}173_Complex float pragma_default_div(_Complex float a, _Complex float b) {174#pragma STDC CX_LIMITED_RANGE DEFAULT175 // LABEL: define {{.*}} @pragma_on_divx(176 177 // FULL: call {{.*}} @__divsc3178 179 // BASIC: fmul float180 // BASIC-NEXT: fmul float181 // BASIC-NEXT: fadd float182 // BASIC-NEXT: fmul float183 // BASIC-NEXT: fmul float184 // BASIC-NEXT: fadd float185 // BASIC-NEXT: fmul float186 // BASIC-NEXT: fmul float187 // BASIC-NEXT: fsub float188 // BASIC-NEXT: fdiv float189 // BASIC-NEXT: fdiv float190 191 // IMPRVD: call{{.*}}float @llvm.fabs.f32(float {{.*}})192 // IMPRVD-NEXT: call{{.*}}float @llvm.fabs.f32(float {{.*}})193 // IMPRVD-NEXT: fcmp{{.*}}ugt float {{.*}}, {{.*}}194 // IMPRVD-NEXT: br i1 {{.*}}, label195 // IMPRVD: abs_rhsr_greater_or_equal_abs_rhsi:196 // IMPRVD-NEXT: fdiv float197 // IMPRVD-NEXT: fmul float198 // IMPRVD-NEXT: fadd float199 // IMPRVD-NEXT: fmul float200 // IMPRVD-NEXT: fadd float201 // IMPRVD-NEXT: fdiv float202 // IMPRVD-NEXT: fmul float203 // IMPRVD-NEXT: fsub float204 // IMPRVD-NEXT: fdiv float205 // IMPRVD-NEXT: br label206 // IMPRVD: abs_rhsr_less_than_abs_rhsi:207 // IMPRVD-NEXT: fdiv float208 // IMPRVD-NEXT: fmul float209 // IMPRVD-NEXT: fadd float210 // IMPRVD-NEXT: fmul float211 // IMPRVD-NEXT: fadd float212 // IMPRVD-NEXT: fdiv float213 // IMPRVD-NEXT: fmul float214 // IMPRVD-NEXT: fsub float215 // IMPRVD-NEXT: fdiv float216 217 // PRMTD: load float, ptr {{.*}}218 // PRMTD: fpext float {{.*}} to double219 // PRMTD-NEXT: fpext float {{.*}} to double220 // PRMTD-NEXT: getelementptr inbounds nuw { float, float }, ptr {{.*}}, i32 0, i32 0221 // PRMTD-NEXT: load float, ptr {{.*}}222 // PRMTD-NEXT: getelementptr inbounds nuw { float, float }, ptr {{.*}}, i32 0, i32 1223 // PRMTD-NEXT: load float, ptr {{.*}}224 // PRMTD-NEXT: fpext float {{.*}} to double225 // PRMTD-NEXT: fpext float {{.*}} to double226 // PRMTD-NEXT: fmul double227 // PRMTD-NEXT: fmul double228 // PRMTD-NEXT: fadd double229 // PRMTD-NEXT: fmul double230 // PRMTD-NEXT: fmul double231 // PRMTD-NEXT: fadd double232 // PRMTD-NEXT: fmul double233 // PRMTD-NEXT: fmul double234 // PRMTD-NEXT: fsub double235 // PRMTD-NEXT: fdiv double236 // PRMTD-NEXT: fdiv double237 // PRMTD-NEXT: fptrunc double {{.*}} to float238 // PRMTD-NEXT: fptrunc double {{.*}} to float239 240 return a / b;241}242