1; NOTE: Assertions have been autogenerated by utils/update_test_checks.py 2; RUN: opt -S -passes=instcombine < %s | FileCheck %s 3 4define double @fdiv_cos_sin(double %a) { 5; CHECK-LABEL: @fdiv_cos_sin( 6; CHECK-NEXT: [[TMP1:%.*]] = call double @llvm.cos.f64(double [[A:%.*]]) 7; CHECK-NEXT: [[TMP2:%.*]] = call double @llvm.sin.f64(double [[A]]) 8; CHECK-NEXT: [[DIV:%.*]] = fdiv double [[TMP1]], [[TMP2]] 9; CHECK-NEXT: ret double [[DIV]] 10; 11 %1 = call double @llvm.cos.f64(double %a) 12 %2 = call double @llvm.sin.f64(double %a) 13 %div = fdiv double %1, %2 14 ret double %div 15} 16 17define double @fdiv_strict_cos_strict_sin_reassoc(double %a) { 18; CHECK-LABEL: @fdiv_strict_cos_strict_sin_reassoc( 19; CHECK-NEXT: [[TMP1:%.*]] = call double @llvm.cos.f64(double [[A:%.*]]) 20; CHECK-NEXT: [[TMP2:%.*]] = call reassoc double @llvm.sin.f64(double [[A]]) 21; CHECK-NEXT: [[DIV:%.*]] = fdiv double [[TMP1]], [[TMP2]] 22; CHECK-NEXT: ret double [[DIV]] 23; 24 %1 = call double @llvm.cos.f64(double %a) 25 %2 = call reassoc double @llvm.sin.f64(double %a) 26 %div = fdiv double %1, %2 27 ret double %div 28} 29 30define double @fdiv_reassoc_cos_strict_sin_strict(double %a, ptr dereferenceable(2) %dummy) { 31; CHECK-LABEL: @fdiv_reassoc_cos_strict_sin_strict( 32; CHECK-NEXT: [[TAN:%.*]] = call reassoc double @tan(double [[A:%.*]]) #[[ATTR1:[0-9]+]] 33; CHECK-NEXT: [[DIV:%.*]] = fdiv reassoc double 1.000000e+00, [[TAN]] 34; CHECK-NEXT: ret double [[DIV]] 35; 36 %1 = call double @llvm.cos.f64(double %a) 37 %2 = call double @llvm.sin.f64(double %a) 38 %div = fdiv reassoc double %1, %2 39 ret double %div 40} 41 42define double @fdiv_reassoc_cos_reassoc_sin_strict(double %a) { 43; CHECK-LABEL: @fdiv_reassoc_cos_reassoc_sin_strict( 44; CHECK-NEXT: [[TAN:%.*]] = call reassoc double @tan(double [[A:%.*]]) #[[ATTR1]] 45; CHECK-NEXT: [[DIV:%.*]] = fdiv reassoc double 1.000000e+00, [[TAN]] 46; CHECK-NEXT: ret double [[DIV]] 47; 48 %1 = call reassoc double @llvm.cos.f64(double %a) 49 %2 = call double @llvm.sin.f64(double %a) 50 %div = fdiv reassoc double %1, %2 51 ret double %div 52} 53 54define double @fdiv_cos_sin_reassoc_multiple_uses(double %a) { 55; CHECK-LABEL: @fdiv_cos_sin_reassoc_multiple_uses( 56; CHECK-NEXT: [[TMP1:%.*]] = call reassoc double @llvm.cos.f64(double [[A:%.*]]) 57; CHECK-NEXT: [[TMP2:%.*]] = call reassoc double @llvm.sin.f64(double [[A]]) 58; CHECK-NEXT: [[DIV:%.*]] = fdiv reassoc double [[TMP1]], [[TMP2]] 59; CHECK-NEXT: call void @use(double [[TMP2]]) 60; CHECK-NEXT: ret double [[DIV]] 61; 62 %1 = call reassoc double @llvm.cos.f64(double %a) 63 %2 = call reassoc double @llvm.sin.f64(double %a) 64 %div = fdiv reassoc double %1, %2 65 call void @use(double %2) 66 ret double %div 67} 68 69define double @fdiv_cos_sin_reassoc(double %a) { 70; CHECK-LABEL: @fdiv_cos_sin_reassoc( 71; CHECK-NEXT: [[TAN:%.*]] = call reassoc double @tan(double [[A:%.*]]) #[[ATTR1]] 72; CHECK-NEXT: [[DIV:%.*]] = fdiv reassoc double 1.000000e+00, [[TAN]] 73; CHECK-NEXT: ret double [[DIV]] 74; 75 %1 = call reassoc double @llvm.cos.f64(double %a) 76 %2 = call reassoc double @llvm.sin.f64(double %a) 77 %div = fdiv reassoc double %1, %2 78 ret double %div 79} 80 81define half @fdiv_cosf16_sinf16_reassoc(half %a) { 82; CHECK-LABEL: @fdiv_cosf16_sinf16_reassoc( 83; CHECK-NEXT: [[TMP1:%.*]] = call reassoc half @llvm.cos.f16(half [[A:%.*]]) 84; CHECK-NEXT: [[TMP2:%.*]] = call reassoc half @llvm.sin.f16(half [[A]]) 85; CHECK-NEXT: [[DIV:%.*]] = fdiv reassoc half [[TMP1]], [[TMP2]] 86; CHECK-NEXT: ret half [[DIV]] 87; 88 %1 = call reassoc half @llvm.cos.f16(half %a) 89 %2 = call reassoc half @llvm.sin.f16(half %a) 90 %div = fdiv reassoc half %1, %2 91 ret half %div 92} 93 94define float @fdiv_cosf_sinf_reassoc(float %a) { 95; CHECK-LABEL: @fdiv_cosf_sinf_reassoc( 96; CHECK-NEXT: [[TANF:%.*]] = call reassoc float @tanf(float [[A:%.*]]) #[[ATTR1]] 97; CHECK-NEXT: [[DIV:%.*]] = fdiv reassoc float 1.000000e+00, [[TANF]] 98; CHECK-NEXT: ret float [[DIV]] 99; 100 %1 = call reassoc float @llvm.cos.f32(float %a) 101 %2 = call reassoc float @llvm.sin.f32(float %a) 102 %div = fdiv reassoc float %1, %2 103 ret float %div 104} 105 106define fp128 @fdiv_cosfp128_sinfp128_reassoc(fp128 %a) { 107; CHECK-LABEL: @fdiv_cosfp128_sinfp128_reassoc( 108; CHECK-NEXT: [[TANL:%.*]] = call reassoc fp128 @tanl(fp128 [[A:%.*]]) #[[ATTR1]] 109; CHECK-NEXT: [[DIV:%.*]] = fdiv reassoc fp128 0xL00000000000000003FFF000000000000, [[TANL]] 110; CHECK-NEXT: ret fp128 [[DIV]] 111; 112 %1 = call reassoc fp128 @llvm.cos.fp128(fp128 %a) 113 %2 = call reassoc fp128 @llvm.sin.fp128(fp128 %a) 114 %div = fdiv reassoc fp128 %1, %2 115 ret fp128 %div 116} 117 118declare half @llvm.cos.f16(half) #1 119declare float @llvm.cos.f32(float) #1 120declare double @llvm.cos.f64(double) #1 121declare fp128 @llvm.cos.fp128(fp128) #1 122 123declare half @llvm.sin.f16(half) #1 124declare float @llvm.sin.f32(float) #1 125declare double @llvm.sin.f64(double) #1 126declare fp128 @llvm.sin.fp128(fp128) #1 127 128declare void @use(double) 129 130attributes #0 = { nounwind readnone speculatable } 131attributes #1 = { nounwind readnone } 132