1 ; RUN: opt -basicaa -dse -S < %s | FileCheck %s 2 3 target datalayout = "e-p:64:64:64-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:64:64-f32:32:32-f64:64:64-v64:64:64-v128:128:128-a0:0:64-s0:64:64-f80:128:128-n8:16:32:64" 4 target triple = "x86_64-apple-macosx10.7.0" 5 6 ; Sanity tests for atomic stores. 7 ; Note that it turns out essentially every transformation DSE does is legal on 8 ; atomic ops, just some transformations are not allowed across them. 9 10 @x = common global i32 0, align 4 11 @y = common global i32 0, align 4 12 13 declare void @randomop(i32*) 14 15 ; DSE across unordered store (allowed) 16 define void @test1() nounwind uwtable ssp { 17 ; CHECK: test1 18 ; CHECK-NOT: store i32 0 19 ; CHECK: store i32 1 20 entry: 21 store i32 0, i32* @x 22 store atomic i32 0, i32* @y unordered, align 4 23 store i32 1, i32* @x 24 ret void 25 } 26 27 ; DSE across seq_cst load (allowed in theory; not implemented ATM) 28 define i32 @test2() nounwind uwtable ssp { 29 ; CHECK: test2 30 ; CHECK: store i32 0 31 ; CHECK: store i32 1 32 entry: 33 store i32 0, i32* @x 34 %x = load atomic i32* @y seq_cst, align 4 35 store i32 1, i32* @x 36 ret i32 %x 37 } 38 39 ; DSE across seq_cst store (store before atomic store must not be removed) 40 define void @test3() nounwind uwtable ssp { 41 ; CHECK: test3 42 ; CHECK: store i32 43 ; CHECK: store atomic i32 2 44 entry: 45 store i32 0, i32* @x 46 store atomic i32 2, i32* @y seq_cst, align 4 47 store i32 1, i32* @x 48 ret void 49 } 50 51 ; DSE remove unordered store (allowed) 52 define void @test4() nounwind uwtable ssp { 53 ; CHECK: test4 54 ; CHECK-NOT: store atomic 55 ; CHECK: store i32 1 56 entry: 57 store atomic i32 0, i32* @x unordered, align 4 58 store i32 1, i32* @x 59 ret void 60 } 61 62 ; DSE unordered store overwriting non-atomic store (allowed) 63 define void @test5() nounwind uwtable ssp { 64 ; CHECK: test5 65 ; CHECK: store atomic i32 1 66 entry: 67 store i32 0, i32* @x 68 store atomic i32 1, i32* @x unordered, align 4 69 ret void 70 } 71 72 ; DSE no-op unordered atomic store (allowed) 73 define void @test6() nounwind uwtable ssp { 74 ; CHECK: test6 75 ; CHECK-NOT: store 76 ; CHECK: ret void 77 entry: 78 %x = load atomic i32* @x unordered, align 4 79 store atomic i32 %x, i32* @x unordered, align 4 80 ret void 81 } 82 83 ; DSE seq_cst store (be conservative; DSE doesn't have infrastructure 84 ; to reason about atomic operations). 85 define void @test7() nounwind uwtable ssp { 86 ; CHECK: test7 87 ; CHECK: store atomic 88 entry: 89 %a = alloca i32 90 store atomic i32 0, i32* %a seq_cst, align 4 91 ret void 92 } 93 94 ; DSE and seq_cst load (be conservative; DSE doesn't have infrastructure 95 ; to reason about atomic operations). 96 define i32 @test8() nounwind uwtable ssp { 97 ; CHECK: test8 98 ; CHECK: store 99 ; CHECK: load atomic 100 entry: 101 %a = alloca i32 102 call void @randomop(i32* %a) 103 store i32 0, i32* %a, align 4 104 %x = load atomic i32* @x seq_cst, align 4 105 ret i32 %x 106 } 107 108