Home | History | Annotate | Download | only in DeadStoreElimination
      1 ; RUN: opt -S -dse < %s | FileCheck %s
      2 
      3 ; If there are two stores to the same location, DSE should be able to remove
      4 ; the first store if the two stores are separated by no more than 98
      5 ; instructions. The existence of debug intrinsics between the stores should
      6 ; not affect this instruction limit.
      7 
      8 @x = global i32 0, align 4
      9 
     10 ; Function Attrs: nounwind
     11 define i32 @test_within_limit() {
     12 entry:
     13   ; The first store; later there is a second store to the same location,
     14   ; so this store should be optimized away by DSE.
     15   ; CHECK-NOT: store i32 1, i32* @x, align 4
     16   store i32 1, i32* @x, align 4
     17 
     18   ; Insert 98 dummy instructions between the two stores
     19   %0 = bitcast i32 0 to i32
     20   %1 = bitcast i32 0 to i32
     21   %2 = bitcast i32 0 to i32
     22   %3 = bitcast i32 0 to i32
     23   %4 = bitcast i32 0 to i32
     24   %5 = bitcast i32 0 to i32
     25   %6 = bitcast i32 0 to i32
     26   %7 = bitcast i32 0 to i32
     27   %8 = bitcast i32 0 to i32
     28   %9 = bitcast i32 0 to i32
     29   %10 = bitcast i32 0 to i32
     30   %11 = bitcast i32 0 to i32
     31   %12 = bitcast i32 0 to i32
     32   %13 = bitcast i32 0 to i32
     33   %14 = bitcast i32 0 to i32
     34   %15 = bitcast i32 0 to i32
     35   %16 = bitcast i32 0 to i32
     36   %17 = bitcast i32 0 to i32
     37   %18 = bitcast i32 0 to i32
     38   %19 = bitcast i32 0 to i32
     39   %20 = bitcast i32 0 to i32
     40   %21 = bitcast i32 0 to i32
     41   %22 = bitcast i32 0 to i32
     42   %23 = bitcast i32 0 to i32
     43   %24 = bitcast i32 0 to i32
     44   %25 = bitcast i32 0 to i32
     45   %26 = bitcast i32 0 to i32
     46   %27 = bitcast i32 0 to i32
     47   %28 = bitcast i32 0 to i32
     48   %29 = bitcast i32 0 to i32
     49   %30 = bitcast i32 0 to i32
     50   %31 = bitcast i32 0 to i32
     51   %32 = bitcast i32 0 to i32
     52   %33 = bitcast i32 0 to i32
     53   %34 = bitcast i32 0 to i32
     54   %35 = bitcast i32 0 to i32
     55   %36 = bitcast i32 0 to i32
     56   %37 = bitcast i32 0 to i32
     57   %38 = bitcast i32 0 to i32
     58   %39 = bitcast i32 0 to i32
     59   %40 = bitcast i32 0 to i32
     60   %41 = bitcast i32 0 to i32
     61   %42 = bitcast i32 0 to i32
     62   %43 = bitcast i32 0 to i32
     63   %44 = bitcast i32 0 to i32
     64   %45 = bitcast i32 0 to i32
     65   %46 = bitcast i32 0 to i32
     66   %47 = bitcast i32 0 to i32
     67   %48 = bitcast i32 0 to i32
     68   %49 = bitcast i32 0 to i32
     69   %50 = bitcast i32 0 to i32
     70   %51 = bitcast i32 0 to i32
     71   %52 = bitcast i32 0 to i32
     72   %53 = bitcast i32 0 to i32
     73   %54 = bitcast i32 0 to i32
     74   %55 = bitcast i32 0 to i32
     75   %56 = bitcast i32 0 to i32
     76   %57 = bitcast i32 0 to i32
     77   %58 = bitcast i32 0 to i32
     78   %59 = bitcast i32 0 to i32
     79   %60 = bitcast i32 0 to i32
     80   %61 = bitcast i32 0 to i32
     81   %62 = bitcast i32 0 to i32
     82   %63 = bitcast i32 0 to i32
     83   %64 = bitcast i32 0 to i32
     84   %65 = bitcast i32 0 to i32
     85   %66 = bitcast i32 0 to i32
     86   %67 = bitcast i32 0 to i32
     87   %68 = bitcast i32 0 to i32
     88   %69 = bitcast i32 0 to i32
     89   %70 = bitcast i32 0 to i32
     90   %71 = bitcast i32 0 to i32
     91   %72 = bitcast i32 0 to i32
     92   %73 = bitcast i32 0 to i32
     93   %74 = bitcast i32 0 to i32
     94   %75 = bitcast i32 0 to i32
     95   %76 = bitcast i32 0 to i32
     96   %77 = bitcast i32 0 to i32
     97   %78 = bitcast i32 0 to i32
     98   %79 = bitcast i32 0 to i32
     99   %80 = bitcast i32 0 to i32
    100   %81 = bitcast i32 0 to i32
    101   %82 = bitcast i32 0 to i32
    102   %83 = bitcast i32 0 to i32
    103   %84 = bitcast i32 0 to i32
    104   %85 = bitcast i32 0 to i32
    105   %86 = bitcast i32 0 to i32
    106   %87 = bitcast i32 0 to i32
    107   %88 = bitcast i32 0 to i32
    108   %89 = bitcast i32 0 to i32
    109   %90 = bitcast i32 0 to i32
    110   %91 = bitcast i32 0 to i32
    111   %92 = bitcast i32 0 to i32
    112   %93 = bitcast i32 0 to i32
    113   %94 = bitcast i32 0 to i32
    114   %95 = bitcast i32 0 to i32
    115   %96 = bitcast i32 0 to i32
    116   %97 = bitcast i32 0 to i32
    117 
    118   ; Insert a meaningless dbg.value intrinsic; it should have no
    119   ; effect on the working of DSE in any way.
    120   call void @llvm.dbg.value(metadata !12, i64 0, metadata !10)
    121 
    122   ; CHECK:  store i32 -1, i32* @x, align 4
    123   store i32 -1, i32* @x, align 4
    124   ret i32 0
    125 }
    126 
    127 ; Function Attrs: nounwind
    128 define i32 @test_outside_limit() {
    129 entry:
    130   ; The first store; later there is a second store to the same location
    131   ; CHECK: store i32 1, i32* @x, align 4
    132   store i32 1, i32* @x, align 4
    133 
    134   ; Insert 99 dummy instructions between the two stores; this is
    135   ; one too many instruction for the DSE to take place.
    136   %0 = bitcast i32 0 to i32
    137   %1 = bitcast i32 0 to i32
    138   %2 = bitcast i32 0 to i32
    139   %3 = bitcast i32 0 to i32
    140   %4 = bitcast i32 0 to i32
    141   %5 = bitcast i32 0 to i32
    142   %6 = bitcast i32 0 to i32
    143   %7 = bitcast i32 0 to i32
    144   %8 = bitcast i32 0 to i32
    145   %9 = bitcast i32 0 to i32
    146   %10 = bitcast i32 0 to i32
    147   %11 = bitcast i32 0 to i32
    148   %12 = bitcast i32 0 to i32
    149   %13 = bitcast i32 0 to i32
    150   %14 = bitcast i32 0 to i32
    151   %15 = bitcast i32 0 to i32
    152   %16 = bitcast i32 0 to i32
    153   %17 = bitcast i32 0 to i32
    154   %18 = bitcast i32 0 to i32
    155   %19 = bitcast i32 0 to i32
    156   %20 = bitcast i32 0 to i32
    157   %21 = bitcast i32 0 to i32
    158   %22 = bitcast i32 0 to i32
    159   %23 = bitcast i32 0 to i32
    160   %24 = bitcast i32 0 to i32
    161   %25 = bitcast i32 0 to i32
    162   %26 = bitcast i32 0 to i32
    163   %27 = bitcast i32 0 to i32
    164   %28 = bitcast i32 0 to i32
    165   %29 = bitcast i32 0 to i32
    166   %30 = bitcast i32 0 to i32
    167   %31 = bitcast i32 0 to i32
    168   %32 = bitcast i32 0 to i32
    169   %33 = bitcast i32 0 to i32
    170   %34 = bitcast i32 0 to i32
    171   %35 = bitcast i32 0 to i32
    172   %36 = bitcast i32 0 to i32
    173   %37 = bitcast i32 0 to i32
    174   %38 = bitcast i32 0 to i32
    175   %39 = bitcast i32 0 to i32
    176   %40 = bitcast i32 0 to i32
    177   %41 = bitcast i32 0 to i32
    178   %42 = bitcast i32 0 to i32
    179   %43 = bitcast i32 0 to i32
    180   %44 = bitcast i32 0 to i32
    181   %45 = bitcast i32 0 to i32
    182   %46 = bitcast i32 0 to i32
    183   %47 = bitcast i32 0 to i32
    184   %48 = bitcast i32 0 to i32
    185   %49 = bitcast i32 0 to i32
    186   %50 = bitcast i32 0 to i32
    187   %51 = bitcast i32 0 to i32
    188   %52 = bitcast i32 0 to i32
    189   %53 = bitcast i32 0 to i32
    190   %54 = bitcast i32 0 to i32
    191   %55 = bitcast i32 0 to i32
    192   %56 = bitcast i32 0 to i32
    193   %57 = bitcast i32 0 to i32
    194   %58 = bitcast i32 0 to i32
    195   %59 = bitcast i32 0 to i32
    196   %60 = bitcast i32 0 to i32
    197   %61 = bitcast i32 0 to i32
    198   %62 = bitcast i32 0 to i32
    199   %63 = bitcast i32 0 to i32
    200   %64 = bitcast i32 0 to i32
    201   %65 = bitcast i32 0 to i32
    202   %66 = bitcast i32 0 to i32
    203   %67 = bitcast i32 0 to i32
    204   %68 = bitcast i32 0 to i32
    205   %69 = bitcast i32 0 to i32
    206   %70 = bitcast i32 0 to i32
    207   %71 = bitcast i32 0 to i32
    208   %72 = bitcast i32 0 to i32
    209   %73 = bitcast i32 0 to i32
    210   %74 = bitcast i32 0 to i32
    211   %75 = bitcast i32 0 to i32
    212   %76 = bitcast i32 0 to i32
    213   %77 = bitcast i32 0 to i32
    214   %78 = bitcast i32 0 to i32
    215   %79 = bitcast i32 0 to i32
    216   %80 = bitcast i32 0 to i32
    217   %81 = bitcast i32 0 to i32
    218   %82 = bitcast i32 0 to i32
    219   %83 = bitcast i32 0 to i32
    220   %84 = bitcast i32 0 to i32
    221   %85 = bitcast i32 0 to i32
    222   %86 = bitcast i32 0 to i32
    223   %87 = bitcast i32 0 to i32
    224   %88 = bitcast i32 0 to i32
    225   %89 = bitcast i32 0 to i32
    226   %90 = bitcast i32 0 to i32
    227   %91 = bitcast i32 0 to i32
    228   %92 = bitcast i32 0 to i32
    229   %93 = bitcast i32 0 to i32
    230   %94 = bitcast i32 0 to i32
    231   %95 = bitcast i32 0 to i32
    232   %96 = bitcast i32 0 to i32
    233   %97 = bitcast i32 0 to i32
    234   %98 = bitcast i32 0 to i32
    235 
    236   ; CHECK:  store i32 -1, i32* @x, align 4
    237   store i32 -1, i32* @x, align 4
    238   ret i32 0
    239 }
    240 
    241 ; Function Attrs: nounwind readnone
    242 declare void @llvm.dbg.value(metadata, i64, metadata)
    243 
    244 !llvm.dbg.cu = !{!0}
    245 !llvm.module.flags = !{!11, !13}
    246 
    247 !0 = metadata !{i32 786449, metadata !1, i32 4, metadata !"clang version 3.4", i1 true, metadata !"", i32 0, metadata !2, metadata !2, metadata !3, metadata !9, metadata !2, metadata !""} ; [ DW_TAG_compile_unit ] [/home/tmp/test.c] [DW_LANG_C99]
    248 !1 = metadata !{metadata !"test.c", metadata !"/home/tmp"}
    249 !2 = metadata !{i32 0}
    250 !3 = metadata !{metadata !4}
    251 !4 = metadata !{i32 786478, metadata !1, metadata !5, metadata !"test_within_limit", metadata !"test_within_limit", metadata !"", i32 3, metadata !6, i1 false, i1 true, i32 0, i32 0, null, i32 256, i1 false, i32 ()* @test_within_limit, null, null, metadata !2, i32 4} ; [ DW_TAG_subprogram ] [line 3] [def] [scope 4] [test]
    252 !5 = metadata !{i32 786473, metadata !1}          ; [ DW_TAG_file_type ] [/home/tmp/test.c]
    253 !6 = metadata !{i32 786453, i32 0, null, metadata !"", i32 0, i64 0, i64 0, i64 0, i32 0, null, metadata !7, i32 0, null, null, null} ; [ DW_TAG_subroutine_type ] [line 0, size 0, align 0, offset 0] [from ]
    254 !7 = metadata !{metadata !8}
    255 !8 = metadata !{i32 786468, null, null, metadata !"int", i32 0, i64 32, i64 32, i64 0, i32 0, i32 5} ; [ DW_TAG_base_type ] [int] [line 0, size 32, align 32, offset 0, enc DW_ATE_signed]
    256 !9 = metadata !{metadata !10}
    257 !10 = metadata !{i32 786484, i32 0, null, metadata !"x", metadata !"x", metadata !"", metadata !5, i32 1, metadata !8, i32 0, i32 1, i32* @x, null} ; [ DW_TAG_variable ] [x] [line 1] [def]
    258 !11 = metadata !{i32 2, metadata !"Dwarf Version", i32 4}
    259 !12 = metadata !{i32* undef}
    260 
    261 !13 = metadata !{i32 1, metadata !"Debug Info Version", i32 1}
    262