• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1; RUN: opt < %s -basicaa -sink -S | FileCheck %s
2
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}
23
24; But don't sink volatile loads...
25
26;      CHECK: @foo2
27;      CHECK: load volatile
28; CHECK-NEXT: store i32
29
30define i32 @foo2(i1 %z) {
31  %l = load volatile i32* @A
32  store i32 0, i32* @B
33  br i1 %z, label %true, label %false
34true:
35  ret i32 %l
36false:
37  ret i32 0
38}
39