xref: /llvm-project/llvm/test/Transforms/JumpThreading/phi-copy-to-pred.ll (revision 07e34d2de565a88da2724d52cdcf47b4bca873db)
1; NOTE: Assertions have been autogenerated by utils/update_test_checks.py
2; RUN: opt -passes=jump-threading -S < %s | FileCheck %s
3
4declare void @f()
5declare void @g()
6declare void @h()
7
8define i32 @test(i1 %cond, i1 %a, i1 %b) {
9; CHECK-LABEL: @test(
10; CHECK-NEXT:    br i1 [[COND:%.*]], label [[A:%.*]], label [[C:%.*]]
11; CHECK:       A:
12; CHECK-NEXT:    call void @f()
13; CHECK-NEXT:    br i1 [[A:%.*]], label [[EXIT1:%.*]], label [[EXIT2:%.*]]
14; CHECK:       C:
15; CHECK-NEXT:    call void @g()
16; CHECK-NEXT:    br i1 [[B:%.*]], label [[EXIT1]], label [[EXIT2]]
17; CHECK:       EXIT1:
18; CHECK-NEXT:    ret i32 0
19; CHECK:       EXIT2:
20; CHECK-NEXT:    ret i32 1
21;
22  br i1 %cond, label %A, label %B
23A:
24  call void @f()
25  br label %C
26B:
27  call void @g()
28  br label %C
29C:
30  %p = phi i1 [%a, %A], [%b, %B] ; Check that this is removed
31  br i1 %p, label %EXIT1, label %EXIT2
32EXIT1:
33  ret i32 0
34EXIT2:
35  ret i32 1
36}
37
38define i32 @test2(i1 %cond, i1 %a, i1 %b) {
39; CHECK-LABEL: @test2(
40; CHECK-NEXT:    br i1 [[COND:%.*]], label [[A:%.*]], label [[C:%.*]]
41; CHECK:       A:
42; CHECK-NEXT:    call void @f()
43; CHECK-NEXT:    [[P_FR1:%.*]] = freeze i1 [[A:%.*]]
44; CHECK-NEXT:    br i1 [[P_FR1]], label [[EXIT1:%.*]], label [[EXIT2:%.*]]
45; CHECK:       C:
46; CHECK-NEXT:    call void @g()
47; CHECK-NEXT:    [[P_FR:%.*]] = freeze i1 [[B:%.*]]
48; CHECK-NEXT:    br i1 [[P_FR]], label [[EXIT1]], label [[EXIT2]]
49; CHECK:       EXIT1:
50; CHECK-NEXT:    ret i32 0
51; CHECK:       EXIT2:
52; CHECK-NEXT:    ret i32 1
53;
54  br i1 %cond, label %A, label %B
55A:
56  call void @f()
57  br label %C
58B:
59  call void @g()
60  br label %C
61C:
62  %p = phi i1 [%a, %A], [%b, %B] ; Check that this is removed
63  %p.fr = freeze i1 %p
64  br i1 %p.fr, label %EXIT1, label %EXIT2
65EXIT1:
66  ret i32 0
67EXIT2:
68  ret i32 1
69}
70