1; RUN: opt < %s -passes=dse -S | FileCheck %s 2 3declare noalias ptr @calloc(i64, i64) inaccessiblememonly allockind("alloc,zeroed") 4 5define ptr @test1() { 6; CHECK-LABEL: test1 7 %1 = tail call noalias ptr @calloc(i64 1, i64 4) 8 ; This store is dead and should be removed 9 store i32 0, ptr %1, align 4 10; CHECK-NOT: store i32 0, ptr %1, align 4 11 ret ptr %1 12} 13 14define ptr @test2() { 15; CHECK-LABEL: test2 16 %1 = tail call noalias ptr @calloc(i64 1, i64 4) 17 %2 = getelementptr i32, ptr %1, i32 5 18 store i32 0, ptr %2, align 4 19; CHECK-NOT: store i32 0, ptr %1, align 4 20 ret ptr %1 21} 22 23define ptr @test3(ptr %arg) { 24; CHECK-LABEL: test3 25 store i32 0, ptr %arg, align 4 26; CHECK: store i32 0, ptr %arg, align 4 27 ret ptr %arg 28} 29 30declare void @clobber_memory(ptr) 31define ptr @test4() { 32; CHECK-LABEL: test4 33 %1 = tail call noalias ptr @calloc(i64 1, i64 4) 34 call void @clobber_memory(ptr %1) 35 store i8 0, ptr %1, align 4 36; CHECK: store i8 0, ptr %1, align 4 37 ret ptr %1 38} 39 40define ptr @test5() { 41; CHECK-LABEL: test5 42 %1 = tail call noalias ptr @calloc(i64 1, i64 4) 43 store volatile i32 0, ptr %1, align 4 44; CHECK: store volatile i32 0, ptr %1, align 4 45 ret ptr %1 46} 47 48define ptr @test6() { 49; CHECK-LABEL: test6 50 %1 = tail call noalias ptr @calloc(i64 1, i64 4) 51 store i8 5, ptr %1, align 4 52; CHECK: store i8 5, ptr %1, align 4 53 ret ptr %1 54} 55 56define ptr @test7(i8 %arg) { 57; CHECK-LABEL: test7 58 %1 = tail call noalias ptr @calloc(i64 1, i64 4) 59 store i8 %arg, ptr %1, align 4 60; CHECK: store i8 %arg, ptr %1, align 4 61 ret ptr %1 62} 63 64define ptr @test8() { 65; CHECK-LABEL: test8 66; CHECK-NOT: store 67 %p = tail call noalias ptr @calloc(i64 1, i64 4) 68 store i8 0, ptr %p, align 1 69 %p.1 = getelementptr i8, ptr %p, i32 1 70 store i8 0, ptr %p.1, align 1 71 %p.3 = getelementptr i8, ptr %p, i32 3 72 store i8 0, ptr %p.3, align 1 73 %p.2 = getelementptr i8, ptr %p, i32 2 74 store i8 0, ptr %p.2, align 1 75 ret ptr %p 76} 77 78define ptr @test9() { 79; CHECK-LABEL: test9 80; CHECK-NEXT: %p = tail call noalias ptr @calloc(i64 1, i64 4) 81; CHECK-NEXT: store i8 5, ptr %p, align 1 82; CHECK-NEXT: ret ptr %p 83 84 %p = tail call noalias ptr @calloc(i64 1, i64 4) 85 store i8 5, ptr %p, align 1 86 %p.1 = getelementptr i8, ptr %p, i32 1 87 store i8 0, ptr %p.1, align 1 88 %p.3 = getelementptr i8, ptr %p, i32 3 89 store i8 0, ptr %p.3, align 1 90 %p.2 = getelementptr i8, ptr %p, i32 2 91 store i8 0, ptr %p.2, align 1 92 ret ptr %p 93} 94 95define ptr @test10() { 96; CHECK-LABEL: @test10( 97; CHECK-NEXT: [[P:%.*]] = tail call noalias ptr @calloc(i64 1, i64 4) 98; CHECK-NEXT: [[P_3:%.*]] = getelementptr i8, ptr [[P]], i32 3 99; CHECK-NEXT: store i8 5, ptr [[P_3]], align 1 100; CHECK-NEXT: ret ptr [[P]] 101; 102 103 %p = tail call noalias ptr @calloc(i64 1, i64 4) 104 store i8 0, ptr %p, align 1 105 %p.1 = getelementptr i8, ptr %p, i32 1 106 store i8 0, ptr %p.1, align 1 107 %p.3 = getelementptr i8, ptr %p, i32 3 108 store i8 5, ptr %p.3, align 1 109 %p.2 = getelementptr i8, ptr %p, i32 2 110 store i8 0, ptr %p.2, align 1 111 ret ptr %p 112} 113 114define ptr @test11() { 115; CHECK-LABEL: @test11( 116; CHECK-NEXT: [[P:%.*]] = tail call noalias ptr @calloc(i64 1, i64 4) 117; CHECK-NEXT: ret ptr [[P]] 118; 119 120 %p = tail call noalias ptr @calloc(i64 1, i64 4) 121 store i8 0, ptr %p, align 1 122 %p.1 = getelementptr i8, ptr %p, i32 1 123 store i8 0, ptr %p.1, align 1 124 %p.3 = getelementptr i8, ptr %p, i32 3 125 store i8 5, ptr %p.3, align 1 126 %p.2 = getelementptr i8, ptr %p, i32 2 127 store i8 0, ptr %p.2, align 1 128 %p.3.2 = getelementptr i8, ptr %p, i32 3 129 store i8 0, ptr %p.3.2, align 1 130 ret ptr %p 131} 132 133define ptr @test12() { 134; CHECK-LABEL: @test12( 135; CHECK-NEXT: [[P:%.*]] = tail call noalias ptr @calloc(i64 1, i64 4) 136; CHECK-NEXT: [[P_3:%.*]] = getelementptr i8, ptr [[P]], i32 3 137; CHECK-NEXT: store i8 5, ptr [[P_3]], align 1 138; CHECK-NEXT: call void @use(ptr [[P]]) 139; CHECK-NEXT: [[P_3_2:%.*]] = getelementptr i8, ptr [[P]], i32 3 140; CHECK-NEXT: store i8 0, ptr [[P_3_2]], align 1 141; CHECK-NEXT: ret ptr [[P]] 142; 143 144 %p = tail call noalias ptr @calloc(i64 1, i64 4) 145 %p.3 = getelementptr i8, ptr %p, i32 3 146 store i8 5, ptr %p.3, align 1 147 call void @use(ptr %p) 148 %p.3.2 = getelementptr i8, ptr %p, i32 3 149 store i8 0, ptr %p.3.2, align 1 150 ret ptr %p 151} 152 153declare void @use(ptr) readonly 154