xref: /aosp_15_r20/external/llvm/test/Transforms/JumpThreading/induction.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 Workerdefine i8 @test(i32 %a, i32 %length) {
4*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test
5*9880d681SAndroid Build Coastguard Workerentry:
6*9880d681SAndroid Build Coastguard Worker; CHECK: br label %backedge
7*9880d681SAndroid Build Coastguard Worker  br label %loop
8*9880d681SAndroid Build Coastguard Worker
9*9880d681SAndroid Build Coastguard Workerloop:
10*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: backedge:
11*9880d681SAndroid Build Coastguard Worker; CHECK: phi i32
12*9880d681SAndroid Build Coastguard Worker; CHECK: br i1 %cont, label %backedge, label %exit
13*9880d681SAndroid Build Coastguard Worker  %iv = phi i32 [0, %entry], [%iv.next, %backedge]
14*9880d681SAndroid Build Coastguard Worker  ;; We can use an inductive argument to prove %iv is always positive
15*9880d681SAndroid Build Coastguard Worker  %cnd = icmp sge i32 %iv, 0
16*9880d681SAndroid Build Coastguard Worker  br i1 %cnd, label %backedge, label %exit
17*9880d681SAndroid Build Coastguard Worker
18*9880d681SAndroid Build Coastguard Workerbackedge:
19*9880d681SAndroid Build Coastguard Worker  %iv.next = add nsw i32 %iv, 1
20*9880d681SAndroid Build Coastguard Worker  %cont = icmp slt i32 %iv.next, 400
21*9880d681SAndroid Build Coastguard Worker  br i1 %cont, label %loop, label %exit
22*9880d681SAndroid Build Coastguard Workerexit:
23*9880d681SAndroid Build Coastguard Worker  ret i8 0
24*9880d681SAndroid Build Coastguard Worker}
25*9880d681SAndroid Build Coastguard Worker
26