xref: /aosp_15_r20/external/llvm/test/Analysis/ScalarEvolution/sle.ll (revision 9880d6810fe72a1726cb53787c6711e909410d58)
1*9880d681SAndroid Build Coastguard Worker; RUN: opt -analyze -scalar-evolution < %s | FileCheck %s
2*9880d681SAndroid Build Coastguard Worker
3*9880d681SAndroid Build Coastguard Worker; ScalarEvolution should be able to use nsw information to prove that
4*9880d681SAndroid Build Coastguard Worker; this loop has a finite trip count.
5*9880d681SAndroid Build Coastguard Worker
6*9880d681SAndroid Build Coastguard Worker; CHECK: @le
7*9880d681SAndroid Build Coastguard Worker; CHECK: Loop %for.body: backedge-taken count is %n
8*9880d681SAndroid Build Coastguard Worker; CHECK: Loop %for.body: max backedge-taken count is 9223372036854775807
9*9880d681SAndroid Build Coastguard Worker
10*9880d681SAndroid Build Coastguard Workerdefine void @le(i64 %n, double* nocapture %p) nounwind {
11*9880d681SAndroid Build Coastguard Workerentry:
12*9880d681SAndroid Build Coastguard Worker  %cmp6 = icmp slt i64 %n, 0                      ; <i1> [#uses=1]
13*9880d681SAndroid Build Coastguard Worker  br i1 %cmp6, label %for.end, label %for.body
14*9880d681SAndroid Build Coastguard Worker
15*9880d681SAndroid Build Coastguard Workerfor.body:                                         ; preds = %for.body, %entry
16*9880d681SAndroid Build Coastguard Worker  %i = phi i64 [ %i.next, %for.body ], [ 0, %entry ] ; <i64> [#uses=2]
17*9880d681SAndroid Build Coastguard Worker  %arrayidx = getelementptr double, double* %p, i64 %i    ; <double*> [#uses=2]
18*9880d681SAndroid Build Coastguard Worker  %t4 = load double, double* %arrayidx                    ; <double> [#uses=1]
19*9880d681SAndroid Build Coastguard Worker  %mul = fmul double %t4, 2.200000e+00            ; <double> [#uses=1]
20*9880d681SAndroid Build Coastguard Worker  store double %mul, double* %arrayidx
21*9880d681SAndroid Build Coastguard Worker  %i.next = add nsw i64 %i, 1                     ; <i64> [#uses=2]
22*9880d681SAndroid Build Coastguard Worker  %cmp = icmp sgt i64 %i.next, %n                 ; <i1> [#uses=1]
23*9880d681SAndroid Build Coastguard Worker  br i1 %cmp, label %for.end, label %for.body
24*9880d681SAndroid Build Coastguard Worker
25*9880d681SAndroid Build Coastguard Workerfor.end:                                          ; preds = %for.body, %entry
26*9880d681SAndroid Build Coastguard Worker  ret void
27*9880d681SAndroid Build Coastguard Worker}
28