| ; RUN: opt < %s -basicaa -sink -S | FileCheck %s |
| |
| @A = external global i32 |
| @B = external global i32 |
| |
| ; Sink should sink the load past the store (which doesn't overlap) into |
| ; the block that uses it. |
| |
| ; CHECK: @foo |
| ; CHECK: true: |
| ; CHECK-NEXT: %l = load i32* @A |
| ; CHECK-NEXT: ret i32 %l |
| |
| define i32 @foo(i1 %z) { |
| %l = load i32* @A |
| store i32 0, i32* @B |
| br i1 %z, label %true, label %false |
| true: |
| ret i32 %l |
| false: |
| ret i32 0 |
| } |
| |
| ; But don't sink volatile loads... |
| |
| ; CHECK: @foo2 |
| ; CHECK: load volatile |
| ; CHECK-NEXT: store i32 |
| |
| define i32 @foo2(i1 %z) { |
| %l = load volatile i32* @A |
| store i32 0, i32* @B |
| br i1 %z, label %true, label %false |
| true: |
| ret i32 %l |
| false: |
| ret i32 0 |
| } |