xref: /llvm-project/llvm/test/Transforms/IndVarSimplify/implied-via-addition.ll (revision cf2e828925dc8c9656e800387820b49be03109d6)
1; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --version 5
2; RUN: opt -passes=indvars -S < %s | FileCheck %s
3
4declare void @use(i1)
5
6declare void @llvm.experimental.guard(i1, ...)
7
8define void @test_01(i8 %t) {
9; CHECK-LABEL: define void @test_01(
10; CHECK-SAME: i8 [[T:%.*]]) {
11; CHECK-NEXT:  [[ENTRY:.*]]:
12; CHECK-NEXT:    [[ST:%.*]] = sext i8 [[T]] to i16
13; CHECK-NEXT:    [[CMP1:%.*]] = icmp slt i16 [[ST]], 42
14; CHECK-NEXT:    call void (i1, ...) @llvm.experimental.guard(i1 [[CMP1]]) [ "deopt"() ]
15; CHECK-NEXT:    br label %[[LOOP:.*]]
16; CHECK:       [[LOOP]]:
17; CHECK-NEXT:    [[IDX:%.*]] = phi i8 [ [[T]], %[[ENTRY]] ], [ [[IDX_INC:%.*]], %[[LOOP]] ]
18; CHECK-NEXT:    [[IDX_INC]] = add nsw i8 [[IDX]], 1
19; CHECK-NEXT:    call void @use(i1 true)
20; CHECK-NEXT:    [[BE:%.*]] = icmp slt i8 [[IDX_INC]], 42
21; CHECK-NEXT:    br i1 [[BE]], label %[[LOOP]], label %[[EXIT:.*]]
22; CHECK:       [[EXIT]]:
23; CHECK-NEXT:    ret void
24;
25  entry:
26  %st = sext i8 %t to i16
27  %cmp1 = icmp slt i16 %st, 42
28  call void(i1, ...) @llvm.experimental.guard(i1 %cmp1) [ "deopt"() ]
29  br label %loop
30
31  loop:
32  %idx = phi i8 [ %t, %entry ], [ %idx.inc, %loop ]
33  %idx.inc = add i8 %idx, 1
34  %c = icmp slt i8 %idx, 42
35  call void @use(i1 %c)
36  %be = icmp slt i8 %idx.inc, 42
37  br i1 %be, label %loop, label %exit
38
39  exit:
40  ret void
41}
42
43define void @test_02(i8 %t) {
44; CHECK-LABEL: define void @test_02(
45; CHECK-SAME: i8 [[T:%.*]]) {
46; CHECK-NEXT:  [[ENTRY:.*]]:
47; CHECK-NEXT:    [[T_PTR:%.*]] = inttoptr i8 [[T]] to ptr
48; CHECK-NEXT:    [[P_42:%.*]] = inttoptr i8 42 to ptr
49; CHECK-NEXT:    [[CMP1:%.*]] = icmp slt ptr [[T_PTR]], [[P_42]]
50; CHECK-NEXT:    call void (i1, ...) @llvm.experimental.guard(i1 [[CMP1]]) [ "deopt"() ]
51; CHECK-NEXT:    br label %[[LOOP:.*]]
52; CHECK:       [[LOOP]]:
53; CHECK-NEXT:    [[IDX:%.*]] = phi ptr [ [[T_PTR]], %[[ENTRY]] ], [ [[SNEXT:%.*]], %[[LOOP]] ]
54; CHECK-NEXT:    [[SNEXT]] = getelementptr inbounds i8, ptr [[IDX]], i64 1
55; CHECK-NEXT:    call void @use(i1 true)
56; CHECK-NEXT:    [[BE:%.*]] = icmp ult ptr [[SNEXT]], [[P_42]]
57; CHECK-NEXT:    br i1 [[BE]], label %[[LOOP]], label %[[EXIT:.*]]
58; CHECK:       [[EXIT]]:
59; CHECK-NEXT:    ret void
60;
61  entry:
62  %t.ptr = inttoptr i8 %t to ptr
63  %p.42 = inttoptr i8 42 to ptr
64  %cmp1 = icmp slt ptr %t.ptr, %p.42
65  call void(i1, ...) @llvm.experimental.guard(i1 %cmp1) [ "deopt"() ]
66  br label %loop
67
68  loop:
69  %idx = phi ptr [ %t.ptr, %entry ], [ %snext, %loop ]
70  %snext = getelementptr inbounds i8, ptr %idx, i64 1
71  %c = icmp slt ptr %idx, %p.42
72  call void @use(i1 %c)
73  %be = icmp slt ptr %snext, %p.42
74  br i1 %be, label %loop, label %exit
75
76  exit:
77  ret void
78}
79