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