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