1 ; RUN: opt < %s -libcalls-shrinkwrap -S | FileCheck %s 2 ; New PM 3 ; RUN: opt < %s -passes=libcalls-shrinkwrap -S | FileCheck %s 4 5 target datalayout = "e-m:e-i64:64-f80:128-n8:16:32:64-S128" 6 target triple = "x86_64-unknown-linux-gnu" 7 8 define void @test_range_error(float %value) { 9 entry: 10 %call_0 = call float @coshf(float %value) 11 ; CHECK: [[COND1:%[0-9]+]] = fcmp olt float %value, -8.900000e+01 12 ; CHECK: [[COND2:%[0-9]+]] = fcmp ogt float %value, 8.900000e+01 13 ; CHECK: [[COND:%[0-9]+]] = or i1 [[COND2]], [[COND1]] 14 ; CHECK: br i1 [[COND]], label %[[CALL_LABEL:cdce.call[0-9]*]], label %[[END_LABEL:cdce.end[0-9]*]], !prof ![[BRANCH_WEIGHT:[0-9]+]] 15 ; CHECK: [[CALL_LABEL]]: 16 ; CHECK-NEXT: %call_0 = call float @coshf(float %value) 17 ; CHECK-NEXT: br label %[[END_LABEL]] 18 ; CHECK: [[END_LABEL]]: 19 20 %call_1 = call float @expf(float %value) 21 ; CHECK: [[COND1:%[0-9]+]] = fcmp olt float %value, -1.030000e+02 22 ; CHECK: [[COND2:%[0-9]+]] = fcmp ogt float %value, 8.800000e+01 23 ; CHECK: [[COND:%[0-9]+]] = or i1 [[COND2]], [[COND1]] 24 ; CHECK: br i1 [[COND]], label %[[CALL_LABEL:cdce.call[0-9]*]], label %[[END_LABEL:cdce.end[0-9]*]], !prof ![[BRANCH_WEIGHT]] 25 ; CHECK: [[CALL_LABEL]]: 26 ; CHECK-NEXT: %call_1 = call float @expf(float %value) 27 ; CHECK-NEXT: br label %[[END_LABEL]] 28 ; CHECK: [[END_LABEL]]: 29 30 %call_3 = call float @exp2f(float %value) 31 ; CHECK: [[COND1:%[0-9]+]] = fcmp olt float %value, -1.490000e+02 32 ; CHECK: [[COND2:%[0-9]+]] = fcmp ogt float %value, 1.270000e+02 33 ; CHECK: [[COND:%[0-9]+]] = or i1 [[COND2]], [[COND1]] 34 ; CHECK: br i1 [[COND]], label %[[CALL_LABEL:cdce.call[0-9]*]], label %[[END_LABEL:cdce.end[0-9]*]], !prof ![[BRANCH_WEIGHT]] 35 ; CHECK: [[CALL_LABEL]]: 36 ; CHECK-NEXT: %call_3 = call float @exp2f(float %value) 37 ; CHECK-NEXT: br label %[[END_LABEL]] 38 ; CHECK: [[END_LABEL]]: 39 40 %call_4 = call float @sinhf(float %value) 41 ; CHECK: [[COND1:%[0-9]+]] = fcmp olt float %value, -8.900000e+01 42 ; CHECK: [[COND2:%[0-9]+]] = fcmp ogt float %value, 8.900000e+01 43 ; CHECK: [[COND:%[0-9]+]] = or i1 [[COND2]], [[COND1]] 44 ; CHECK: br i1 [[COND]], label %[[CALL_LABEL:cdce.call[0-9]*]], label %[[END_LABEL:cdce.end[0-9]*]], !prof ![[BRANCH_WEIGHT]] 45 ; CHECK: [[CALL_LABEL]]: 46 ; CHECK-NEXT: %call_4 = call float @sinhf(float %value) 47 ; CHECK-NEXT: br label %[[END_LABEL]] 48 ; CHECK: [[END_LABEL]]: 49 50 %call_5 = call float @expm1f(float %value) 51 ; CHECK: [[COND:%[0-9]+]] = fcmp ogt float %value, 8.800000e+01 52 ; CHECK: br i1 [[COND]], label %[[CALL_LABEL:cdce.call[0-9]*]], label %[[END_LABEL:cdce.end[0-9]*]], !prof ![[BRANCH_WEIGHT]] 53 ; CHECK: [[CALL_LABEL]]: 54 ; CHECK-NEXT: %call_5 = call float @expm1f(float %value) 55 ; CHECK-NEXT: br label %[[END_LABEL]] 56 ; CHECK: [[END_LABEL]]: 57 58 ret void 59 } 60 61 declare float @coshf(float) 62 declare float @expf(float) 63 declare float @exp2f(float) 64 declare float @sinhf(float) 65 declare float @expm1f(float) 66 67 define void @test_domain_error(float %value) { 68 entry: 69 70 %call_00 = call float @acosf(float %value) 71 ; CHECK: [[COND1:%[0-9]+]] = fcmp ogt float %value, 1.000000e+00 72 ; CHECK: [[COND2:%[0-9]+]] = fcmp olt float %value, -1.000000e+00 73 ; CHECK: [[COND:%[0-9]+]] = or i1 [[COND2]], [[COND1]] 74 ; CHECK: br i1 [[COND]], label %[[CALL_LABEL:cdce.call[0-9]*]], label %[[END_LABEL:cdce.end[0-9]*]], !prof ![[BRANCH_WEIGHT]] 75 ; CHECK: [[CALL_LABEL]]: 76 ; CHECK-NEXT: %call_00 = call float @acosf(float %value) 77 ; CHECK-NEXT: br label %[[END_LABEL]] 78 ; CHECK: [[END_LABEL]]: 79 80 %call_01 = call float @asinf(float %value) 81 ; CHECK: [[COND1:%[0-9]+]] = fcmp ogt float %value, 1.000000e+00 82 ; CHECK: [[COND2:%[0-9]+]] = fcmp olt float %value, -1.000000e+00 83 ; CHECK: [[COND:%[0-9]+]] = or i1 [[COND2]], [[COND1]] 84 ; CHECK: br i1 [[COND]], label %[[CALL_LABEL:cdce.call[0-9]*]], label %[[END_LABEL:cdce.end[0-9]*]], !prof ![[BRANCH_WEIGHT]] 85 ; CHECK: [[CALL_LABEL]]: 86 ; CHECK-NEXT: %call_01 = call float @asinf(float %value) 87 ; CHECK-NEXT: br label %[[END_LABEL]] 88 ; CHECK: [[END_LABEL]]: 89 90 %call_02 = call float @cosf(float %value) 91 ; CHECK: [[COND1:%[0-9]+]] = fcmp oeq float %value, 0xFFF0000000000000 92 ; CHECK: [[COND2:%[0-9]+]] = fcmp oeq float %value, 0x7FF0000000000000 93 ; CHECK: [[COND:%[0-9]+]] = or i1 [[COND2]], [[COND1]] 94 ; CHECK: br i1 [[COND]], label %[[CALL_LABEL:cdce.call[0-9]*]], label %[[END_LABEL:cdce.end[0-9]*]], !prof ![[BRANCH_WEIGHT]] 95 ; CHECK: [[CALL_LABEL]]: 96 ; CHECK-NEXT: %call_02 = call float @cosf(float %value) 97 ; CHECK-NEXT: br label %[[END_LABEL]] 98 ; CHECK: [[END_LABEL]]: 99 100 %call_03 = call float @sinf(float %value) 101 ; CHECK: [[COND1:%[0-9]+]] = fcmp oeq float %value, 0xFFF0000000000000 102 ; CHECK: [[COND2:%[0-9]+]] = fcmp oeq float %value, 0x7FF0000000000000 103 ; CHECK: [[COND:%[0-9]+]] = or i1 [[COND2]], [[COND1]] 104 ; CHECK: br i1 [[COND]], label %[[CALL_LABEL:cdce.call[0-9]*]], label %[[END_LABEL:cdce.end[0-9]*]], !prof ![[BRANCH_WEIGHT]] 105 ; CHECK: [[CALL_LABEL]]: 106 ; CHECK-NEXT: %call_03 = call float @sinf(float %value) 107 ; CHECK-NEXT: br label %[[END_LABEL]] 108 ; CHECK: [[END_LABEL]]: 109 110 %call_04 = call float @acoshf(float %value) 111 ; CHECK: [[COND:%[0-9]+]] = fcmp olt float %value, 1.000000e+00 112 ; CHECK: br i1 [[COND]], label %[[CALL_LABEL:cdce.call[0-9]*]], label %[[END_LABEL:cdce.end[0-9]*]], !prof ![[BRANCH_WEIGHT]] 113 ; CHECK: [[CALL_LABEL]]: 114 ; CHECK-NEXT: %call_04 = call float @acoshf(float %value) 115 ; CHECK-NEXT: br label %[[END_LABEL]] 116 ; CHECK: [[END_LABEL]]: 117 118 %call_05 = call float @sqrtf(float %value) 119 ; CHECK: [[COND:%[0-9]+]] = fcmp olt float %value, 0.000000e+00 120 ; CHECK: br i1 [[COND]], label %[[CALL_LABEL:cdce.call[0-9]*]], label %[[END_LABEL:cdce.end[0-9]*]], !prof ![[BRANCH_WEIGHT]] 121 ; CHECK: [[CALL_LABEL]]: 122 ; CHECK-NEXT: %call_05 = call float @sqrtf(float %value) 123 ; CHECK-NEXT: br label %[[END_LABEL]] 124 ; CHECK: [[END_LABEL]]: 125 126 %call_06 = call float @atanhf(float %value) 127 ; CHECK: [[COND1:%[0-9]+]] = fcmp oge float %value, 1.000000e+00 128 ; CHECK: [[COND2:%[0-9]+]] = fcmp ole float %value, -1.000000e+00 129 ; CHECK: [[COND:%[0-9]+]] = or i1 [[COND2]], [[COND1]] 130 ; CHECK: br i1 [[COND]], label %[[CALL_LABEL:cdce.call[0-9]*]], label %[[END_LABEL:cdce.end[0-9]*]], !prof ![[BRANCH_WEIGHT]] 131 ; CHECK: [[CALL_LABEL]]: 132 ; CHECK-NEXT: %call_06 = call float @atanhf(float %value) 133 ; CHECK-NEXT: br label %[[END_LABEL]] 134 ; CHECK: [[END_LABEL]]: 135 136 %call_07 = call float @logf(float %value) 137 ; CHECK: [[COND:%[0-9]+]] = fcmp ole float %value, 0.000000e+00 138 ; CHECK: br i1 [[COND]], label %[[CALL_LABEL:cdce.call[0-9]*]], label %[[END_LABEL:cdce.end[0-9]*]], !prof ![[BRANCH_WEIGHT]] 139 ; CHECK: [[CALL_LABEL]]: 140 ; CHECK-NEXT: %call_07 = call float @logf(float %value) 141 ; CHECK-NEXT: br label %[[END_LABEL]] 142 ; CHECK: [[END_LABEL]]: 143 144 %call_08 = call float @log10f(float %value) 145 ; CHECK: [[COND:%[0-9]+]] = fcmp ole float %value, 0.000000e+00 146 ; CHECK: br i1 [[COND]], label %[[CALL_LABEL:cdce.call[0-9]*]], label %[[END_LABEL:cdce.end[0-9]*]], !prof ![[BRANCH_WEIGHT]] 147 ; CHECK: [[CALL_LABEL]]: 148 ; CHECK-NEXT: %call_08 = call float @log10f(float %value) 149 ; CHECK-NEXT: br label %[[END_LABEL]] 150 ; CHECK: [[END_LABEL]]: 151 152 %call_09 = call float @log2f(float %value) 153 ; CHECK: [[COND:%[0-9]+]] = fcmp ole float %value, 0.000000e+00 154 ; CHECK: br i1 [[COND]], label %[[CALL_LABEL:cdce.call[0-9]*]], label %[[END_LABEL:cdce.end[0-9]*]], !prof ![[BRANCH_WEIGHT]] 155 ; CHECK: [[CALL_LABEL]]: 156 ; CHECK-NEXT: %call_09 = call float @log2f(float %value) 157 ; CHECK-NEXT: br label %[[END_LABEL]] 158 ; CHECK: [[END_LABEL]]: 159 160 %call_10 = call float @logbf(float %value) 161 ; CHECK: [[COND:%[0-9]+]] = fcmp ole float %value, 0.000000e+00 162 ; CHECK: br i1 [[COND]], label %[[CALL_LABEL:cdce.call[0-9]*]], label %[[END_LABEL:cdce.end[0-9]*]], !prof ![[BRANCH_WEIGHT]] 163 ; CHECK: [[CALL_LABEL]]: 164 ; CHECK-NEXT: %call_10 = call float @logbf(float %value) 165 ; CHECK-NEXT: br label %[[END_LABEL]] 166 ; CHECK: [[END_LABEL]]: 167 168 %call_11 = call float @log1pf(float %value) 169 ; CHECK: [[COND:%[0-9]+]] = fcmp ole float %value, -1.000000e+00 170 ; CHECK: br i1 [[COND]], label %[[CALL_LABEL:cdce.call[0-9]*]], label %[[END_LABEL:cdce.end[0-9]*]], !prof ![[BRANCH_WEIGHT]] 171 ; CHECK: [[CALL_LABEL]]: 172 ; CHECK-NEXT: %call_11 = call float @log1pf(float %value) 173 ; CHECK-NEXT: br label %[[END_LABEL]] 174 ; CHECK: [[END_LABEL]]: 175 ret void 176 } 177 178 declare float @acosf(float) 179 declare float @asinf(float) 180 declare float @cosf(float) 181 declare float @sinf(float) 182 declare float @acoshf(float) 183 declare float @sqrtf(float) 184 declare float @atanhf(float) 185 declare float @logf(float) 186 declare float @log10f(float) 187 declare float @log2f(float) 188 declare float @logbf(float) 189 declare float @log1pf(float) 190 191 ; CHECK: ![[BRANCH_WEIGHT]] = !{!"branch_weights", i32 1, i32 2000} 192