1; NOTE: Assertions have been autogenerated by utils/update_test_checks.py 2; RUN: opt -instsimplify -S < %s | FileCheck %s 3 4define i1 @test1(i8 %p, i8* %pq, i8 %n, i8 %r) { 5; CHECK-LABEL: @test1( 6; CHECK-NEXT: entry: 7; CHECK-NEXT: br label [[LOOP:%.*]] 8; CHECK: loop: 9; CHECK-NEXT: [[A:%.*]] = phi i8 [ 1, [[ENTRY:%.*]] ], [ [[NEXT:%.*]], [[LOOP]] ] 10; CHECK-NEXT: [[NEXT]] = add nsw i8 [[A]], 1 11; CHECK-NEXT: [[CMP1:%.*]] = icmp eq i8 [[A]], [[N:%.*]] 12; CHECK-NEXT: br i1 [[CMP1]], label [[EXIT:%.*]], label [[LOOP]] 13; CHECK: exit: 14; CHECK-NEXT: ret i1 false 15; 16entry: 17 br label %loop 18loop: 19 %A = phi i8 [ 1, %entry ], [ %next, %loop ] 20 %next = add nsw i8 %A, 1 21 %cmp1 = icmp eq i8 %A, %n 22 br i1 %cmp1, label %exit, label %loop 23exit: 24 %add = or i8 %A, %r 25 %cmp = icmp eq i8 %add, 0 26 ret i1 %cmp 27} 28 29define i1 @test2(i8 %p, i8* %pq, i8 %n, i8 %r) { 30; CHECK-LABEL: @test2( 31; CHECK-NEXT: entry: 32; CHECK-NEXT: br label [[LOOP:%.*]] 33; CHECK: loop: 34; CHECK-NEXT: [[A:%.*]] = phi i8 [ 1, [[ENTRY:%.*]] ], [ [[NEXT:%.*]], [[LOOP]] ] 35; CHECK-NEXT: [[NEXT]] = add i8 [[A]], 1 36; CHECK-NEXT: [[CMP1:%.*]] = icmp eq i8 [[A]], [[N:%.*]] 37; CHECK-NEXT: br i1 [[CMP1]], label [[EXIT:%.*]], label [[LOOP]] 38; CHECK: exit: 39; CHECK-NEXT: [[ADD:%.*]] = or i8 [[A]], [[R:%.*]] 40; CHECK-NEXT: [[CMP:%.*]] = icmp eq i8 [[ADD]], 0 41; CHECK-NEXT: ret i1 [[CMP]] 42; 43entry: 44 br label %loop 45loop: 46 %A = phi i8 [ 1, %entry ], [ %next, %loop ] 47 %next = add i8 %A, 1 48 %cmp1 = icmp eq i8 %A, %n 49 br i1 %cmp1, label %exit, label %loop 50exit: 51 %add = or i8 %A, %r 52 %cmp = icmp eq i8 %add, 0 53 ret i1 %cmp 54} 55 56define i1 @test3(i8 %p, i8* %pq, i8 %n, i8 %r) { 57; CHECK-LABEL: @test3( 58; CHECK-NEXT: entry: 59; CHECK-NEXT: br label [[LOOP:%.*]] 60; CHECK: loop: 61; CHECK-NEXT: [[A:%.*]] = phi i8 [ 1, [[ENTRY:%.*]] ], [ [[NEXT:%.*]], [[LOOP]] ] 62; CHECK-NEXT: [[NEXT]] = add nuw i8 [[A]], 1 63; CHECK-NEXT: [[CMP1:%.*]] = icmp eq i8 [[A]], [[N:%.*]] 64; CHECK-NEXT: br i1 [[CMP1]], label [[EXIT:%.*]], label [[LOOP]] 65; CHECK: exit: 66; CHECK-NEXT: ret i1 false 67; 68entry: 69 br label %loop 70loop: 71 %A = phi i8 [ 1, %entry ], [ %next, %loop ] 72 %next = add nuw i8 %A, 1 73 %cmp1 = icmp eq i8 %A, %n 74 br i1 %cmp1, label %exit, label %loop 75exit: 76 %add = or i8 %A, %r 77 %cmp = icmp eq i8 %add, 0 78 ret i1 %cmp 79} 80