xref: /llvm-project/llvm/test/Transforms/IndVarSimplify/pr62992.ll (revision dc81e69eb126ea1dbab202733ae34b1a3d6eb0cf)
1; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --version 2
2; RUN: opt -S -passes=indvars < %s | FileCheck %s
3
4declare void @use(i1)
5
6; Make sure the division does not get expanded into the preheader.
7
8define i32 @test(i32 %arg) {
9; CHECK-LABEL: define i32 @test
10; CHECK-SAME: (i32 [[ARG:%.*]]) {
11; CHECK-NEXT:  entry:
12; CHECK-NEXT:    br label [[LOOP:%.*]]
13; CHECK:       loop:
14; CHECK-NEXT:    br i1 false, label [[IF:%.*]], label [[LOOP_LATCH:%.*]]
15; CHECK:       if:
16; CHECK-NEXT:    [[DIV:%.*]] = udiv i32 7, [[ARG]]
17; CHECK-NEXT:    [[CMP2:%.*]] = icmp ult i32 1, [[DIV]]
18; CHECK-NEXT:    call void @use(i1 [[CMP2]])
19; CHECK-NEXT:    br label [[LOOP_LATCH]]
20; CHECK:       loop.latch:
21; CHECK-NEXT:    br i1 false, label [[LOOP]], label [[EXIT:%.*]]
22; CHECK:       exit:
23; CHECK-NEXT:    ret i32 1
24;
25entry:
26  br label %loop
27
28loop:
29  %iv = phi i32 [ 0, %entry ], [ %iv.next, %loop.latch ]
30  %iv.next = add i32 %iv, 1
31  %cmp = icmp eq i32 %iv, 1
32  br i1 %cmp, label %if, label %loop.latch
33
34if:
35  %div = udiv i32 7, %arg
36  %cmp2 = icmp ult i32 %iv.next, %div
37  call void @use(i1 %cmp2)
38  br label %loop.latch
39
40loop.latch:
41  br i1 false, label %loop, label %exit
42
43exit:
44  %inc.lcssa = phi i32 [ %iv.next, %loop.latch ]
45  ret i32 %inc.lcssa
46}
47