xref: /aosp_15_r20/external/llvm/test/Transforms/LoopDeletion/multiple-exit-conditions.ll (revision 9880d6810fe72a1726cb53787c6711e909410d58)
1*9880d681SAndroid Build Coastguard Worker; RUN: opt < %s -loop-deletion -S | FileCheck %s
2*9880d681SAndroid Build Coastguard Worker; RUN: opt < %s -passes='require<scalar-evolution>,loop(loop-deletion)' -S | FileCheck %s
3*9880d681SAndroid Build Coastguard Worker
4*9880d681SAndroid Build Coastguard Worker; ScalarEvolution can prove the loop iteration is finite, even though
5*9880d681SAndroid Build Coastguard Worker; it can't represent the exact trip count as an expression. That's
6*9880d681SAndroid Build Coastguard Worker; good enough to let the loop be deleted.
7*9880d681SAndroid Build Coastguard Worker
8*9880d681SAndroid Build Coastguard Worker; CHECK:      entry:
9*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:   br label %return
10*9880d681SAndroid Build Coastguard Worker
11*9880d681SAndroid Build Coastguard Worker; CHECK:      return:
12*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:   ret void
13*9880d681SAndroid Build Coastguard Worker
14*9880d681SAndroid Build Coastguard Workerdefine void @foo(i64 %n, i64 %m) nounwind {
15*9880d681SAndroid Build Coastguard Workerentry:
16*9880d681SAndroid Build Coastguard Worker  br label %bb
17*9880d681SAndroid Build Coastguard Worker
18*9880d681SAndroid Build Coastguard Workerbb:
19*9880d681SAndroid Build Coastguard Worker  %x.0 = phi i64 [ 0, %entry ], [ %t0, %bb ]
20*9880d681SAndroid Build Coastguard Worker  %t0 = add i64 %x.0, 1
21*9880d681SAndroid Build Coastguard Worker  %t1 = icmp slt i64 %x.0, %n
22*9880d681SAndroid Build Coastguard Worker  %t3 = icmp sgt i64 %x.0, %m
23*9880d681SAndroid Build Coastguard Worker  %t4 = and i1 %t1, %t3
24*9880d681SAndroid Build Coastguard Worker  br i1 %t4, label %bb, label %return
25*9880d681SAndroid Build Coastguard Worker
26*9880d681SAndroid Build Coastguard Workerreturn:
27*9880d681SAndroid Build Coastguard Worker  ret void
28*9880d681SAndroid Build Coastguard Worker}
29