26 changes: 26 additions & 0 deletions llvm/test/Transforms/DeadStoreElimination/cycle.ll
Original file line number Diff line number Diff line change
@@ -0,0 +1,26 @@
; RUN: opt < %s -basicaa -dse -S | FileCheck %s

@Table = global [535 x i32] zeroinitializer, align 4

; The store in for.inc block should NOT be removed by non-local DSE.
; CHECK: store i32 64, i32* %arrayidx
;
define void @foo() {
entry:
br label %for.body

for.body:
%i = phi i32 [ 0, %entry ], [ %inc, %for.inc ]
%arrayidx = getelementptr inbounds [535 x i32], [535 x i32]* @Table, i32 0, i32 %i
store i32 %i, i32* %arrayidx, align 4
%cmp1 = icmp slt i32 %i, 64
br i1 %cmp1, label %for.inc, label %for.end

for.inc:
store i32 64, i32* %arrayidx, align 4
%inc = add nsw i32 %i, 1
br label %for.body

for.end:
ret void
}
22 changes: 22 additions & 0 deletions llvm/test/Transforms/DeadStoreElimination/ifthen.ll
Original file line number Diff line number Diff line change
@@ -0,0 +1,22 @@
; RUN: opt < %s -basicaa -dse -S | FileCheck %s

; The store and add in if.then block should be removed by non-local DSE.
; CHECK-NOT: %stval = add
; CHECK-NOT: store i32 %stval
;
define void @foo(i32* noalias nocapture %a, i32* noalias nocapture readonly %b, i32 %c) {
entry:
%cmp = icmp sgt i32 %c, 0
br i1 %cmp, label %if.then, label %if.end

if.then:
%0 = load i32, i32* %b, align 4
%stval = add nsw i32 %0, 1
store i32 %stval, i32* %a, align 4
br label %if.end

if.end:
%m.0 = phi i32 [ 13, %if.then ], [ 10, %entry ]
store i32 %m.0, i32* %a, align 4
ret void
}
27 changes: 27 additions & 0 deletions llvm/test/Transforms/DeadStoreElimination/ifthenelse.ll
Original file line number Diff line number Diff line change
@@ -0,0 +1,27 @@
; RUN: opt < %s -basicaa -dse -S | FileCheck %s

; The add and store in entry block should be removed by non-local DSE.
; CHECK-NOT: %stval = add
; CHECK-NOT: store i32 %stval
;
define void @foo(i32* noalias nocapture %a, i32* noalias nocapture readonly %b, i32 %c) {
entry:
%0 = load i32, i32* %b, align 4
%stval = add nsw i32 %0, 1
store i32 %stval, i32* %a, align 4
%cmp = icmp sgt i32 %c, 0
br i1 %cmp, label %if.then, label %if.else

if.then:
%1 = add nsw i32 %c, 10
br label %if.end

if.else:
%2 = add nsw i32 %c, 13
br label %if.end

if.end:
%3 = phi i32 [ %1, %if.then ], [ %2, %if.else ]
store i32 %3, i32* %a, align 4
ret void
}
34 changes: 34 additions & 0 deletions llvm/test/Transforms/DeadStoreElimination/ifthenelse2.ll
Original file line number Diff line number Diff line change
@@ -0,0 +1,34 @@
; RUN: opt < %s -basicaa -dse -S | FileCheck %s

; The add and store in entry block should be removed by non-local DSE.
; CHECK-NOT: %stval = add
; CHECK-NOT: store i32 %stval
;
; The stores in if.then and if.else blocks should be removed by non-local DSE.
; CHECK-NOT: store i32 %1
; CHECK-NOT: store i32 %2
;
define void @foo(i32* noalias nocapture %a, i32* noalias nocapture readonly %b, i32 %c) {
entry:
%0 = load i32, i32* %b, align 4
%stval = add nsw i32 %0, 1
store i32 %stval, i32* %a, align 4
%cmp = icmp sgt i32 %c, 0
br i1 %cmp, label %if.then, label %if.else

if.then:
%1 = add nsw i32 %c, 10
store i32 %1, i32* %a, align 4
br label %if.end

if.else:
%2 = add nsw i32 %c, 13
store i32 %2, i32* %a, align 4
br label %if.end

if.end:
%3 = phi i32 [ %1, %if.then ], [ %2, %if.else ]
%4 = sub nsw i32 %3, 6
store i32 %4, i32* %a, align 4
ret void
}
42 changes: 42 additions & 0 deletions llvm/test/Transforms/DeadStoreElimination/loop.ll
Original file line number Diff line number Diff line change
@@ -0,0 +1,42 @@
; RUN: opt < %s -basicaa -dse -S | FileCheck %s

; The store in for.body block should be removed by non-local DSE.
; CHECK-NOT: store i32 0, i32* %arrayidx
;
define void @sum(i32 %N, i32* noalias nocapture %C, i32* noalias nocapture readonly %A, i32* noalias nocapture readonly %B) {
entry:
%cmp24 = icmp eq i32 %N, 0
br i1 %cmp24, label %for.end11, label %for.body

for.body:
%i.025 = phi i32 [ %inc10, %for.cond1.for.inc9_crit_edge ], [ 0, %entry ]
%arrayidx = getelementptr inbounds i32, i32* %C, i32 %i.025
store i32 0, i32* %arrayidx, align 4
%mul = mul i32 %i.025, %N
%arrayidx4.gep = getelementptr i32, i32* %A, i32 %mul
br label %for.body3

for.body3:
%0 = phi i32 [ 0, %for.body ], [ %add8, %for.body3 ]
%arrayidx4.phi = phi i32* [ %arrayidx4.gep, %for.body ], [ %arrayidx4.inc, %for.body3 ]
%arrayidx5.phi = phi i32* [ %B, %for.body ], [ %arrayidx5.inc, %for.body3 ]
%j.023 = phi i32 [ 0, %for.body ], [ %inc, %for.body3 ]
%1 = load i32, i32* %arrayidx4.phi, align 4
%2 = load i32, i32* %arrayidx5.phi, align 4
%add6 = add nsw i32 %2, %1
%add8 = add nsw i32 %add6, %0
%inc = add i32 %j.023, 1
%exitcond = icmp ne i32 %inc, %N
%arrayidx4.inc = getelementptr i32, i32* %arrayidx4.phi, i32 1
%arrayidx5.inc = getelementptr i32, i32* %arrayidx5.phi, i32 1
br i1 %exitcond, label %for.body3, label %for.cond1.for.inc9_crit_edge

for.cond1.for.inc9_crit_edge:
store i32 %add8, i32* %arrayidx, align 4
%inc10 = add i32 %i.025, 1
%exitcond26 = icmp ne i32 %inc10, %N
br i1 %exitcond26, label %for.body, label %for.end11

for.end11:
ret void
}