Home | History | Annotate | Download | only in Util
      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(double %value) {
      9 entry:
     10   %call_0 = call double @cosh(double %value)
     11 ; CHECK: [[COND1:%[0-9]+]] = fcmp olt double %value, -7.100000e+02
     12 ; CHECK: [[COND2:%[0-9]+]] = fcmp ogt double %value, 7.100000e+02
     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 double @cosh(double %value)
     17 ; CHECK-NEXT: br label %[[END_LABEL]]
     18 ; CHECK: [[END_LABEL]]:
     19 
     20   %call_1 = call double @exp(double %value)
     21 ; CHECK: [[COND1:%[0-9]+]] = fcmp olt double %value, -7.450000e+02
     22 ; CHECK: [[COND2:%[0-9]+]] = fcmp ogt double %value, 7.090000e+02
     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 double @exp(double %value)
     27 ; CHECK-NEXT: br label %[[END_LABEL]]
     28 ; CHECK: [[END_LABEL]]:
     29 
     30   %call_3 = call double @exp2(double %value)
     31 ; CHECK: [[COND1:%[0-9]+]] = fcmp olt double %value, -1.074000e+03
     32 ; CHECK: [[COND2:%[0-9]+]] = fcmp ogt double %value, 1.023000e+03
     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 double @exp2(double %value)
     37 ; CHECK-NEXT: br label %[[END_LABEL]]
     38 ; CHECK: [[END_LABEL]]:
     39 
     40   %call_4 = call double @sinh(double %value)
     41 ; CHECK: [[COND1:%[0-9]+]] = fcmp olt double %value, -7.100000e+02
     42 ; CHECK: [[COND2:%[0-9]+]] = fcmp ogt double %value, 7.100000e+02
     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 double @sinh(double %value)
     47 ; CHECK-NEXT: br label %[[END_LABEL]]
     48 ; CHECK: [[END_LABEL]]:
     49 
     50   %call_5 = call double @expm1(double %value)
     51 ; CHECK: [[COND:%[0-9]+]] = fcmp ogt double %value, 7.090000e+02
     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 double @expm1(double %value)
     55 ; CHECK-NEXT: br label %[[END_LABEL]]
     56 ; CHECK: [[END_LABEL]]:
     57 
     58   ret void
     59 }
     60 
     61 declare double @cosh(double)
     62 declare double @exp(double)
     63 declare double @exp2(double)
     64 declare double @sinh(double)
     65 declare double @expm1(double)
     66 
     67 define void @test_domain_error(double %value) {
     68 entry:
     69   %call_00 = call double @acos(double %value)
     70 ; CHECK: [[COND1:%[0-9]+]] = fcmp ogt double %value, 1.000000e+00
     71 ; CHECK: [[COND2:%[0-9]+]] = fcmp olt double %value, -1.000000e+00
     72 ; CHECK: [[COND:%[0-9]+]] = or i1 [[COND2]], [[COND1]]
     73 ; CHECK: br i1 [[COND]], label %[[CALL_LABEL:cdce.call[0-9]*]], label %[[END_LABEL:cdce.end[0-9]*]], !prof ![[BRANCH_WEIGHT]]
     74 ; CHECK: [[CALL_LABEL]]:
     75 ; CHECK-NEXT: %call_00 = call double @acos(double %value)
     76 ; CHECK-NEXT: br label %[[END_LABEL]]
     77 ; CHECK: [[END_LABEL]]:
     78 
     79   %call_01 = call double @asin(double %value)
     80 ; CHECK: [[COND1:%[0-9]+]] = fcmp ogt double %value, 1.000000e+00
     81 ; CHECK: [[COND2:%[0-9]+]] = fcmp olt double %value, -1.000000e+00
     82 ; CHECK: [[COND:%[0-9]+]] = or i1 [[COND2]], [[COND1]]
     83 ; CHECK: br i1 [[COND]], label %[[CALL_LABEL:cdce.call[0-9]*]], label %[[END_LABEL:cdce.end[0-9]*]], !prof ![[BRANCH_WEIGHT]]
     84 ; CHECK: [[CALL_LABEL]]:
     85 ; CHECK-NEXT: %call_01 = call double @asin(double %value)
     86 ; CHECK-NEXT: br label %[[END_LABEL]]
     87 ; CHECK: [[END_LABEL]]:
     88 
     89   %call_02 = call double @cos(double %value)
     90 ; CHECK: [[COND1:%[0-9]+]] = fcmp oeq double %value, 0xFFF0000000000000
     91 ; CHECK: [[COND2:%[0-9]+]] = fcmp oeq double %value, 0x7FF0000000000000
     92 ; CHECK: [[COND:%[0-9]+]] = or i1 [[COND2]], [[COND1]]
     93 ; CHECK: br i1 [[COND]], label %[[CALL_LABEL:cdce.call[0-9]*]], label %[[END_LABEL:cdce.end[0-9]*]], !prof ![[BRANCH_WEIGHT]]
     94 ; CHECK: [[CALL_LABEL]]:
     95 ; CHECK-NEXT: %call_02 = call double @cos(double %value)
     96 ; CHECK-NEXT: br label %[[END_LABEL]]
     97 ; CHECK: [[END_LABEL]]:
     98 
     99   %call_03 = call double @sin(double %value)
    100 ; CHECK: [[COND1:%[0-9]+]] = fcmp oeq double %value, 0xFFF0000000000000
    101 ; CHECK: [[COND2:%[0-9]+]] = fcmp oeq double %value, 0x7FF0000000000000
    102 ; CHECK: [[COND:%[0-9]+]] = or i1 [[COND2]], [[COND1]]
    103 ; CHECK: br i1 [[COND]], label %[[CALL_LABEL:cdce.call[0-9]*]], label %[[END_LABEL:cdce.end[0-9]*]], !prof ![[BRANCH_WEIGHT]]
    104 ; CHECK: [[CALL_LABEL]]:
    105 ; CHECK-NEXT: %call_03 = call double @sin(double %value)
    106 ; CHECK-NEXT: br label %[[END_LABEL]]
    107 ; CHECK: [[END_LABEL]]:
    108 
    109   %call_04 = call double @acosh(double %value)
    110 ; CHECK: [[COND:%[0-9]+]] = fcmp olt double %value, 1.000000e+00
    111 ; CHECK: br i1 [[COND]], label %[[CALL_LABEL:cdce.call[0-9]*]], label %[[END_LABEL:cdce.end[0-9]*]], !prof ![[BRANCH_WEIGHT]]
    112 ; CHECK: [[CALL_LABEL]]:
    113 ; CHECK-NEXT: %call_04 = call double @acosh(double %value)
    114 ; CHECK-NEXT: br label %[[END_LABEL]]
    115 ; CHECK: [[END_LABEL]]:
    116 
    117   %call_05 = call double @sqrt(double %value)
    118 ; CHECK: [[COND:%[0-9]+]] = fcmp olt double %value, 0.000000e+00
    119 ; CHECK: br i1 [[COND]], label %[[CALL_LABEL:cdce.call[0-9]*]], label %[[END_LABEL:cdce.end[0-9]*]], !prof ![[BRANCH_WEIGHT]]
    120 ; CHECK: [[CALL_LABEL]]:
    121 ; CHECK-NEXT: %call_05 = call double @sqrt(double %value)
    122 ; CHECK-NEXT: br label %[[END_LABEL]]
    123 ; CHECK: [[END_LABEL]]:
    124 
    125   %call_06 = call double @atanh(double %value)
    126 ; CHECK: [[COND1:%[0-9]+]] = fcmp oge double %value, 1.000000e+00
    127 ; CHECK: [[COND2:%[0-9]+]] = fcmp ole double %value, -1.000000e+00
    128 ; CHECK: [[COND:%[0-9]+]] = or i1 [[COND2]], [[COND1]]
    129 ; CHECK: br i1 [[COND]], label %[[CALL_LABEL:cdce.call[0-9]*]], label %[[END_LABEL:cdce.end[0-9]*]], !prof ![[BRANCH_WEIGHT]]
    130 ; CHECK: [[CALL_LABEL]]:
    131 ; CHECK-NEXT: %call_06 = call double @atanh(double %value)
    132 ; CHECK-NEXT: br label %[[END_LABEL]]
    133 ; CHECK: [[END_LABEL]]:
    134 
    135   %call_07 = call double @log(double %value)
    136 ; CHECK: [[COND:%[0-9]+]] = fcmp ole double %value, 0.000000e+00
    137 ; CHECK: br i1 [[COND]], label %[[CALL_LABEL:cdce.call[0-9]*]], label %[[END_LABEL:cdce.end[0-9]*]], !prof ![[BRANCH_WEIGHT]]
    138 ; CHECK: [[CALL_LABEL]]:
    139 ; CHECK-NEXT: %call_07 = call double @log(double %value)
    140 ; CHECK-NEXT: br label %[[END_LABEL]]
    141 ; CHECK: [[END_LABEL]]:
    142 
    143   %call_08 = call double @log10(double %value)
    144 ; CHECK: [[COND:%[0-9]+]] = fcmp ole double %value, 0.000000e+00
    145 ; CHECK: br i1 [[COND]], label %[[CALL_LABEL:cdce.call[0-9]*]], label %[[END_LABEL:cdce.end[0-9]*]], !prof ![[BRANCH_WEIGHT]]
    146 ; CHECK: [[CALL_LABEL]]:
    147 ; CHECK-NEXT: %call_08 = call double @log10(double %value)
    148 ; CHECK-NEXT: br label %[[END_LABEL]]
    149 ; CHECK: [[END_LABEL]]:
    150 
    151   %call_09 = call double @log2(double %value)
    152 ; CHECK: [[COND:%[0-9]+]] = fcmp ole double %value, 0.000000e+00
    153 ; CHECK: br i1 [[COND]], label %[[CALL_LABEL:cdce.call[0-9]*]], label %[[END_LABEL:cdce.end[0-9]*]], !prof ![[BRANCH_WEIGHT]]
    154 ; CHECK: [[CALL_LABEL]]:
    155 ; CHECK-NEXT: %call_09 = call double @log2(double %value)
    156 ; CHECK-NEXT: br label %[[END_LABEL]]
    157 ; CHECK: [[END_LABEL]]:
    158 
    159   %call_10 = call double @logb(double %value)
    160 ; CHECK: [[COND:%[0-9]+]] = fcmp ole double %value, 0.000000e+00
    161 ; CHECK: br i1 [[COND]], label %[[CALL_LABEL:cdce.call[0-9]*]], label %[[END_LABEL:cdce.end[0-9]*]], !prof ![[BRANCH_WEIGHT]]
    162 ; CHECK: [[CALL_LABEL]]:
    163 ; CHECK-NEXT: %call_10 = call double @logb(double %value)
    164 ; CHECK-NEXT: br label %[[END_LABEL]]
    165 ; CHECK: [[END_LABEL]]:
    166 
    167   %call_11 = call double @log1p(double %value)
    168 ; CHECK: [[COND:%[0-9]+]] = fcmp ole double %value, -1.000000e+00
    169 ; CHECK: br i1 [[COND]], label %[[CALL_LABEL:cdce.call[0-9]*]], label %[[END_LABEL:cdce.end[0-9]*]], !prof ![[BRANCH_WEIGHT]]
    170 ; CHECK: [[CALL_LABEL]]:
    171 ; CHECK-NEXT: %call_11 = call double @log1p(double %value)
    172 ; CHECK-NEXT: br label %[[END_LABEL]]
    173 ; CHECK: [[END_LABEL]]:
    174 
    175   ret void
    176 }
    177 
    178 declare double @acos(double)
    179 declare double @asin(double)
    180 declare double @cos(double)
    181 declare double @sin(double)
    182 declare double @acosh(double)
    183 declare double @sqrt(double)
    184 declare double @atanh(double)
    185 declare double @log(double)
    186 declare double @log10(double)
    187 declare double @log2(double)
    188 declare double @logb(double)
    189 declare double @log1p(double)
    190 
    191 define void @test_pow(i32 %int_val, double %exp) {
    192   %call = call double @pow(double 2.500000e+00, double %exp)
    193 ; CHECK: [[COND:%[0-9]+]] = fcmp ogt double %exp, 1.270000e+02
    194 ; CHECK: br i1 [[COND]], label %[[CALL_LABEL:cdce.call[0-9]*]], label %[[END_LABEL:cdce.end[0-9]*]], !prof ![[BRANCH_WEIGHT]]
    195 ; CHECK: [[CALL_LABEL]]:
    196 ; CHECK-NEXT: %call = call double @pow(double 2.500000e+00, double %exp)
    197 ; CHECK-NEXT: br label %[[END_LABEL]]
    198 ; CHECK: [[END_LABEL]]:
    199 
    200   %conv = sitofp i32 %int_val to double
    201   %call1 = call double @pow(double %conv, double %exp)
    202 ; CHECK: [[COND1:%[0-9]+]] = fcmp ogt double %exp, 3.200000e+01
    203 ; CHECK: [[COND2:%[0-9]+]] = fcmp ole double %conv, 0.000000e+00
    204 ; CHECK: [[COND:%[0-9]+]] = or i1 [[COND2]], [[COND1]]
    205 ; CHECK: br i1 [[COND]], label %[[CALL_LABEL:cdce.call[0-9]*]], label %[[END_LABEL:cdce.end[0-9]*]], !prof ![[BRANCH_WEIGHT]]
    206 ; CHECK: [[CALL_LABEL]]:
    207 ; CHECK-NEXT: %call1 = call double @pow(double %conv, double %exp)
    208 ; CHECK-NEXT: br label %[[END_LABEL]]
    209 ; CHECK: [[END_LABEL]]:
    210 
    211   %conv2 = trunc i32 %int_val to i8
    212   %conv3 = uitofp i8 %conv2 to double
    213   %call4 = call double @pow(double %conv3, double %exp)
    214 ; CHECK: [[COND1:%[0-9]+]] = fcmp ogt double %exp, 1.280000e+02
    215 ; CHECK: [[COND2:%[0-9]+]] = fcmp ole double %conv3, 0.000000e+00
    216 ; CHECK: [[COND:%[0-9]+]] = or i1 [[COND2]], [[COND1]]
    217 ; CHECK: br i1 [[COND]], label %[[CALL_LABEL:cdce.call[0-9]*]], label %[[END_LABEL:cdce.end[0-9]*]], !prof ![[BRANCH_WEIGHT]]
    218 ; CHECK: [[CALL_LABEL]]:
    219 ; CHECK-NEXT: %call4 = call double @pow(double %conv3, double %exp)
    220 ; CHECK-NEXT: br label %[[END_LABEL]]
    221 ; CHECK: [[END_LABEL]]:
    222 
    223 
    224   %conv5 = trunc i32 %int_val to i16
    225   %conv6 = uitofp i16 %conv5 to double
    226   %call7 = call double @pow(double %conv6, double %exp)
    227 ; CHECK: [[COND1:%[0-9]+]] = fcmp ogt double %exp, 6.400000e+01
    228 ; CHECK: [[COND2:%[0-9]+]] = fcmp ole double %conv6, 0.000000e+00
    229 ; CHECK: [[COND:%[0-9]+]] = or i1 [[COND2]], [[COND1]]
    230 ; CHECK: br i1 [[COND]], label %[[CALL_LABEL:cdce.call[0-9]*]], label %[[END_LABEL:cdce.end[0-9]*]], !prof ![[BRANCH_WEIGHT]]
    231 ; CHECK: [[CALL_LABEL]]:
    232 ; CHECK-NEXT: %call7 = call double @pow(double %conv6, double %exp)
    233 ; CHECK-NEXT: br label %[[END_LABEL]]
    234 ; CHECK: [[END_LABEL]]:
    235 
    236   ret void
    237 }
    238 
    239 declare double @pow(double, double)
    240 
    241 ; CHECK: ![[BRANCH_WEIGHT]] = !{!"branch_weights", i32 1, i32 2000}
    242