blob: 23433728c13a675b83757892ceb50ba07888b305 [file] [log] [blame]
Dan Gohmanc1be92f2010-10-18 18:04:47 +00001; RUN: opt < %s -basicaa -sink -S | FileCheck %s
Dan Gohman28a193e2010-05-07 15:40:13 +00002
3@A = external global i32
4@B = external global i32
5
6; Sink should sink the load past the store (which doesn't overlap) into
7; the block that uses it.
8
9; CHECK: @foo
10; CHECK: true:
11; CHECK-NEXT: %l = load i32* @A
12; CHECK-NEXT: ret i32 %l
13
14define i32 @foo(i1 %z) {
15 %l = load i32* @A
16 store i32 0, i32* @B
17 br i1 %z, label %true, label %false
18true:
19 ret i32 %l
20false:
21 ret i32 0
22}
Eli Friedman86b5db82011-09-01 21:21:24 +000023
24; But don't sink volatile loads...
25
26; CHECK: @foo2
Eli Friedman770e16f2011-09-01 21:25:42 +000027; CHECK: load volatile
Eli Friedman86b5db82011-09-01 21:21:24 +000028; CHECK-NEXT: store i32
29
30define i32 @foo2(i1 %z) {
Eli Friedman770e16f2011-09-01 21:25:42 +000031 %l = load volatile i32* @A
Eli Friedman86b5db82011-09-01 21:21:24 +000032 store i32 0, i32* @B
33 br i1 %z, label %true, label %false
34true:
35 ret i32 %l
36false:
37 ret i32 0
38}