| ; NOTE: Assertions have been autogenerated by utils/update_test_checks.py |
| ; RUN: opt -passes='default<O2>' -S < %s | FileCheck %s |
| @a = internal global i32 0, align 4 |
| @c = internal global ptr @b, align 8 |
| @b = internal global ptr null, align 8 |
| @e = internal global ptr @d, align 8 |
| @d = internal global i32 0, align 4 |
| |
| define i32 @main() { |
| ; CHECK-LABEL: @main( |
| ; CHECK-NEXT: entry: |
| ; CHECK-NEXT: [[TMP0:%.*]] = load ptr, ptr @e, align 8 |
| ; CHECK-NEXT: store i32 0, ptr [[TMP0]], align 4 |
| ; CHECK-NEXT: store ptr null, ptr @e, align 8 |
| ; CHECK-NEXT: ret i32 0 |
| ; |
| entry: |
| %h = alloca ptr, align 8 |
| %i = alloca ptr, align 8 |
| %j = alloca ptr, align 8 |
| store ptr @a, ptr %h, align 8 |
| store ptr @a, ptr %j, align 8 |
| %0 = load ptr, ptr %j, align 8 |
| store i32 1, ptr %0, align 4 |
| store ptr @a, ptr %i, align 8 |
| %1 = load ptr, ptr %i, align 8 |
| %2 = load ptr, ptr @c, align 8 |
| store ptr %1, ptr %2, align 8 |
| %3 = load ptr, ptr %h, align 8 |
| %call = call ptr @bar(ptr %3) |
| ret i32 0 |
| } |
| |
| define internal ptr @bar(ptr %g) { |
| entry: |
| %g.addr = alloca ptr, align 8 |
| store ptr %g, ptr %g.addr, align 8 |
| %0 = load ptr, ptr @e, align 8 |
| store i32 0, ptr %0, align 4 |
| %1 = load ptr, ptr %g.addr, align 8 |
| %2 = load i32, ptr %1, align 4 |
| %tobool = icmp ne i32 %2, 0 |
| br i1 %tobool, label %if.end, label %if.then |
| |
| if.then: ; preds = %entry |
| call void @foo() |
| br label %if.end |
| |
| if.end: ; preds = %if.then, %entry |
| store ptr null, ptr @e, align 8 |
| %3 = load ptr, ptr @b, align 8 |
| ret ptr %3 |
| } |
| |
| declare void @foo() |
| |