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