Home | History | Annotate | Download | only in DeadStoreElimination
      1 ; RUN: opt -S -dse < %s | FileCheck %s
      2 target datalayout = "E-m:e-i64:64-n32:64"
      3 target triple = "powerpc64-bgq-linux"
      4 
      5 %"struct.std::complex" = type { { float, float } }
      6 
      7 define void @_Z4testSt7complexIfE(%"struct.std::complex"* noalias nocapture sret %agg.result, i64 %c.coerce) {
      8 entry:
      9 ; CHECK-LABEL: @_Z4testSt7complexIfE
     10 
     11   %ref.tmp = alloca i64, align 8
     12   %tmpcast = bitcast i64* %ref.tmp to %"struct.std::complex"*
     13   %c.sroa.0.0.extract.shift = lshr i64 %c.coerce, 32
     14   %c.sroa.0.0.extract.trunc = trunc i64 %c.sroa.0.0.extract.shift to i32
     15   %0 = bitcast i32 %c.sroa.0.0.extract.trunc to float
     16   %c.sroa.2.0.extract.trunc = trunc i64 %c.coerce to i32
     17   %1 = bitcast i32 %c.sroa.2.0.extract.trunc to float
     18   call void @_Z3barSt7complexIfE(%"struct.std::complex"* nonnull sret %tmpcast, i64 %c.coerce)
     19   %2 = bitcast %"struct.std::complex"* %agg.result to i64*
     20   %3 = load i64, i64* %ref.tmp, align 8
     21   store i64 %3, i64* %2, align 4
     22 ; CHECK-NOT: store i64
     23 
     24   %_M_value.realp.i.i = getelementptr inbounds %"struct.std::complex", %"struct.std::complex"* %agg.result, i64 0, i32 0, i32 0
     25   %4 = lshr i64 %3, 32
     26   %5 = trunc i64 %4 to i32
     27   %6 = bitcast i32 %5 to float
     28   %_M_value.imagp.i.i = getelementptr inbounds %"struct.std::complex", %"struct.std::complex"* %agg.result, i64 0, i32 0, i32 1
     29   %7 = trunc i64 %3 to i32
     30   %8 = bitcast i32 %7 to float
     31   %mul_ad.i.i = fmul fast float %6, %1
     32   %mul_bc.i.i = fmul fast float %8, %0
     33   %mul_i.i.i = fadd fast float %mul_ad.i.i, %mul_bc.i.i
     34   %mul_ac.i.i = fmul fast float %6, %0
     35   %mul_bd.i.i = fmul fast float %8, %1
     36   %mul_r.i.i = fsub fast float %mul_ac.i.i, %mul_bd.i.i
     37   store float %mul_r.i.i, float* %_M_value.realp.i.i, align 4
     38   store float %mul_i.i.i, float* %_M_value.imagp.i.i, align 4
     39   ret void
     40 ; CHECK: ret void
     41 }
     42 
     43 declare void @_Z3barSt7complexIfE(%"struct.std::complex"* sret, i64)
     44 
     45 define void @test1(i32 *%ptr) {
     46 entry:
     47 ; CHECK-LABEL: @test1
     48 
     49  store i32 5, i32* %ptr
     50  %bptr = bitcast i32* %ptr to i8*
     51  store i8 7, i8* %bptr
     52  %wptr = bitcast i32* %ptr to i16*
     53  store i16 -30062, i16* %wptr
     54  %bptr2 = getelementptr inbounds i8, i8* %bptr, i64 2
     55  store i8 25, i8* %bptr2
     56  %bptr3 = getelementptr inbounds i8, i8* %bptr, i64 3
     57  store i8 47, i8* %bptr3
     58  %bptr1 = getelementptr inbounds i8, i8* %bptr, i64 1
     59  %wptrp = bitcast i8* %bptr1 to i16*
     60  store i16 2020, i16* %wptrp, align 1
     61  ret void
     62 
     63 ; CHECK-NOT: store i32 5, i32* %ptr
     64 ; CHECK-NOT: store i8 7, i8* %bptr
     65 ; CHECK: store i16 -30062, i16* %wptr
     66 ; CHECK-NOT: store i8 25, i8* %bptr2
     67 ; CHECK: store i8 47, i8* %bptr3
     68 ; CHECK: store i16 2020, i16* %wptrp, align 1
     69 
     70 ; CHECK: ret void
     71 }
     72 
     73 define void @test2(i32 *%ptr) {
     74 entry:
     75 ; CHECK-LABEL: @test2
     76 
     77   store i32 5, i32* %ptr
     78 
     79   %bptr = bitcast i32* %ptr to i8*
     80   %bptrm1 = getelementptr inbounds i8, i8* %bptr, i64 -1
     81   %bptr1 = getelementptr inbounds i8, i8* %bptr, i64 1
     82   %bptr2 = getelementptr inbounds i8, i8* %bptr, i64 2
     83   %bptr3 = getelementptr inbounds i8, i8* %bptr, i64 3
     84 
     85   %wptr = bitcast i8* %bptr to i16*
     86   %wptrm1 = bitcast i8* %bptrm1 to i16*
     87   %wptr1 = bitcast i8* %bptr1 to i16*
     88   %wptr2 = bitcast i8* %bptr2 to i16*
     89   %wptr3 = bitcast i8* %bptr3 to i16*
     90 
     91   store i16 1456, i16* %wptrm1, align 1
     92   store i16 1346, i16* %wptr, align 1
     93   store i16 1756, i16* %wptr1, align 1
     94   store i16 1126, i16* %wptr2, align 1
     95   store i16 5656, i16* %wptr3, align 1
     96 
     97 ; CHECK-NOT: store i32 5, i32* %ptr
     98 
     99 ; CHECK: store i16 1456, i16* %wptrm1, align 1
    100 ; CHECK: store i16 1346, i16* %wptr, align 1
    101 ; CHECK: store i16 1756, i16* %wptr1, align 1
    102 ; CHECK: store i16 1126, i16* %wptr2, align 1
    103 ; CHECK: store i16 5656, i16* %wptr3, align 1
    104 
    105   ret void
    106 
    107 ; CHECK: ret void
    108 }
    109 
    110 define signext i8 @test3(i32 *%ptr) {
    111 entry:
    112 ; CHECK-LABEL: @test3
    113 
    114   store i32 5, i32* %ptr
    115 
    116   %bptr = bitcast i32* %ptr to i8*
    117   %bptrm1 = getelementptr inbounds i8, i8* %bptr, i64 -1
    118   %bptr1 = getelementptr inbounds i8, i8* %bptr, i64 1
    119   %bptr2 = getelementptr inbounds i8, i8* %bptr, i64 2
    120   %bptr3 = getelementptr inbounds i8, i8* %bptr, i64 3
    121 
    122   %wptr = bitcast i8* %bptr to i16*
    123   %wptrm1 = bitcast i8* %bptrm1 to i16*
    124   %wptr1 = bitcast i8* %bptr1 to i16*
    125   %wptr2 = bitcast i8* %bptr2 to i16*
    126   %wptr3 = bitcast i8* %bptr3 to i16*
    127 
    128   %v = load i8, i8* %bptr, align 1
    129   store i16 1456, i16* %wptrm1, align 1
    130   store i16 1346, i16* %wptr, align 1
    131   store i16 1756, i16* %wptr1, align 1
    132   store i16 1126, i16* %wptr2, align 1
    133   store i16 5656, i16* %wptr3, align 1
    134 
    135 ; CHECK: store i32 5, i32* %ptr
    136 
    137   ret i8 %v
    138 
    139 ; CHECK: ret i8 %v
    140 }
    141 
    142 %struct.foostruct = type {
    143 i32 (i8*, i8**, i32, i8, i8*)*,
    144 i32 (i8*, i8**, i32, i8, i8*)*,
    145 i32 (i8*, i8**, i32, i8, i8*)*,
    146 i32 (i8*, i8**, i32, i8, i8*)*,
    147 void (i8*, i32, i32)*
    148 }
    149 declare void @llvm.memset.p0i8.i64(i8* nocapture, i8, i64, i32, i1)
    150 declare void @goFunc(%struct.foostruct*)
    151 declare i32 @fa(i8*, i8**, i32, i8, i8*)
    152 
    153 define void @test4()  {
    154 entry:
    155 ; CHECK-LABEL: @test4
    156 
    157   %bang = alloca %struct.foostruct, align 8
    158   %v1 = bitcast %struct.foostruct* %bang to i8*
    159   call void @llvm.memset.p0i8.i64(i8* %v1, i8 0, i64 40, i32 8, i1 false)
    160   %v2 = getelementptr inbounds %struct.foostruct, %struct.foostruct* %bang, i64 0, i32 0
    161   store i32 (i8*, i8**, i32, i8, i8*)* @fa, i32 (i8*, i8**, i32, i8, i8*)** %v2, align 8
    162   %v3 = getelementptr inbounds %struct.foostruct, %struct.foostruct* %bang, i64 0, i32 1
    163   store i32 (i8*, i8**, i32, i8, i8*)* @fa, i32 (i8*, i8**, i32, i8, i8*)** %v3, align 8
    164   %v4 = getelementptr inbounds %struct.foostruct, %struct.foostruct* %bang, i64 0, i32 2
    165   store i32 (i8*, i8**, i32, i8, i8*)* @fa, i32 (i8*, i8**, i32, i8, i8*)** %v4, align 8
    166   %v5 = getelementptr inbounds %struct.foostruct, %struct.foostruct* %bang, i64 0, i32 3
    167   store i32 (i8*, i8**, i32, i8, i8*)* @fa, i32 (i8*, i8**, i32, i8, i8*)** %v5, align 8
    168   %v6 = getelementptr inbounds %struct.foostruct, %struct.foostruct* %bang, i64 0, i32 4
    169   store void (i8*, i32, i32)* null, void (i8*, i32, i32)** %v6, align 8
    170   call void @goFunc(%struct.foostruct* %bang)
    171   ret void
    172 
    173 ; CHECK-NOT: memset
    174 ; CHECK: ret void
    175 }
    176 
    177 define signext i8 @test5(i32 *%ptr) {
    178 entry:
    179 ; CHECK-LABEL: @test5
    180 
    181   store i32 0, i32* %ptr
    182 
    183   %bptr = bitcast i32* %ptr to i8*
    184   %bptr1 = getelementptr inbounds i8, i8* %bptr, i64 1
    185   %bptr2 = getelementptr inbounds i8, i8* %bptr, i64 2
    186   %bptr3 = getelementptr inbounds i8, i8* %bptr, i64 3
    187 
    188   %wptr = bitcast i8* %bptr to i16*
    189   %wptr1 = bitcast i8* %bptr1 to i16*
    190   %wptr2 = bitcast i8* %bptr2 to i16*
    191 
    192   store i16 65535, i16* %wptr2, align 1
    193   store i16 1456, i16* %wptr1, align 1
    194   store i16 1346, i16* %wptr, align 1
    195 
    196 ; CHECK-NOT: store i32 0, i32* %ptr
    197 
    198   ret i8 0
    199 }
    200 
    201 define signext i8 @test6(i32 *%ptr) {
    202 entry:
    203 ; CHECK-LABEL: @test6
    204 
    205   store i32 0, i32* %ptr
    206 
    207   %bptr = bitcast i32* %ptr to i16*
    208   %bptr1 = getelementptr inbounds i16, i16* %bptr, i64 0
    209   %bptr2 = getelementptr inbounds i16, i16* %bptr, i64 1
    210 
    211   store i16 1456, i16* %bptr2, align 1
    212   store i16 65535, i16* %bptr1, align 1
    213 
    214 ; CHECK-NOT: store i32 0, i32* %ptr
    215 
    216   ret i8 0
    217 }
    218 
    219 define signext i8 @test7(i64 *%ptr) {
    220 entry:
    221 ; CHECK-LABEL: @test7
    222 
    223   store i64 0, i64* %ptr
    224 
    225   %bptr = bitcast i64* %ptr to i16*
    226   %bptr1 = getelementptr inbounds i16, i16* %bptr, i64 0
    227   %bptr2 = getelementptr inbounds i16, i16* %bptr, i64 1
    228   %bptr3 = getelementptr inbounds i16, i16* %bptr, i64 2
    229   %bptr4 = getelementptr inbounds i16, i16* %bptr, i64 3
    230 
    231   store i16 1346, i16* %bptr1, align 1
    232   store i16 1756, i16* %bptr3, align 1
    233   store i16 1456, i16* %bptr2, align 1
    234   store i16 5656, i16* %bptr4, align 1
    235 
    236 ; CHECK-NOT: store i64 0, i64* %ptr
    237 
    238   ret i8 0
    239 }
    240