147 lines · c
1// RUN: %clang_cc1 %s -O0 -emit-llvm -triple x86_64-unknown-unknown -o - | FileCheck %s --check-prefix=X862// RUN: %clang_cc1 %s -O0 -triple x86_64-unknown-unknown -ast-dump | FileCheck %s --check-prefix=AST3 4// Check that for 'F _Complex + int' (F = real floating-point type), we emit an5// implicit cast from 'int' to 'F', but NOT to 'F _Complex' (i.e. that we do6// 'F _Complex + F', NOT 'F _Complex + F _Complex'), and likewise for -/*.7 8// AST-NOT: FloatingRealToComplex9 10float _Complex add_float_ci(float _Complex a, int b) {11 // X86-LABEL: @add_float_ci12 // X86: [[I:%.*]] = sitofp i32 {{%.*}} to float13 // X86: fadd float {{.*}}, [[I]]14 // X86-NOT: fadd15 return a + b;16}17 18float _Complex add_float_ic(int a, float _Complex b) {19 // X86-LABEL: @add_float_ic20 // X86: [[I:%.*]] = sitofp i32 {{%.*}} to float21 // X86: fadd float [[I]]22 // X86-NOT: fadd23 return a + b;24}25 26float _Complex sub_float_ci(float _Complex a, int b) {27 // X86-LABEL: @sub_float_ci28 // X86: [[I:%.*]] = sitofp i32 {{%.*}} to float29 // X86: fsub float {{.*}}, [[I]]30 // X86-NOT: fsub31 return a - b;32}33 34float _Complex sub_float_ic(int a, float _Complex b) {35 // X86-LABEL: @sub_float_ic36 // X86: [[I:%.*]] = sitofp i32 {{%.*}} to float37 // X86: fsub float [[I]]38 // X86: fneg39 // X86-NOT: fsub40 return a - b;41}42 43float _Complex mul_float_ci(float _Complex a, int b) {44 // X86-LABEL: @mul_float_ci45 // X86: [[I:%.*]] = sitofp i32 {{%.*}} to float46 // X86: fmul float {{.*}}, [[I]]47 // X86: fmul float {{.*}}, [[I]]48 // X86-NOT: fmul49 return a * b;50}51 52float _Complex mul_float_ic(int a, float _Complex b) {53 // X86-LABEL: @mul_float_ic54 // X86: [[I:%.*]] = sitofp i32 {{%.*}} to float55 // X86: fmul float [[I]]56 // X86: fmul float [[I]]57 // X86-NOT: fmul58 return a * b;59}60 61float _Complex div_float_ci(float _Complex a, int b) {62 // X86-LABEL: @div_float_ci63 // X86: [[I:%.*]] = sitofp i32 {{%.*}} to float64 // X86: fdiv float {{.*}}, [[I]]65 // X86: fdiv float {{.*}}, [[I]]66 // X86-NOT: @__divsc367 return a / b;68}69 70// There is no good way of doing this w/o converting the 'int' to a complex71// number, so we expect complex division here.72float _Complex div_float_ic(int a, float _Complex b) {73 // X86-LABEL: @div_float_ic74 // X86: [[I:%.*]] = sitofp i32 {{%.*}} to float75 // X86: call {{.*}} @__divsc3(float {{.*}} [[I]], float noundef 0.{{0+}}e+00, float {{.*}}, float {{.*}})76 return a / b;77}78 79double _Complex add_double_ci(double _Complex a, int b) {80 // X86-LABEL: @add_double_ci81 // X86: [[I:%.*]] = sitofp i32 {{%.*}} to double82 // X86: fadd double {{.*}}, [[I]]83 // X86-NOT: fadd84 return a + b;85}86 87double _Complex add_double_ic(int a, double _Complex b) {88 // X86-LABEL: @add_double_ic89 // X86: [[I:%.*]] = sitofp i32 {{%.*}} to double90 // X86: fadd double [[I]]91 // X86-NOT: fadd92 return a + b;93}94 95double _Complex sub_double_ci(double _Complex a, int b) {96 // X86-LABEL: @sub_double_ci97 // X86: [[I:%.*]] = sitofp i32 {{%.*}} to double98 // X86: fsub double {{.*}}, [[I]]99 // X86-NOT: fsub100 return a - b;101}102 103double _Complex sub_double_ic(int a, double _Complex b) {104 // X86-LABEL: @sub_double_ic105 // X86: [[I:%.*]] = sitofp i32 {{%.*}} to double106 // X86: fsub double [[I]]107 // X86: fneg108 // X86-NOT: fsub109 return a - b;110}111 112double _Complex mul_double_ci(double _Complex a, int b) {113 // X86-LABEL: @mul_double_ci114 // X86: [[I:%.*]] = sitofp i32 {{%.*}} to double115 // X86: fmul double {{.*}}, [[I]]116 // X86: fmul double {{.*}}, [[I]]117 // X86-NOT: fmul118 return a * b;119}120 121double _Complex mul_double_ic(int a, double _Complex b) {122 // X86-LABEL: @mul_double_ic123 // X86: [[I:%.*]] = sitofp i32 {{%.*}} to double124 // X86: fmul double [[I]]125 // X86: fmul double [[I]]126 // X86-NOT: fmul127 return a * b;128}129 130double _Complex div_double_ci(double _Complex a, int b) {131 // X86-LABEL: @div_double_ci132 // X86: [[I:%.*]] = sitofp i32 {{%.*}} to double133 // X86: fdiv double {{.*}}, [[I]]134 // X86: fdiv double {{.*}}, [[I]]135 // X86-NOT: @__divdc3136 return a / b;137}138 139// There is no good way of doing this w/o converting the 'int' to a complex140// number, so we expect complex division here.141double _Complex div_double_ic(int a, double _Complex b) {142 // X86-LABEL: @div_double_ic143 // X86: [[I:%.*]] = sitofp i32 {{%.*}} to double144 // X86: call {{.*}} @__divdc3(double {{.*}} [[I]], double noundef 0.{{0+}}e+00, double {{.*}}, double {{.*}})145 return a / b;146}147