Home | History | Annotate | Download | only in ConstProp
      1 ; RUN: opt < %s -constprop -S | FileCheck %s
      2 
      3 
      4 declare {i8, i1} @llvm.uadd.with.overflow.i8(i8, i8)
      5 declare {i8, i1} @llvm.usub.with.overflow.i8(i8, i8)
      6 declare {i8, i1} @llvm.umul.with.overflow.i8(i8, i8)
      7 
      8 declare {i8, i1} @llvm.sadd.with.overflow.i8(i8, i8)
      9 declare {i8, i1} @llvm.ssub.with.overflow.i8(i8, i8)
     10 declare {i8, i1} @llvm.smul.with.overflow.i8(i8, i8)
     11 
     12 ;;-----------------------------
     13 ;; uadd
     14 ;;-----------------------------
     15 
     16 define {i8, i1} @uadd_1() nounwind {
     17 entry:
     18   %t = call {i8, i1} @llvm.uadd.with.overflow.i8(i8 42, i8 100)
     19   ret {i8, i1} %t
     20 
     21 ; CHECK: @uadd_1
     22 ; CHECK: ret { i8, i1 } { i8 -114, i1 false }
     23 }
     24 
     25 define {i8, i1} @uadd_2() nounwind {
     26 entry:
     27   %t = call {i8, i1} @llvm.uadd.with.overflow.i8(i8 142, i8 120)
     28   ret {i8, i1} %t
     29 
     30 ; CHECK: @uadd_2
     31 ; CHECK: ret { i8, i1 } { i8 6, i1 true }
     32 }
     33 
     34 ;;-----------------------------
     35 ;; usub
     36 ;;-----------------------------
     37 
     38 define {i8, i1} @usub_1() nounwind {
     39 entry:
     40   %t = call {i8, i1} @llvm.usub.with.overflow.i8(i8 4, i8 2)
     41   ret {i8, i1} %t
     42 
     43 ; CHECK: @usub_1
     44 ; CHECK: ret { i8, i1 } { i8 2, i1 false }
     45 }
     46 
     47 define {i8, i1} @usub_2() nounwind {
     48 entry:
     49   %t = call {i8, i1} @llvm.usub.with.overflow.i8(i8 4, i8 6)
     50   ret {i8, i1} %t
     51 
     52 ; CHECK: @usub_2
     53 ; CHECK: ret { i8, i1 } { i8 -2, i1 true }
     54 }
     55 
     56 ;;-----------------------------
     57 ;; umul
     58 ;;-----------------------------
     59 
     60 define {i8, i1} @umul_1() nounwind {
     61 entry:
     62   %t = call {i8, i1} @llvm.umul.with.overflow.i8(i8 100, i8 3)
     63   ret {i8, i1} %t
     64 
     65 ; CHECK: @umul_1
     66 ; CHECK: ret { i8, i1 } { i8 44, i1 true }
     67 }
     68 
     69 define {i8, i1} @umul_2() nounwind {
     70 entry:
     71   %t = call {i8, i1} @llvm.umul.with.overflow.i8(i8 100, i8 2)
     72   ret {i8, i1} %t
     73 
     74 ; CHECK: @umul_2
     75 ; CHECK: ret { i8, i1 } { i8 -56, i1 false }
     76 }
     77 
     78 ;;-----------------------------
     79 ;; sadd
     80 ;;-----------------------------
     81 
     82 define {i8, i1} @sadd_1() nounwind {
     83 entry:
     84   %t = call {i8, i1} @llvm.sadd.with.overflow.i8(i8 42, i8 2)
     85   ret {i8, i1} %t
     86 
     87 ; CHECK: @sadd_1
     88 ; CHECK: ret { i8, i1 } { i8 44, i1 false }
     89 }
     90 
     91 define {i8, i1} @sadd_2() nounwind {
     92 entry:
     93   %t = call {i8, i1} @llvm.sadd.with.overflow.i8(i8 120, i8 10)
     94   ret {i8, i1} %t
     95 
     96 ; CHECK: @sadd_2
     97 ; CHECK: ret { i8, i1 } { i8 -126, i1 true }
     98 }
     99 
    100 define {i8, i1} @sadd_3() nounwind {
    101 entry:
    102   %t = call {i8, i1} @llvm.sadd.with.overflow.i8(i8 -120, i8 10)
    103   ret {i8, i1} %t
    104 
    105 ; CHECK: @sadd_3
    106 ; CHECK: ret { i8, i1 } { i8 -110, i1 false }
    107 }
    108 
    109 define {i8, i1} @sadd_4() nounwind {
    110 entry:
    111   %t = call {i8, i1} @llvm.sadd.with.overflow.i8(i8 -120, i8 -10)
    112   ret {i8, i1} %t
    113 
    114 ; CHECK: @sadd_4
    115 ; CHECK: ret { i8, i1 } { i8 126, i1 true }
    116 }
    117 
    118 define {i8, i1} @sadd_5() nounwind {
    119 entry:
    120   %t = call {i8, i1} @llvm.sadd.with.overflow.i8(i8 2, i8 -10)
    121   ret {i8, i1} %t
    122 
    123 ; CHECK: @sadd_5
    124 ; CHECK: ret { i8, i1 } { i8 -8, i1 false }
    125 }
    126 
    127 
    128 ;;-----------------------------
    129 ;; ssub
    130 ;;-----------------------------
    131 
    132 define {i8, i1} @ssub_1() nounwind {
    133 entry:
    134   %t = call {i8, i1} @llvm.ssub.with.overflow.i8(i8 4, i8 2)
    135   ret {i8, i1} %t
    136 
    137 ; CHECK: @ssub_1
    138 ; CHECK: ret { i8, i1 } { i8 2, i1 false }
    139 }
    140 
    141 define {i8, i1} @ssub_2() nounwind {
    142 entry:
    143   %t = call {i8, i1} @llvm.ssub.with.overflow.i8(i8 4, i8 6)
    144   ret {i8, i1} %t
    145 
    146 ; CHECK: @ssub_2
    147 ; CHECK: ret { i8, i1 } { i8 -2, i1 false }
    148 }
    149 
    150 define {i8, i1} @ssub_3() nounwind {
    151 entry:
    152   %t = call {i8, i1} @llvm.ssub.with.overflow.i8(i8 -10, i8 120)
    153   ret {i8, i1} %t
    154 
    155 ; CHECK: @ssub_3
    156 ; CHECK: ret { i8, i1 } { i8 126, i1 true }
    157 }
    158 
    159 define {i8, i1} @ssub_3b() nounwind {
    160 entry:
    161   %t = call {i8, i1} @llvm.ssub.with.overflow.i8(i8 -10, i8 10)
    162   ret {i8, i1} %t
    163 
    164 ; CHECK: @ssub_3b
    165 ; CHECK: ret { i8, i1 } { i8 -20, i1 false }
    166 }
    167 
    168 define {i8, i1} @ssub_4() nounwind {
    169 entry:
    170   %t = call {i8, i1} @llvm.ssub.with.overflow.i8(i8 120, i8 -10)
    171   ret {i8, i1} %t
    172 
    173 ; CHECK: @ssub_4
    174 ; CHECK: ret { i8, i1 } { i8 -126, i1 true }
    175 }
    176 
    177 define {i8, i1} @ssub_4b() nounwind {
    178 entry:
    179   %t = call {i8, i1} @llvm.ssub.with.overflow.i8(i8 20, i8 -10)
    180   ret {i8, i1} %t
    181 
    182 ; CHECK: @ssub_4b
    183 ; CHECK: ret { i8, i1 } { i8 30, i1 false }
    184 }
    185 
    186 define {i8, i1} @ssub_5() nounwind {
    187 entry:
    188   %t = call {i8, i1} @llvm.ssub.with.overflow.i8(i8 -20, i8 -10)
    189   ret {i8, i1} %t
    190 
    191 ; CHECK: @ssub_5
    192 ; CHECK: ret { i8, i1 } { i8 -10, i1 false }
    193 }
    194 
    195 ;;-----------------------------
    196 ;; smul
    197 ;;-----------------------------
    198 
    199 ; rdar://8501501
    200 define {i8, i1} @smul_1() nounwind {
    201 entry:
    202   %t = call {i8, i1} @llvm.smul.with.overflow.i8(i8 -20, i8 -10)
    203   ret {i8, i1} %t
    204 
    205 ; CHECK: @smul_1
    206 ; CHECK: ret { i8, i1 } { i8 -56, i1 true }
    207 }
    208