xref: /aosp_15_r20/external/llvm/test/Transforms/JumpThreading/phi-known.ll (revision 9880d6810fe72a1726cb53787c6711e909410d58)
1*9880d681SAndroid Build Coastguard Worker; RUN: opt -S -jump-threading %s | FileCheck %s
2*9880d681SAndroid Build Coastguard Worker
3*9880d681SAndroid Build Coastguard Worker; Value of predicate known on all inputs (trivial case)
4*9880d681SAndroid Build Coastguard Worker; Note: InstCombine/EarlyCSE would also get this case
5*9880d681SAndroid Build Coastguard Workerdefine void @test(i8* %p, i8** %addr) {
6*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test
7*9880d681SAndroid Build Coastguard Workerentry:
8*9880d681SAndroid Build Coastguard Worker  %cmp0 = icmp eq i8* %p, null
9*9880d681SAndroid Build Coastguard Worker  br i1 %cmp0, label %exit, label %loop
10*9880d681SAndroid Build Coastguard Workerloop:
11*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: loop:
12*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: phi
13*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: br label %loop
14*9880d681SAndroid Build Coastguard Worker  %p1 = phi i8* [%p, %entry], [%p1, %loop]
15*9880d681SAndroid Build Coastguard Worker  %cmp1 = icmp eq i8* %p1, null
16*9880d681SAndroid Build Coastguard Worker  br i1 %cmp1, label %exit, label %loop
17*9880d681SAndroid Build Coastguard Workerexit:
18*9880d681SAndroid Build Coastguard Worker  ret void
19*9880d681SAndroid Build Coastguard Worker}
20*9880d681SAndroid Build Coastguard Worker
21*9880d681SAndroid Build Coastguard Worker; Value of predicate known on all inputs (non-trivial)
22*9880d681SAndroid Build Coastguard Workerdefine void @test2(i8* %p) {
23*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test2
24*9880d681SAndroid Build Coastguard Workerentry:
25*9880d681SAndroid Build Coastguard Worker  %cmp0 = icmp eq i8* %p, null
26*9880d681SAndroid Build Coastguard Worker  br i1 %cmp0, label %exit, label %loop
27*9880d681SAndroid Build Coastguard Workerloop:
28*9880d681SAndroid Build Coastguard Worker  %p1 = phi i8* [%p, %entry], [%p2, %backedge]
29*9880d681SAndroid Build Coastguard Worker  %cmp1 = icmp eq i8* %p1, null
30*9880d681SAndroid Build Coastguard Worker  br i1 %cmp1, label %exit, label %backedge
31*9880d681SAndroid Build Coastguard Workerbackedge:
32*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: backedge:
33*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: phi
34*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: bitcast
35*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: load
36*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: cmp
37*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: br
38*9880d681SAndroid Build Coastguard Worker; CHECK-DAG: label %backedge
39*9880d681SAndroid Build Coastguard Worker  %addr = bitcast i8* %p1 to i8**
40*9880d681SAndroid Build Coastguard Worker  %p2 = load i8*, i8** %addr
41*9880d681SAndroid Build Coastguard Worker  %cmp2 = icmp eq i8* %p2, null
42*9880d681SAndroid Build Coastguard Worker  br i1 %cmp2, label %exit, label %loop
43*9880d681SAndroid Build Coastguard Workerexit:
44*9880d681SAndroid Build Coastguard Worker  ret void
45*9880d681SAndroid Build Coastguard Worker}
46*9880d681SAndroid Build Coastguard Worker
47*9880d681SAndroid Build Coastguard Worker; If the inputs don't branch the same way, we can't rewrite
48*9880d681SAndroid Build Coastguard Worker; Well, we could unroll this loop exactly twice, but that's
49*9880d681SAndroid Build Coastguard Worker; a different transform.
50*9880d681SAndroid Build Coastguard Workerdefine void @test_mixed(i8* %p) {
51*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test_mixed
52*9880d681SAndroid Build Coastguard Workerentry:
53*9880d681SAndroid Build Coastguard Worker  %cmp0 = icmp eq i8* %p, null
54*9880d681SAndroid Build Coastguard Worker  br i1 %cmp0, label %exit, label %loop
55*9880d681SAndroid Build Coastguard Workerloop:
56*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: loop:
57*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: phi
58*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: %cmp1 = icmp
59*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: br i1 %cmp1
60*9880d681SAndroid Build Coastguard Worker  %p1 = phi i8* [%p, %entry], [%p1, %loop]
61*9880d681SAndroid Build Coastguard Worker  %cmp1 = icmp ne i8* %p1, null
62*9880d681SAndroid Build Coastguard Worker  br i1 %cmp1, label %exit, label %loop
63*9880d681SAndroid Build Coastguard Workerexit:
64*9880d681SAndroid Build Coastguard Worker  ret void
65*9880d681SAndroid Build Coastguard Worker}
66*9880d681SAndroid Build Coastguard Worker
67