brintos

brintos / llvm-project-archived public Read only

0
0
Text · 6.5 KiB · a85661f Raw
183 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --version 52; RUN: opt -S -passes=instcombine < %s | FileCheck %s3 4define double @fmul_tan_cos(double %a) {5; CHECK-LABEL: define double @fmul_tan_cos(6; CHECK-SAME: double [[A:%.*]]) {7; CHECK-NEXT:    [[TAN:%.*]] = call double @llvm.tan.f64(double [[A]])8; CHECK-NEXT:    [[COS:%.*]] = call double @llvm.cos.f64(double [[A]])9; CHECK-NEXT:    [[RES:%.*]] = fmul double [[TAN]], [[COS]]10; CHECK-NEXT:    ret double [[RES]]11;12  %tan = call double @llvm.tan.f64(double %a)13  %cos = call double @llvm.cos.f64(double %a)14  %res = fmul double %tan, %cos15  ret double %res16}17 18define double @fmul_strict_tan_strict_cos_contract(double %a) {19; CHECK-LABEL: define double @fmul_strict_tan_strict_cos_contract(20; CHECK-SAME: double [[A:%.*]]) {21; CHECK-NEXT:    [[TAN:%.*]] = call double @llvm.tan.f64(double [[A]])22; CHECK-NEXT:    [[COS:%.*]] = call contract double @llvm.cos.f64(double [[A]])23; CHECK-NEXT:    [[RES:%.*]] = fmul double [[TAN]], [[COS]]24; CHECK-NEXT:    ret double [[RES]]25;26  %tan = call double @llvm.tan.f64(double %a)27  %cos = call contract double @llvm.cos.f64(double %a)28  %res = fmul double %tan, %cos29  ret double %res30}31 32define double @fmul_contract_tan_strict_cos_strict(double %a) {33; CHECK-LABEL: define double @fmul_contract_tan_strict_cos_strict(34; CHECK-SAME: double [[A:%.*]]) {35; CHECK-NEXT:    [[RES:%.*]] = call contract double @llvm.sin.f64(double [[A]])36; CHECK-NEXT:    ret double [[RES]]37;38  %tan = call double @llvm.tan.f64(double %a)39  %cos = call double @llvm.cos.f64(double %a)40  %res = fmul contract double %tan, %cos41  ret double %res42}43 44define double @fmul_contract_tan_contract_cos_strict(double %a) {45; CHECK-LABEL: define double @fmul_contract_tan_contract_cos_strict(46; CHECK-SAME: double [[A:%.*]]) {47; CHECK-NEXT:    [[RES:%.*]] = call contract double @llvm.sin.f64(double [[A]])48; CHECK-NEXT:    ret double [[RES]]49;50  %tan = call contract double @llvm.tan.f64(double %a)51  %cos = call double @llvm.cos.f64(double %a)52  %res = fmul contract double %tan, %cos53  ret double %res54}55 56define double @fmul_tan_cos_contract_multiple_uses(double %a) {57; CHECK-LABEL: define double @fmul_tan_cos_contract_multiple_uses(58; CHECK-SAME: double [[A:%.*]]) {59; CHECK-NEXT:    [[TAN:%.*]] = call contract double @llvm.tan.f64(double [[A]])60; CHECK-NEXT:    [[COS:%.*]] = call contract double @llvm.cos.f64(double [[A]])61; CHECK-NEXT:    [[RES:%.*]] = fmul contract double [[TAN]], [[COS]]62; CHECK-NEXT:    call void @use(double [[COS]])63; CHECK-NEXT:    ret double [[RES]]64;65  %tan = call contract double @llvm.tan.f64(double %a)66  %cos = call contract double @llvm.cos.f64(double %a)67  %res = fmul contract double %tan, %cos68  call void @use(double %cos)69  ret double %res70}71 72define double @fmul_tan_cos_contract(double %a) {73; CHECK-LABEL: define double @fmul_tan_cos_contract(74; CHECK-SAME: double [[A:%.*]]) {75; CHECK-NEXT:    [[RES:%.*]] = call contract double @llvm.sin.f64(double [[A]])76; CHECK-NEXT:    ret double [[RES]]77;78  %tan = call contract double @llvm.tan.f64(double %a)79  %cos = call contract double @llvm.cos.f64(double %a)80  %res = fmul contract double %tan, %cos81  ret double %res82}83 84define float @fmul_tanf_cosf_contract(float %a) {85; CHECK-LABEL: define float @fmul_tanf_cosf_contract(86; CHECK-SAME: float [[A:%.*]]) {87; CHECK-NEXT:    [[RES:%.*]] = call contract float @llvm.sin.f32(float [[A]])88; CHECK-NEXT:    ret float [[RES]]89;90  %tan = call contract float @llvm.tan.f32(float %a)91  %cos = call contract float @llvm.cos.f32(float %a)92  %res = fmul contract float %tan, %cos93  ret float %res94}95 96define fp128 @fmul_tanfp128_cosfp128_contract(fp128 %a) {97; CHECK-LABEL: define fp128 @fmul_tanfp128_cosfp128_contract(98; CHECK-SAME: fp128 [[A:%.*]]) {99; CHECK-NEXT:    [[RES:%.*]] = call contract fp128 @llvm.sin.f128(fp128 [[A]])100; CHECK-NEXT:    ret fp128 [[RES]]101;102  %tan = call contract fp128 @llvm.tan.fp128(fp128 %a)103  %cos = call contract fp128 @llvm.cos.fp128(fp128 %a)104  %res = fmul contract fp128 %tan, %cos105  ret fp128 %res106}107 108 109define double @commutativity_cos_tan(double %a) {110; CHECK-LABEL: define double @commutativity_cos_tan(111; CHECK-SAME: double [[A:%.*]]) {112; CHECK-NEXT:    [[RES:%.*]] = call contract double @llvm.sin.f64(double [[A]])113; CHECK-NEXT:    ret double [[RES]]114;115  %cos = call contract double @llvm.cos.f64(double %a)116  %tan = call contract double @llvm.tan.f64(double %a)117  %res = fmul contract double %cos, %tan118  ret double %res119}120 121 122define double @tan_cos_value_mismatch(double %a, double %b) {123; CHECK-LABEL: define double @tan_cos_value_mismatch(124; CHECK-SAME: double [[A:%.*]], double [[B:%.*]]) {125; CHECK-NEXT:    [[TAN:%.*]] = call contract double @llvm.tan.f64(double [[A]])126; CHECK-NEXT:    [[COS:%.*]] = call contract double @llvm.cos.f64(double [[B]])127; CHECK-NEXT:    [[RES:%.*]] = fmul contract double [[TAN]], [[COS]]128; CHECK-NEXT:    ret double [[RES]]129;130  %tan = call contract double @llvm.tan.f64(double %a)131  %cos = call contract double @llvm.cos.f64(double %b)132  %res = fmul contract double %tan, %cos133  ret double %res134}135 136 137define <2 x double> @fmul_tan_cos_vector(<2 x double> %a) {138; CHECK-LABEL: define <2 x double> @fmul_tan_cos_vector(139; CHECK-SAME: <2 x double> [[A:%.*]]) {140; CHECK-NEXT:    [[RES:%.*]] = call contract <2 x double> @llvm.sin.v2f64(<2 x double> [[A]])141; CHECK-NEXT:    ret <2 x double> [[RES]]142;143  %tan = call contract <2 x double> @llvm.tan.v2f64(<2 x double> %a)144  %cos = call contract <2 x double> @llvm.cos.v2f64(<2 x double> %a)145  %res = fmul contract <2 x double> %tan, %cos146  ret <2 x double> %res147}148 149 150define double @fmul_tan_cos_nnan_preservation(double %a) {151; CHECK-LABEL: define double @fmul_tan_cos_nnan_preservation(152; CHECK-SAME: double [[A:%.*]]) {153; CHECK-NEXT:    [[RES:%.*]] = call nnan contract double @llvm.sin.f64(double [[A]])154; CHECK-NEXT:    ret double [[RES]]155;156  %tan = call contract double @llvm.tan.f64(double %a)157  %cos = call contract double @llvm.cos.f64(double %a)158  %res = fmul contract nnan double %tan, %cos159  ret double %res160}161 162 163define double @fmul_tan_cos_fpmath_metadata_preservation(double %a) {164; CHECK-LABEL: define double @fmul_tan_cos_fpmath_metadata_preservation(165; CHECK-SAME: double [[A:%.*]]) {166; CHECK-NEXT:    [[RES:%.*]] = call contract double @llvm.sin.f64(double [[A]]), !fpmath [[META0:![0-9]+]]167; CHECK-NEXT:    ret double [[RES]]168;169  %tan = call contract double @llvm.tan.f64(double %a)170  %cos = call contract double @llvm.cos.f64(double %a)171  %res = fmul contract double %tan, %cos, !fpmath !0172  ret double %res173}174 175declare void @use(double)176 177!0 = !{ float 2.5 }178 179 180;.181; CHECK: [[META0]] = !{float 2.500000e+00}182;.183