Home | History | Annotate | Download | only in InstSimplify
      1 ; NOTE: Assertions have been autogenerated by utils/update_test_checks.py
      2 ; RUN: opt < %s -instsimplify -S | FileCheck %s
      3 
      4 declare double @llvm.log.f64(double)
      5 declare double @llvm.exp.f64(double)
      6 declare double @llvm.log2.f64(double)
      7 declare double @llvm.exp2.f64(double)
      8 
      9 define double @log_reassoc_exp_strict(double %a) {
     10 ; CHECK-LABEL: @log_reassoc_exp_strict(
     11 ; CHECK-NEXT:    ret double [[A:%.*]]
     12 ;
     13   %1 = call double @llvm.exp.f64(double %a)
     14   %2 = call reassoc double @llvm.log.f64(double %1)
     15   ret double %2
     16 }
     17 
     18 define double @log_strict_exp_reassoc(double %a) {
     19 ; CHECK-LABEL: @log_strict_exp_reassoc(
     20 ; CHECK-NEXT:    [[TMP1:%.*]] = call reassoc double @llvm.exp.f64(double [[A:%.*]])
     21 ; CHECK-NEXT:    [[TMP2:%.*]] = call double @llvm.log.f64(double [[TMP1]])
     22 ; CHECK-NEXT:    ret double [[TMP2]]
     23 ;
     24   %1 = call reassoc double @llvm.exp.f64(double %a)
     25   %2 = call double @llvm.log.f64(double %1)
     26   ret double %2
     27 }
     28 
     29 define double @log_exp_log_exp(double %a) {
     30 ; CHECK-LABEL: @log_exp_log_exp(
     31 ; CHECK-NEXT:    [[TMP1:%.*]] = call double @llvm.exp.f64(double [[A:%.*]])
     32 ; CHECK-NEXT:    [[TMP2:%.*]] = call double @llvm.log.f64(double [[TMP1]])
     33 ; CHECK-NEXT:    [[TMP3:%.*]] = call double @llvm.exp.f64(double [[TMP2]])
     34 ; CHECK-NEXT:    [[TMP4:%.*]] = call double @llvm.log.f64(double [[TMP3]])
     35 ; CHECK-NEXT:    ret double [[TMP4]]
     36 ;
     37   %1 = call double @llvm.exp.f64(double %a)
     38   %2 = call double @llvm.log.f64(double %1)
     39   %3 = call double @llvm.exp.f64(double %2)
     40   %4 = call double @llvm.log.f64(double %3)
     41   ret double %4
     42 }
     43 
     44 define double @log_exp_log_exp_reassoc(double %a) {
     45 ; CHECK-LABEL: @log_exp_log_exp_reassoc(
     46 ; CHECK-NEXT:    ret double [[A:%.*]]
     47 ;
     48   %1 = call double @llvm.exp.f64(double %a)
     49   %2 = call reassoc double @llvm.log.f64(double %1)
     50   %3 = call double @llvm.exp.f64(double %2)
     51   %4 = call reassoc double @llvm.log.f64(double %3)
     52   ret double %4
     53 }
     54 
     55 define double @log2_reassoc_exp2_strict(double %a) {
     56 ; CHECK-LABEL: @log2_reassoc_exp2_strict(
     57 ; CHECK-NEXT:    ret double [[A:%.*]]
     58 ;
     59   %1 = call double @llvm.exp2.f64(double %a)
     60   %2 = call reassoc double @llvm.log2.f64(double %1)
     61   ret double %2
     62 }
     63 
     64 define double @log2_strict_exp2_reassoc(double %a) {
     65 ; CHECK-LABEL: @log2_strict_exp2_reassoc(
     66 ; CHECK-NEXT:    [[TMP1:%.*]] = call reassoc double @llvm.exp2.f64(double [[A:%.*]])
     67 ; CHECK-NEXT:    [[TMP2:%.*]] = call double @llvm.log2.f64(double [[TMP1]])
     68 ; CHECK-NEXT:    ret double [[TMP2]]
     69 ;
     70   %1 = call reassoc double @llvm.exp2.f64(double %a)
     71   %2 = call double @llvm.log2.f64(double %1)
     72   ret double %2
     73 }
     74 
     75 define double @log2_exp2_log2_exp2(double %a) {
     76 ; CHECK-LABEL: @log2_exp2_log2_exp2(
     77 ; CHECK-NEXT:    [[TMP1:%.*]] = call double @llvm.exp2.f64(double [[A:%.*]])
     78 ; CHECK-NEXT:    [[TMP2:%.*]] = call double @llvm.log2.f64(double [[TMP1]])
     79 ; CHECK-NEXT:    [[TMP3:%.*]] = call double @llvm.exp2.f64(double [[TMP2]])
     80 ; CHECK-NEXT:    [[TMP4:%.*]] = call double @llvm.log2.f64(double [[TMP3]])
     81 ; CHECK-NEXT:    ret double [[TMP4]]
     82 ;
     83   %1 = call double @llvm.exp2.f64(double %a)
     84   %2 = call double @llvm.log2.f64(double %1)
     85   %3 = call double @llvm.exp2.f64(double %2)
     86   %4 = call double @llvm.log2.f64(double %3)
     87   ret double %4
     88 }
     89 
     90 define double @log2_exp2_log2_exp2_reassoc(double %a) {
     91 ; CHECK-LABEL: @log2_exp2_log2_exp2_reassoc(
     92 ; CHECK-NEXT:    ret double [[A:%.*]]
     93 ;
     94   %1 = call double @llvm.exp2.f64(double %a)
     95   %2 = call reassoc double @llvm.log2.f64(double %1)
     96   %3 = call double @llvm.exp2.f64(double %2)
     97   %4 = call reassoc double @llvm.log2.f64(double %3)
     98   ret double %4
     99 }
    100 
    101 define double @exp_reassoc_log_strict(double %a) {
    102 ; CHECK-LABEL: @exp_reassoc_log_strict(
    103 ; CHECK-NEXT:    ret double [[A:%.*]]
    104 ;
    105   %1 = call double @llvm.log.f64(double %a)
    106   %2 = call reassoc double @llvm.exp.f64(double %1)
    107   ret double %2
    108 }
    109 
    110 define double @exp_strict_log_reassoc(double %a) {
    111 ; CHECK-LABEL: @exp_strict_log_reassoc(
    112 ; CHECK-NEXT:    [[TMP1:%.*]] = call reassoc double @llvm.log.f64(double [[A:%.*]])
    113 ; CHECK-NEXT:    [[TMP2:%.*]] = call double @llvm.exp.f64(double [[TMP1]])
    114 ; CHECK-NEXT:    ret double [[TMP2]]
    115 ;
    116   %1 = call reassoc double @llvm.log.f64(double %a)
    117   %2 = call double @llvm.exp.f64(double %1)
    118   ret double %2
    119 }
    120 
    121 define double @exp_log_exp_log(double %a) {
    122 ; CHECK-LABEL: @exp_log_exp_log(
    123 ; CHECK-NEXT:    [[TMP1:%.*]] = call double @llvm.log.f64(double [[A:%.*]])
    124 ; CHECK-NEXT:    [[TMP2:%.*]] = call double @llvm.exp.f64(double [[TMP1]])
    125 ; CHECK-NEXT:    [[TMP3:%.*]] = call double @llvm.log.f64(double [[TMP2]])
    126 ; CHECK-NEXT:    [[TMP4:%.*]] = call double @llvm.exp.f64(double [[TMP3]])
    127 ; CHECK-NEXT:    ret double [[TMP4]]
    128 ;
    129   %1 = call double @llvm.log.f64(double %a)
    130   %2 = call double @llvm.exp.f64(double %1)
    131   %3 = call double @llvm.log.f64(double %2)
    132   %4 = call double @llvm.exp.f64(double %3)
    133   ret double %4
    134 }
    135 
    136 define double @exp_log_exp_log_reassoc(double %a) {
    137 ; CHECK-LABEL: @exp_log_exp_log_reassoc(
    138 ; CHECK-NEXT:    ret double [[A:%.*]]
    139 ;
    140   %1 = call double @llvm.log.f64(double %a)
    141   %2 = call reassoc double @llvm.exp.f64(double %1)
    142   %3 = call double @llvm.log.f64(double %2)
    143   %4 = call reassoc double @llvm.exp.f64(double %3)
    144   ret double %4
    145 }
    146 
    147 define double @exp2_reassoc_log2_strict(double %a) {
    148 ; CHECK-LABEL: @exp2_reassoc_log2_strict(
    149 ; CHECK-NEXT:    ret double [[A:%.*]]
    150 ;
    151   %1 = call double @llvm.log2.f64(double %a)
    152   %2 = call reassoc double @llvm.exp2.f64(double %1)
    153   ret double %2
    154 }
    155 
    156 define double @exp2_strict_log2_reassoc(double %a) {
    157 ; CHECK-LABEL: @exp2_strict_log2_reassoc(
    158 ; CHECK-NEXT:    [[TMP1:%.*]] = call reassoc double @llvm.log2.f64(double [[A:%.*]])
    159 ; CHECK-NEXT:    [[TMP2:%.*]] = call double @llvm.exp2.f64(double [[TMP1]])
    160 ; CHECK-NEXT:    ret double [[TMP2]]
    161 ;
    162   %1 = call reassoc double @llvm.log2.f64(double %a)
    163   %2 = call double @llvm.exp2.f64(double %1)
    164   ret double %2
    165 }
    166 
    167 define double @exp2_log2_exp2_log2(double %a) {
    168 ; CHECK-LABEL: @exp2_log2_exp2_log2(
    169 ; CHECK-NEXT:    [[TMP1:%.*]] = call double @llvm.log2.f64(double [[A:%.*]])
    170 ; CHECK-NEXT:    [[TMP2:%.*]] = call double @llvm.exp2.f64(double [[TMP1]])
    171 ; CHECK-NEXT:    [[TMP3:%.*]] = call double @llvm.log2.f64(double [[TMP2]])
    172 ; CHECK-NEXT:    [[TMP4:%.*]] = call double @llvm.exp2.f64(double [[TMP3]])
    173 ; CHECK-NEXT:    ret double [[TMP4]]
    174 ;
    175   %1 = call double @llvm.log2.f64(double %a)
    176   %2 = call double @llvm.exp2.f64(double %1)
    177   %3 = call double @llvm.log2.f64(double %2)
    178   %4 = call double @llvm.exp2.f64(double %3)
    179   ret double %4
    180 }
    181 
    182 define double @exp2_log2_exp2_log2_reassoc(double %a) {
    183 ; CHECK-LABEL: @exp2_log2_exp2_log2_reassoc(
    184 ; CHECK-NEXT:    ret double [[A:%.*]]
    185 ;
    186   %1 = call double @llvm.log2.f64(double %a)
    187   %2 = call reassoc double @llvm.exp2.f64(double %1)
    188   %3 = call double @llvm.log2.f64(double %2)
    189   %4 = call reassoc double @llvm.exp2.f64(double %3)
    190   ret double %4
    191 }
    192 
    193