| ; RUN: llvm-reduce -abort-on-invalid-reduction --delta-passes=simplify-unconditional-branch --test FileCheck --test-arg --check-prefix=CHECK-INTERESTINGNESS --test-arg %s --test-arg --input-file %s -o %t |
| ; RUN: FileCheck --check-prefix=RESULT %s < %t |
| |
| ; CHECK_INTERESTINGNESS-LABEL: define void @test_phi1 |
| ; CHECK-INTERESTINGNESS: %A = alloca i32 |
| ; CHECK-INTERESTINGNESS: store i32 %{{P|V}}, ptr %A |
| |
| ; RESULT-LABEL: define void @test_phi1 |
| ; RESULT: entry: |
| ; RESULT-NEXT: %A = alloca i32 |
| ; RESULT-NEXT: store i32 %V, ptr %A |
| ; RESULT-NEXT: ret void |
| |
| define void @test_phi1(i32 %V) { |
| entry: |
| %A = alloca i32 |
| br label %loop.body |
| loop.body: |
| %P = phi i32 [ %V, %entry ], [ %P, %loop.body ] |
| store i32 %P, ptr %A |
| br label %loop.body |
| } |
| |
| ; CHECK_INTERESTINGNESS-LABEL: define void @test_phi2 |
| ; CHECK-INTERESTINGNESS: %A = alloca i32 |
| ; CHECK-INTERESTINGNESS: store i32 %{{P|V}}, ptr %A |
| |
| ; RESULT-LABEL: define void @test_phi2 |
| ; RESULT: entry: |
| ; RESULT-NEXT: %A = alloca i32 |
| ; RESULT-NEXT: br i1 %C, label %loop.body, label %load |
| ; RESULT: load: |
| ; RESULT-NEXT: %L = load i32, ptr %A |
| ; RESULT-NEXT: ret void |
| ; RESULT: loop.body: |
| ; RESULT-NEXT: %P = phi i32 [ %V, %entry ] |
| ; RESULT-NEXT: store i32 %P, ptr %A |
| ; RESULT-NEXT: ret void |
| |
| define void @test_phi2(i1 %C, i32 %V) { |
| entry: |
| %A = alloca i32 |
| br i1 %C, label %loop.body, label %load |
| load: |
| %L = load i32, ptr %A |
| br label %loop.body |
| loop.body: |
| %P = phi i32 [ %V, %entry ], [ %P, %loop.body ], [ %L, %load ] |
| store i32 %P, ptr %A |
| br label %loop.body |
| } |
| |
| ; CHECK_INTERESTINGNESS-LABEL: define void @test_phi3 |
| ; CHECK-INTERESTINGNESS: %A = alloca i32 |
| ; CHECK-INTERESTINGNESS: store i32 %{{P|V}}, ptr %A |
| |
| ; RESULT-LABEL: define void @test_phi3 |
| ; RESULT: entry: |
| ; RESULT-NEXT: %A = alloca i32 |
| ; RESULT-NEXT: switch i32 %S, label %loop.body [ |
| ; RESULT-NEXT: i32 1, label %loop.body |
| ; RESULT-NEXT: i32 2, label %loop.body |
| ; RESULT-NEXT: i32 3, label %load |
| ; RESULT-NEXT: ] |
| ; RESULT: load: |
| ; RESULT-NEXT: %L = load i32, ptr %A |
| ; RESULT-NEXT: ret void |
| ; RESULT: loop.body: |
| ; RESULT-NEXT: %P = phi i32 [ %V, %entry ], [ %V, %entry ], [ %V, %entry ] |
| ; RESULT-NEXT: store i32 %P, ptr %A |
| ; RESULT-NEXT: ret void |
| |
| |
| define void @test_phi3(i32 %S, i32 %V) { |
| entry: |
| %A = alloca i32 |
| switch i32 %S, label %loop.body [ |
| i32 1, label %loop.body |
| i32 2, label %loop.body |
| i32 3, label %load |
| ] |
| load: |
| %L = load i32, ptr %A |
| br label %loop.body |
| loop.body: |
| %P = phi i32 [ %V, %entry ], [ %P, %loop.body ], [ %V, %entry ], [ %V, %entry ], [ %L, %load ] |
| store i32 %P, ptr %A |
| br label %loop.body |
| } |