xref: /llvm-project/llvm/test/Analysis/ValueTracking/phi-known-bits.ll (revision c2fba023475fddb893eac29dc9f34dfbdb221cd5)
135d916e1SNoah Goldstein; NOTE: Assertions have been autogenerated by utils/update_test_checks.py
235d916e1SNoah Goldstein; RUN: opt -passes=instcombine < %s -S | FileCheck %s
335d916e1SNoah Goldstein
435d916e1SNoah Goldsteindefine i8 @phi_ugt_high_bits(i8 %x) {
535d916e1SNoah Goldstein; CHECK-LABEL: @phi_ugt_high_bits(
635d916e1SNoah Goldstein; CHECK-NEXT:  entry:
735d916e1SNoah Goldstein; CHECK-NEXT:    [[CMP:%.*]] = icmp ugt i8 [[X:%.*]], -65
835d916e1SNoah Goldstein; CHECK-NEXT:    br i1 [[CMP]], label [[T:%.*]], label [[F:%.*]]
935d916e1SNoah Goldstein; CHECK:       T:
1061df774aSNoah Goldstein; CHECK-NEXT:    ret i8 64
1135d916e1SNoah Goldstein; CHECK:       F:
1235d916e1SNoah Goldstein; CHECK-NEXT:    br label [[T]]
1335d916e1SNoah Goldstein;
1435d916e1SNoah Goldsteinentry:
1535d916e1SNoah Goldstein  %cmp = icmp ugt i8 %x, 191
1635d916e1SNoah Goldstein  br i1 %cmp, label %T, label %F
1735d916e1SNoah GoldsteinT:
1835d916e1SNoah Goldstein  %v = phi i8 [ %x, %entry], [-1, %F]
1935d916e1SNoah Goldstein  %r = and i8 %v, 64
2035d916e1SNoah Goldstein  ret i8 %r
2135d916e1SNoah GoldsteinF:
2235d916e1SNoah Goldstein  br label %T
2335d916e1SNoah Goldstein}
2435d916e1SNoah Goldstein
2535d916e1SNoah Goldsteindefine i8 @phi_ult_low_bits(i8 %x) {
2635d916e1SNoah Goldstein; CHECK-LABEL: @phi_ult_low_bits(
2735d916e1SNoah Goldstein; CHECK-NEXT:  entry:
2835d916e1SNoah Goldstein; CHECK-NEXT:    [[CMP:%.*]] = icmp ult i8 [[X:%.*]], -64
2935d916e1SNoah Goldstein; CHECK-NEXT:    br i1 [[CMP]], label [[T:%.*]], label [[F:%.*]]
3035d916e1SNoah Goldstein; CHECK:       T:
3135d916e1SNoah Goldstein; CHECK-NEXT:    br label [[F]]
3235d916e1SNoah Goldstein; CHECK:       F:
3361df774aSNoah Goldstein; CHECK-NEXT:    ret i8 64
3435d916e1SNoah Goldstein;
3535d916e1SNoah Goldsteinentry:
3635d916e1SNoah Goldstein  %cmp = icmp ult i8 %x, 192
3735d916e1SNoah Goldstein  br i1 %cmp, label %T, label %F
3835d916e1SNoah GoldsteinT:
3935d916e1SNoah Goldstein  br label %F
4035d916e1SNoah GoldsteinF:
4135d916e1SNoah Goldstein  %v = phi i8 [ %x, %entry], [-1, %T]
4235d916e1SNoah Goldstein  %r = and i8 %v, 64
4335d916e1SNoah Goldstein  ret i8 %r
4435d916e1SNoah Goldstein}
4535d916e1SNoah Goldstein
4635d916e1SNoah Goldsteindefine i8 @phi_ugt_high_bits_fail(i8 %x) {
4735d916e1SNoah Goldstein; CHECK-LABEL: @phi_ugt_high_bits_fail(
4835d916e1SNoah Goldstein; CHECK-NEXT:  entry:
4935d916e1SNoah Goldstein; CHECK-NEXT:    [[CMP:%.*]] = icmp ugt i8 [[X:%.*]], -66
5035d916e1SNoah Goldstein; CHECK-NEXT:    br i1 [[CMP]], label [[T:%.*]], label [[F:%.*]]
5135d916e1SNoah Goldstein; CHECK:       T:
5235d916e1SNoah Goldstein; CHECK-NEXT:    [[V:%.*]] = phi i8 [ [[X]], [[ENTRY:%.*]] ], [ -1, [[F]] ]
5335d916e1SNoah Goldstein; CHECK-NEXT:    [[R:%.*]] = and i8 [[V]], 64
5435d916e1SNoah Goldstein; CHECK-NEXT:    ret i8 [[R]]
5535d916e1SNoah Goldstein; CHECK:       F:
5635d916e1SNoah Goldstein; CHECK-NEXT:    br label [[T]]
5735d916e1SNoah Goldstein;
5835d916e1SNoah Goldsteinentry:
5935d916e1SNoah Goldstein  %cmp = icmp ugt i8 %x, 190
6035d916e1SNoah Goldstein  br i1 %cmp, label %T, label %F
6135d916e1SNoah GoldsteinT:
6235d916e1SNoah Goldstein  %v = phi i8 [ %x, %entry], [-1, %F]
6335d916e1SNoah Goldstein  %r = and i8 %v, 64
6435d916e1SNoah Goldstein  ret i8 %r
6535d916e1SNoah GoldsteinF:
6635d916e1SNoah Goldstein  br label %T
6735d916e1SNoah Goldstein}
6835d916e1SNoah Goldstein
6935d916e1SNoah Goldsteindefine i8 @phi_uge_high_bits(i8 %x) {
7035d916e1SNoah Goldstein; CHECK-LABEL: @phi_uge_high_bits(
7135d916e1SNoah Goldstein; CHECK-NEXT:  entry:
7235d916e1SNoah Goldstein; CHECK-NEXT:    [[CMP:%.*]] = icmp ugt i8 [[X:%.*]], -65
7335d916e1SNoah Goldstein; CHECK-NEXT:    br i1 [[CMP]], label [[T:%.*]], label [[F:%.*]]
7435d916e1SNoah Goldstein; CHECK:       T:
7561df774aSNoah Goldstein; CHECK-NEXT:    ret i8 64
7635d916e1SNoah Goldstein; CHECK:       F:
7735d916e1SNoah Goldstein; CHECK-NEXT:    br label [[T]]
7835d916e1SNoah Goldstein;
7935d916e1SNoah Goldsteinentry:
8035d916e1SNoah Goldstein  %cmp = icmp uge i8 %x, 192
8135d916e1SNoah Goldstein  br i1 %cmp, label %T, label %F
8235d916e1SNoah GoldsteinT:
8335d916e1SNoah Goldstein  %v = phi i8 [ %x, %entry], [-1, %F]
8435d916e1SNoah Goldstein  %r = and i8 %v, 64
8535d916e1SNoah Goldstein  ret i8 %r
8635d916e1SNoah GoldsteinF:
8735d916e1SNoah Goldstein  br label %T
8835d916e1SNoah Goldstein}
8935d916e1SNoah Goldstein
9035d916e1SNoah Goldsteindefine i8 @phi_uge_high_bits_fail(i8 %x) {
9135d916e1SNoah Goldstein; CHECK-LABEL: @phi_uge_high_bits_fail(
9235d916e1SNoah Goldstein; CHECK-NEXT:  entry:
9335d916e1SNoah Goldstein; CHECK-NEXT:    [[CMP:%.*]] = icmp ugt i8 [[X:%.*]], 5
9435d916e1SNoah Goldstein; CHECK-NEXT:    br i1 [[CMP]], label [[T:%.*]], label [[F:%.*]]
9535d916e1SNoah Goldstein; CHECK:       T:
9635d916e1SNoah Goldstein; CHECK-NEXT:    [[V:%.*]] = phi i8 [ [[X]], [[ENTRY:%.*]] ], [ -1, [[F]] ]
9735d916e1SNoah Goldstein; CHECK-NEXT:    [[R:%.*]] = and i8 [[V]], 1
9835d916e1SNoah Goldstein; CHECK-NEXT:    ret i8 [[R]]
9935d916e1SNoah Goldstein; CHECK:       F:
10035d916e1SNoah Goldstein; CHECK-NEXT:    br label [[T]]
10135d916e1SNoah Goldstein;
10235d916e1SNoah Goldsteinentry:
10335d916e1SNoah Goldstein  %cmp = icmp ugt i8 %x, 5
10435d916e1SNoah Goldstein  br i1 %cmp, label %T, label %F
10535d916e1SNoah GoldsteinT:
10635d916e1SNoah Goldstein  %v = phi i8 [ %x, %entry], [-1, %F]
10735d916e1SNoah Goldstein  %r = and i8 %v, 1
10835d916e1SNoah Goldstein  ret i8 %r
10935d916e1SNoah GoldsteinF:
11035d916e1SNoah Goldstein  br label %T
11135d916e1SNoah Goldstein}
11235d916e1SNoah Goldstein
11335d916e1SNoah Goldsteindefine i8 @phi_sge_high_bits(i8 %x) {
11435d916e1SNoah Goldstein; CHECK-LABEL: @phi_sge_high_bits(
11535d916e1SNoah Goldstein; CHECK-NEXT:  entry:
11635d916e1SNoah Goldstein; CHECK-NEXT:    [[CMP:%.*]] = icmp sgt i8 [[X:%.*]], 95
11735d916e1SNoah Goldstein; CHECK-NEXT:    br i1 [[CMP]], label [[T:%.*]], label [[F:%.*]]
11835d916e1SNoah Goldstein; CHECK:       T:
11961df774aSNoah Goldstein; CHECK-NEXT:    ret i8 96
12035d916e1SNoah Goldstein; CHECK:       F:
12135d916e1SNoah Goldstein; CHECK-NEXT:    br label [[T]]
12235d916e1SNoah Goldstein;
12335d916e1SNoah Goldsteinentry:
12435d916e1SNoah Goldstein  %cmp = icmp sge i8 %x, 96
12535d916e1SNoah Goldstein  br i1 %cmp, label %T, label %F
12635d916e1SNoah GoldsteinT:
12735d916e1SNoah Goldstein  %v = phi i8 [ %x, %entry], [-1, %F]
12835d916e1SNoah Goldstein  %r = and i8 %v, 96
12935d916e1SNoah Goldstein  ret i8 %r
13035d916e1SNoah GoldsteinF:
13135d916e1SNoah Goldstein  br label %T
13235d916e1SNoah Goldstein}
13335d916e1SNoah Goldstein
13435d916e1SNoah Goldsteindefine i8 @phi_sge_high_bits_fail(i8 %x) {
13535d916e1SNoah Goldstein; CHECK-LABEL: @phi_sge_high_bits_fail(
13635d916e1SNoah Goldstein; CHECK-NEXT:  entry:
13735d916e1SNoah Goldstein; CHECK-NEXT:    [[CMP:%.*]] = icmp sgt i8 [[X:%.*]], -2
13835d916e1SNoah Goldstein; CHECK-NEXT:    br i1 [[CMP]], label [[T:%.*]], label [[F:%.*]]
13935d916e1SNoah Goldstein; CHECK:       T:
14035d916e1SNoah Goldstein; CHECK-NEXT:    [[V:%.*]] = phi i8 [ [[X]], [[ENTRY:%.*]] ], [ -1, [[F]] ]
14135d916e1SNoah Goldstein; CHECK-NEXT:    [[R:%.*]] = and i8 [[V]], 1
14235d916e1SNoah Goldstein; CHECK-NEXT:    ret i8 [[R]]
14335d916e1SNoah Goldstein; CHECK:       F:
14435d916e1SNoah Goldstein; CHECK-NEXT:    br label [[T]]
14535d916e1SNoah Goldstein;
14635d916e1SNoah Goldsteinentry:
14735d916e1SNoah Goldstein  %cmp = icmp sge i8 %x, -1
14835d916e1SNoah Goldstein  br i1 %cmp, label %T, label %F
14935d916e1SNoah GoldsteinT:
15035d916e1SNoah Goldstein  %v = phi i8 [ %x, %entry], [-1, %F]
15135d916e1SNoah Goldstein  %r = and i8 %v, 1
15235d916e1SNoah Goldstein  ret i8 %r
15335d916e1SNoah GoldsteinF:
15435d916e1SNoah Goldstein  br label %T
15535d916e1SNoah Goldstein}
15635d916e1SNoah Goldstein
15735d916e1SNoah Goldsteindefine i8 @phi_sgt_high_bits(i8 %x) {
15835d916e1SNoah Goldstein; CHECK-LABEL: @phi_sgt_high_bits(
15935d916e1SNoah Goldstein; CHECK-NEXT:  entry:
16035d916e1SNoah Goldstein; CHECK-NEXT:    [[CMP:%.*]] = icmp sgt i8 [[X:%.*]], -1
16135d916e1SNoah Goldstein; CHECK-NEXT:    br i1 [[CMP]], label [[T:%.*]], label [[F:%.*]]
16235d916e1SNoah Goldstein; CHECK:       T:
16361df774aSNoah Goldstein; CHECK-NEXT:    ret i8 0
16435d916e1SNoah Goldstein; CHECK:       F:
16535d916e1SNoah Goldstein; CHECK-NEXT:    br label [[T]]
16635d916e1SNoah Goldstein;
16735d916e1SNoah Goldsteinentry:
16835d916e1SNoah Goldstein  %cmp = icmp sgt i8 %x, -1
16935d916e1SNoah Goldstein  br i1 %cmp, label %T, label %F
17035d916e1SNoah GoldsteinT:
17135d916e1SNoah Goldstein  %v = phi i8 [ %x, %entry], [0, %F]
17235d916e1SNoah Goldstein  %r = and i8 %v, 128
17335d916e1SNoah Goldstein  ret i8 %r
17435d916e1SNoah GoldsteinF:
17535d916e1SNoah Goldstein  br label %T
17635d916e1SNoah Goldstein}
17735d916e1SNoah Goldstein
17835d916e1SNoah Goldsteindefine i8 @phi_sgt_high_bits2(i8 %x) {
17935d916e1SNoah Goldstein; CHECK-LABEL: @phi_sgt_high_bits2(
18035d916e1SNoah Goldstein; CHECK-NEXT:  entry:
18135d916e1SNoah Goldstein; CHECK-NEXT:    [[CMP:%.*]] = icmp sgt i8 [[X:%.*]], 63
18235d916e1SNoah Goldstein; CHECK-NEXT:    br i1 [[CMP]], label [[T:%.*]], label [[F:%.*]]
18335d916e1SNoah Goldstein; CHECK:       T:
18461df774aSNoah Goldstein; CHECK-NEXT:    ret i8 64
18535d916e1SNoah Goldstein; CHECK:       F:
18635d916e1SNoah Goldstein; CHECK-NEXT:    br label [[T]]
18735d916e1SNoah Goldstein;
18835d916e1SNoah Goldsteinentry:
18935d916e1SNoah Goldstein  %cmp = icmp sgt i8 %x, 63
19035d916e1SNoah Goldstein  br i1 %cmp, label %T, label %F
19135d916e1SNoah GoldsteinT:
19235d916e1SNoah Goldstein  %v = phi i8 [ %x, %entry], [-1, %F]
19335d916e1SNoah Goldstein  %r = and i8 %v, 64
19435d916e1SNoah Goldstein  ret i8 %r
19535d916e1SNoah GoldsteinF:
19635d916e1SNoah Goldstein  br label %T
19735d916e1SNoah Goldstein}
19835d916e1SNoah Goldstein
19935d916e1SNoah Goldsteindefine i8 @phi_sgt_high_bits_fail(i8 %x) {
20035d916e1SNoah Goldstein; CHECK-LABEL: @phi_sgt_high_bits_fail(
20135d916e1SNoah Goldstein; CHECK-NEXT:  entry:
20235d916e1SNoah Goldstein; CHECK-NEXT:    [[CMP:%.*]] = icmp sgt i8 [[X:%.*]], 62
20335d916e1SNoah Goldstein; CHECK-NEXT:    br i1 [[CMP]], label [[T:%.*]], label [[F:%.*]]
20435d916e1SNoah Goldstein; CHECK:       T:
20535d916e1SNoah Goldstein; CHECK-NEXT:    [[V:%.*]] = phi i8 [ [[X]], [[ENTRY:%.*]] ], [ -1, [[F]] ]
20635d916e1SNoah Goldstein; CHECK-NEXT:    [[R:%.*]] = and i8 [[V]], 64
20735d916e1SNoah Goldstein; CHECK-NEXT:    ret i8 [[R]]
20835d916e1SNoah Goldstein; CHECK:       F:
20935d916e1SNoah Goldstein; CHECK-NEXT:    br label [[T]]
21035d916e1SNoah Goldstein;
21135d916e1SNoah Goldsteinentry:
21235d916e1SNoah Goldstein  %cmp = icmp sgt i8 %x, 62
21335d916e1SNoah Goldstein  br i1 %cmp, label %T, label %F
21435d916e1SNoah GoldsteinT:
21535d916e1SNoah Goldstein  %v = phi i8 [ %x, %entry], [-1, %F]
21635d916e1SNoah Goldstein  %r = and i8 %v, 64
21735d916e1SNoah Goldstein  ret i8 %r
21835d916e1SNoah GoldsteinF:
21935d916e1SNoah Goldstein  br label %T
22035d916e1SNoah Goldstein}
22135d916e1SNoah Goldstein
22235d916e1SNoah Goldsteindefine i8 @phi_slt_high_bits(i8 %x) {
22335d916e1SNoah Goldstein; CHECK-LABEL: @phi_slt_high_bits(
22435d916e1SNoah Goldstein; CHECK-NEXT:  entry:
22535d916e1SNoah Goldstein; CHECK-NEXT:    [[CMP:%.*]] = icmp slt i8 [[X:%.*]], 0
22635d916e1SNoah Goldstein; CHECK-NEXT:    br i1 [[CMP]], label [[T:%.*]], label [[F:%.*]]
22735d916e1SNoah Goldstein; CHECK:       T:
22861df774aSNoah Goldstein; CHECK-NEXT:    ret i8 -128
22935d916e1SNoah Goldstein; CHECK:       F:
23035d916e1SNoah Goldstein; CHECK-NEXT:    br label [[T]]
23135d916e1SNoah Goldstein;
23235d916e1SNoah Goldsteinentry:
23335d916e1SNoah Goldstein  %cmp = icmp slt i8 %x, 0
23435d916e1SNoah Goldstein  br i1 %cmp, label %T, label %F
23535d916e1SNoah GoldsteinT:
23635d916e1SNoah Goldstein  %v = phi i8 [ %x, %entry], [-1, %F]
23735d916e1SNoah Goldstein  %r = and i8 %v, 128
23835d916e1SNoah Goldstein  ret i8 %r
23935d916e1SNoah GoldsteinF:
24035d916e1SNoah Goldstein  br label %T
24135d916e1SNoah Goldstein}
24235d916e1SNoah Goldstein
24335d916e1SNoah Goldsteindefine i8 @phi_slt_high_bits2(i8 %x) {
24435d916e1SNoah Goldstein; CHECK-LABEL: @phi_slt_high_bits2(
24535d916e1SNoah Goldstein; CHECK-NEXT:  entry:
24635d916e1SNoah Goldstein; CHECK-NEXT:    [[CMP:%.*]] = icmp slt i8 [[X:%.*]], -64
24735d916e1SNoah Goldstein; CHECK-NEXT:    br i1 [[CMP]], label [[T:%.*]], label [[F:%.*]]
24835d916e1SNoah Goldstein; CHECK:       T:
24961df774aSNoah Goldstein; CHECK-NEXT:    ret i8 0
25035d916e1SNoah Goldstein; CHECK:       F:
25135d916e1SNoah Goldstein; CHECK-NEXT:    br label [[T]]
25235d916e1SNoah Goldstein;
25335d916e1SNoah Goldsteinentry:
25435d916e1SNoah Goldstein  %cmp = icmp slt i8 %x, -64
25535d916e1SNoah Goldstein  br i1 %cmp, label %T, label %F
25635d916e1SNoah GoldsteinT:
25735d916e1SNoah Goldstein  %v = phi i8 [ %x, %entry], [0, %F]
25835d916e1SNoah Goldstein  %r = and i8 %v, 64
25935d916e1SNoah Goldstein  ret i8 %r
26035d916e1SNoah GoldsteinF:
26135d916e1SNoah Goldstein  br label %T
26235d916e1SNoah Goldstein}
26335d916e1SNoah Goldstein
26435d916e1SNoah Goldsteindefine i8 @phi_slt_high_bits_fail(i8 %x) {
26535d916e1SNoah Goldstein; CHECK-LABEL: @phi_slt_high_bits_fail(
26635d916e1SNoah Goldstein; CHECK-NEXT:  entry:
26735d916e1SNoah Goldstein; CHECK-NEXT:    [[CMP:%.*]] = icmp slt i8 [[X:%.*]], -63
26835d916e1SNoah Goldstein; CHECK-NEXT:    br i1 [[CMP]], label [[T:%.*]], label [[F:%.*]]
26935d916e1SNoah Goldstein; CHECK:       T:
27035d916e1SNoah Goldstein; CHECK-NEXT:    [[V:%.*]] = phi i8 [ [[X]], [[ENTRY:%.*]] ], [ 0, [[F]] ]
27135d916e1SNoah Goldstein; CHECK-NEXT:    [[R:%.*]] = and i8 [[V]], 64
27235d916e1SNoah Goldstein; CHECK-NEXT:    ret i8 [[R]]
27335d916e1SNoah Goldstein; CHECK:       F:
27435d916e1SNoah Goldstein; CHECK-NEXT:    br label [[T]]
27535d916e1SNoah Goldstein;
27635d916e1SNoah Goldsteinentry:
27735d916e1SNoah Goldstein  %cmp = icmp slt i8 %x, -63
27835d916e1SNoah Goldstein  br i1 %cmp, label %T, label %F
27935d916e1SNoah GoldsteinT:
28035d916e1SNoah Goldstein  %v = phi i8 [ %x, %entry], [0, %F]
28135d916e1SNoah Goldstein  %r = and i8 %v, 64
28235d916e1SNoah Goldstein  ret i8 %r
28335d916e1SNoah GoldsteinF:
28435d916e1SNoah Goldstein  br label %T
28535d916e1SNoah Goldstein}
28635d916e1SNoah Goldstein
28735d916e1SNoah Goldsteindefine i8 @phi_sle_high_bits(i8 %x) {
28835d916e1SNoah Goldstein; CHECK-LABEL: @phi_sle_high_bits(
28935d916e1SNoah Goldstein; CHECK-NEXT:  entry:
29035d916e1SNoah Goldstein; CHECK-NEXT:    [[CMP:%.*]] = icmp slt i8 [[X:%.*]], -64
29135d916e1SNoah Goldstein; CHECK-NEXT:    br i1 [[CMP]], label [[T:%.*]], label [[F:%.*]]
29235d916e1SNoah Goldstein; CHECK:       T:
29361df774aSNoah Goldstein; CHECK-NEXT:    ret i8 0
29435d916e1SNoah Goldstein; CHECK:       F:
29535d916e1SNoah Goldstein; CHECK-NEXT:    br label [[T]]
29635d916e1SNoah Goldstein;
29735d916e1SNoah Goldsteinentry:
29835d916e1SNoah Goldstein  %cmp = icmp sle i8 %x, -65
29935d916e1SNoah Goldstein  br i1 %cmp, label %T, label %F
30035d916e1SNoah GoldsteinT:
30135d916e1SNoah Goldstein  %v = phi i8 [ %x, %entry], [0, %F]
30235d916e1SNoah Goldstein  %r = and i8 %v, 64
30335d916e1SNoah Goldstein  ret i8 %r
30435d916e1SNoah GoldsteinF:
30535d916e1SNoah Goldstein  br label %T
30635d916e1SNoah Goldstein}
30735d916e1SNoah Goldstein
30835d916e1SNoah Goldsteindefine i8 @phi_sle_low_bits(i8 %x) {
30935d916e1SNoah Goldstein; CHECK-LABEL: @phi_sle_low_bits(
31035d916e1SNoah Goldstein; CHECK-NEXT:  entry:
31135d916e1SNoah Goldstein; CHECK-NEXT:    [[CMP:%.*]] = icmp slt i8 [[X:%.*]], 65
31235d916e1SNoah Goldstein; CHECK-NEXT:    br i1 [[CMP]], label [[T:%.*]], label [[F:%.*]]
31335d916e1SNoah Goldstein; CHECK:       T:
31435d916e1SNoah Goldstein; CHECK-NEXT:    br label [[F]]
31535d916e1SNoah Goldstein; CHECK:       F:
31661df774aSNoah Goldstein; CHECK-NEXT:    ret i8 64
31735d916e1SNoah Goldstein;
31835d916e1SNoah Goldsteinentry:
31935d916e1SNoah Goldstein  %cmp = icmp sle i8 %x, 64
32035d916e1SNoah Goldstein  br i1 %cmp, label %T, label %F
32135d916e1SNoah GoldsteinT:
32235d916e1SNoah Goldstein  br label %F
32335d916e1SNoah GoldsteinF:
32435d916e1SNoah Goldstein  %v = phi i8 [ %x, %entry], [-1, %T]
32535d916e1SNoah Goldstein  %r = and i8 %v, 64
32635d916e1SNoah Goldstein  ret i8 %r
32735d916e1SNoah Goldstein}
32835d916e1SNoah Goldstein
32935d916e1SNoah Goldsteindefine i8 @phi_sle_high_bits_fail(i8 %x) {
33035d916e1SNoah Goldstein; CHECK-LABEL: @phi_sle_high_bits_fail(
33135d916e1SNoah Goldstein; CHECK-NEXT:  entry:
33235d916e1SNoah Goldstein; CHECK-NEXT:    [[CMP:%.*]] = icmp slt i8 [[X:%.*]], 1
33335d916e1SNoah Goldstein; CHECK-NEXT:    br i1 [[CMP]], label [[T:%.*]], label [[F:%.*]]
33435d916e1SNoah Goldstein; CHECK:       T:
33535d916e1SNoah Goldstein; CHECK-NEXT:    [[V:%.*]] = phi i8 [ [[X]], [[ENTRY:%.*]] ], [ -1, [[F]] ]
33635d916e1SNoah Goldstein; CHECK-NEXT:    [[R:%.*]] = and i8 [[V]], -128
33735d916e1SNoah Goldstein; CHECK-NEXT:    ret i8 [[R]]
33835d916e1SNoah Goldstein; CHECK:       F:
33935d916e1SNoah Goldstein; CHECK-NEXT:    br label [[T]]
34035d916e1SNoah Goldstein;
34135d916e1SNoah Goldsteinentry:
34235d916e1SNoah Goldstein  %cmp = icmp sle i8 %x, 0
34335d916e1SNoah Goldstein  br i1 %cmp, label %T, label %F
34435d916e1SNoah GoldsteinT:
34535d916e1SNoah Goldstein  %v = phi i8 [ %x, %entry], [-1, %F]
34635d916e1SNoah Goldstein  %r = and i8 %v, 128
34735d916e1SNoah Goldstein  ret i8 %r
34835d916e1SNoah GoldsteinF:
34935d916e1SNoah Goldstein  br label %T
35035d916e1SNoah Goldstein}
35135d916e1SNoah Goldstein
35235d916e1SNoah Goldsteindefine i8 @phi_sle_high_bits_fail2(i8 %x) {
35335d916e1SNoah Goldstein; CHECK-LABEL: @phi_sle_high_bits_fail2(
35435d916e1SNoah Goldstein; CHECK-NEXT:  entry:
35535d916e1SNoah Goldstein; CHECK-NEXT:    [[CMP:%.*]] = icmp slt i8 [[X:%.*]], -63
35635d916e1SNoah Goldstein; CHECK-NEXT:    br i1 [[CMP]], label [[T:%.*]], label [[F:%.*]]
35735d916e1SNoah Goldstein; CHECK:       T:
35835d916e1SNoah Goldstein; CHECK-NEXT:    [[V:%.*]] = phi i8 [ [[X]], [[ENTRY:%.*]] ], [ -1, [[F]] ]
35935d916e1SNoah Goldstein; CHECK-NEXT:    [[R:%.*]] = and i8 [[V]], 64
36035d916e1SNoah Goldstein; CHECK-NEXT:    ret i8 [[R]]
36135d916e1SNoah Goldstein; CHECK:       F:
36235d916e1SNoah Goldstein; CHECK-NEXT:    br label [[T]]
36335d916e1SNoah Goldstein;
36435d916e1SNoah Goldsteinentry:
36535d916e1SNoah Goldstein  %cmp = icmp sle i8 %x, -64
36635d916e1SNoah Goldstein  br i1 %cmp, label %T, label %F
36735d916e1SNoah GoldsteinT:
36835d916e1SNoah Goldstein  %v = phi i8 [ %x, %entry], [-1, %F]
36935d916e1SNoah Goldstein  %r = and i8 %v, 64
37035d916e1SNoah Goldstein  ret i8 %r
37135d916e1SNoah GoldsteinF:
37235d916e1SNoah Goldstein  br label %T
37335d916e1SNoah Goldstein}
37435d916e1SNoah Goldstein
37535d916e1SNoah Goldsteindefine i8 @phi_ugt_high_bits_and_known(i8 %xx) {
37635d916e1SNoah Goldstein; CHECK-LABEL: @phi_ugt_high_bits_and_known(
37735d916e1SNoah Goldstein; CHECK-NEXT:  entry:
37805670b42SNikita Popov; CHECK-NEXT:    [[X:%.*]] = or i8 [[XX:%.*]], 1
37905670b42SNikita Popov; CHECK-NEXT:    [[CMP:%.*]] = icmp ugt i8 [[XX]], -65
38035d916e1SNoah Goldstein; CHECK-NEXT:    br i1 [[CMP]], label [[T:%.*]], label [[F:%.*]]
38135d916e1SNoah Goldstein; CHECK:       T:
38205670b42SNikita Popov; CHECK-NEXT:    [[V:%.*]] = phi i8 [ [[X]], [[ENTRY:%.*]] ], [ -1, [[F]] ]
38305670b42SNikita Popov; CHECK-NEXT:    [[R:%.*]] = and i8 [[V]], 65
38405670b42SNikita Popov; CHECK-NEXT:    ret i8 [[R]]
38535d916e1SNoah Goldstein; CHECK:       F:
38635d916e1SNoah Goldstein; CHECK-NEXT:    br label [[T]]
38735d916e1SNoah Goldstein;
38835d916e1SNoah Goldsteinentry:
38935d916e1SNoah Goldstein  %x = or i8 %xx, 1
39035d916e1SNoah Goldstein  %cmp = icmp ugt i8 %x, 191
39135d916e1SNoah Goldstein  br i1 %cmp, label %T, label %F
39235d916e1SNoah GoldsteinT:
39335d916e1SNoah Goldstein  %v = phi i8 [ %x, %entry], [-1, %F]
39435d916e1SNoah Goldstein  %r = and i8 %v, 65
39535d916e1SNoah Goldstein  ret i8 %r
39635d916e1SNoah GoldsteinF:
39735d916e1SNoah Goldstein  br label %T
39835d916e1SNoah Goldstein}
39935d916e1SNoah Goldstein
40035d916e1SNoah Goldsteindefine i8 @phi_ugt_high_bits_and_known_todo_high_depths(i8 %xx, i8 %y, i8 %z) {
40135d916e1SNoah Goldstein; CHECK-LABEL: @phi_ugt_high_bits_and_known_todo_high_depths(
40235d916e1SNoah Goldstein; CHECK-NEXT:  entry:
40335d916e1SNoah Goldstein; CHECK-NEXT:    [[YY:%.*]] = and i8 [[Y:%.*]], -2
404a1058776SNikita Popov; CHECK-NEXT:    [[XXX:%.*]] = and i8 [[XX:%.*]], [[YY]]
40535d916e1SNoah Goldstein; CHECK-NEXT:    [[ZZ:%.*]] = or i8 [[Z:%.*]], 1
40635d916e1SNoah Goldstein; CHECK-NEXT:    [[X:%.*]] = add i8 [[XXX]], [[ZZ]]
40735d916e1SNoah Goldstein; CHECK-NEXT:    [[CMP:%.*]] = icmp ugt i8 [[X]], -65
40835d916e1SNoah Goldstein; CHECK-NEXT:    br i1 [[CMP]], label [[T:%.*]], label [[F:%.*]]
40935d916e1SNoah Goldstein; CHECK:       T:
41035d916e1SNoah Goldstein; CHECK-NEXT:    [[V:%.*]] = phi i8 [ [[X]], [[ENTRY:%.*]] ], [ -1, [[F]] ]
41135d916e1SNoah Goldstein; CHECK-NEXT:    [[R:%.*]] = and i8 [[V]], 65
41235d916e1SNoah Goldstein; CHECK-NEXT:    ret i8 [[R]]
41335d916e1SNoah Goldstein; CHECK:       F:
41435d916e1SNoah Goldstein; CHECK-NEXT:    br label [[T]]
41535d916e1SNoah Goldstein;
41635d916e1SNoah Goldsteinentry:
41735d916e1SNoah Goldstein  %yy = and i8 %y, -2
41835d916e1SNoah Goldstein  %xxx = and i8 %xx, %yy
41935d916e1SNoah Goldstein  %zz = or i8 %z, 1
42035d916e1SNoah Goldstein  %x = add i8 %xxx, %zz
42135d916e1SNoah Goldstein  %cmp = icmp ugt i8 %x, 191
42235d916e1SNoah Goldstein  br i1 %cmp, label %T, label %F
42335d916e1SNoah GoldsteinT:
42435d916e1SNoah Goldstein  %v = phi i8 [ %x, %entry], [-1, %F]
42535d916e1SNoah Goldstein  %r = and i8 %v, 65
42635d916e1SNoah Goldstein  ret i8 %r
42735d916e1SNoah GoldsteinF:
42835d916e1SNoah Goldstein  br label %T
42935d916e1SNoah Goldstein}
4306df63203Sbipmis
4316df63203Sbipmis;Illustrate if 2 pointers are non-equal when one of them is a recursive GEP.
4326df63203Sbipmis;Cases which folds to a canonical icmp(ptr1, ptr2)
4336df63203Sbipmisdefine i1 @recursiveGEP_withPtrSub1(ptr %val1) {
4346df63203Sbipmis; CHECK-LABEL: @recursiveGEP_withPtrSub1(
4356df63203Sbipmis; CHECK-NEXT:  entry:
4366df63203Sbipmis; CHECK-NEXT:    br label [[WHILE_COND_I:%.*]]
4376df63203Sbipmis; CHECK:       while.cond.i:
4386df63203Sbipmis; CHECK-NEXT:    [[A_PN_I:%.*]] = phi ptr [ [[TEST_0_I:%.*]], [[WHILE_COND_I]] ], [ [[VAL1:%.*]], [[ENTRY:%.*]] ]
439f7685af4SNikita Popov; CHECK-NEXT:    [[TEST_0_I]] = getelementptr inbounds nuw i8, ptr [[A_PN_I]], i64 1
4406df63203Sbipmis; CHECK-NEXT:    [[TMP0:%.*]] = load i8, ptr [[TEST_0_I]], align 2
4416df63203Sbipmis; CHECK-NEXT:    [[CMP3_NOT_I:%.*]] = icmp eq i8 [[TMP0]], 0
4426df63203Sbipmis; CHECK-NEXT:    br i1 [[CMP3_NOT_I]], label [[WHILE_END_I:%.*]], label [[WHILE_COND_I]]
4436df63203Sbipmis; CHECK:       while.end.i:
4446df63203Sbipmis; CHECK-NEXT:    ret i1 false
4456df63203Sbipmis;
4466df63203Sbipmisentry:
4476df63203Sbipmis  br label %while.cond.i
4486df63203Sbipmis
4496df63203Sbipmiswhile.cond.i:
4506df63203Sbipmis  %a.pn.i = phi ptr [ %test.0.i, %while.cond.i ], [ %val1, %entry ]
4516df63203Sbipmis  %test.0.i = getelementptr inbounds i8, ptr %a.pn.i, i64 1
4526df63203Sbipmis  %0 = load i8, ptr %test.0.i, align 2
4536df63203Sbipmis  %cmp3.not.i = icmp eq i8 %0, 0
4546df63203Sbipmis  br i1 %cmp3.not.i, label %while.end.i, label %while.cond.i
4556df63203Sbipmis
4566df63203Sbipmiswhile.end.i:
4576df63203Sbipmis  %sub.ptr.lhs.cast.i = ptrtoint ptr %test.0.i to i64
4586df63203Sbipmis  %sub.ptr.rhs.cast.i = ptrtoint ptr %val1 to i64
4596df63203Sbipmis  %sub.ptr.sub.i = sub i64 %sub.ptr.lhs.cast.i, %sub.ptr.rhs.cast.i
4606df63203Sbipmis  %bool = icmp eq i64 %sub.ptr.sub.i, 0
4616df63203Sbipmis  ret i1 %bool
4626df63203Sbipmis}
4636df63203Sbipmis
4646df63203Sbipmisdefine i1 @recursiveGEP_withPtrSub1_PhiOperandsCommuted(ptr %val1) {
4656df63203Sbipmis; CHECK-LABEL: @recursiveGEP_withPtrSub1_PhiOperandsCommuted(
4666df63203Sbipmis; CHECK-NEXT:  entry:
4676df63203Sbipmis; CHECK-NEXT:    br label [[WHILE_COND_I:%.*]]
4686df63203Sbipmis; CHECK:       while.cond.i:
4696df63203Sbipmis; CHECK-NEXT:    [[A_PN_I:%.*]] = phi ptr [ [[VAL1:%.*]], [[ENTRY:%.*]] ], [ [[TEST_0_I:%.*]], [[WHILE_COND_I]] ]
470f7685af4SNikita Popov; CHECK-NEXT:    [[TEST_0_I]] = getelementptr inbounds nuw i8, ptr [[A_PN_I]], i64 1
4716df63203Sbipmis; CHECK-NEXT:    [[TMP0:%.*]] = load i8, ptr [[TEST_0_I]], align 2
4726df63203Sbipmis; CHECK-NEXT:    [[CMP3_NOT_I:%.*]] = icmp eq i8 [[TMP0]], 0
4736df63203Sbipmis; CHECK-NEXT:    br i1 [[CMP3_NOT_I]], label [[WHILE_END_I:%.*]], label [[WHILE_COND_I]]
4746df63203Sbipmis; CHECK:       while.end.i:
4756df63203Sbipmis; CHECK-NEXT:    ret i1 false
4766df63203Sbipmis;
4776df63203Sbipmisentry:
4786df63203Sbipmis  br label %while.cond.i
4796df63203Sbipmis
4806df63203Sbipmiswhile.cond.i:
4816df63203Sbipmis  %a.pn.i = phi ptr [ %val1, %entry ], [ %test.0.i, %while.cond.i ]
4826df63203Sbipmis  %test.0.i = getelementptr inbounds i8, ptr %a.pn.i, i64 1
4836df63203Sbipmis  %0 = load i8, ptr %test.0.i, align 2
4846df63203Sbipmis  %cmp3.not.i = icmp eq i8 %0, 0
4856df63203Sbipmis  br i1 %cmp3.not.i, label %while.end.i, label %while.cond.i
4866df63203Sbipmis
4876df63203Sbipmiswhile.end.i:
4886df63203Sbipmis  %sub.ptr.lhs.cast.i = ptrtoint ptr %test.0.i to i64
4896df63203Sbipmis  %sub.ptr.rhs.cast.i = ptrtoint ptr %val1 to i64
4906df63203Sbipmis  %sub.ptr.sub.i = sub i64 %sub.ptr.lhs.cast.i, %sub.ptr.rhs.cast.i
4916df63203Sbipmis  %bool = icmp eq i64 %sub.ptr.sub.i, 0
4926df63203Sbipmis  ret i1 %bool
4936df63203Sbipmis}
4946df63203Sbipmis
4956df63203Sbipmisdefine i1 @recursiveGEP_withPtrSub1_SubOperandsCommuted(ptr %val1) {
4966df63203Sbipmis; CHECK-LABEL: @recursiveGEP_withPtrSub1_SubOperandsCommuted(
4976df63203Sbipmis; CHECK-NEXT:  entry:
4986df63203Sbipmis; CHECK-NEXT:    br label [[WHILE_COND_I:%.*]]
4996df63203Sbipmis; CHECK:       while.cond.i:
5006df63203Sbipmis; CHECK-NEXT:    [[A_PN_I:%.*]] = phi ptr [ [[TEST_0_I:%.*]], [[WHILE_COND_I]] ], [ [[VAL1:%.*]], [[ENTRY:%.*]] ]
501f7685af4SNikita Popov; CHECK-NEXT:    [[TEST_0_I]] = getelementptr inbounds nuw i8, ptr [[A_PN_I]], i64 1
5026df63203Sbipmis; CHECK-NEXT:    [[TMP0:%.*]] = load i8, ptr [[TEST_0_I]], align 2
5036df63203Sbipmis; CHECK-NEXT:    [[CMP3_NOT_I:%.*]] = icmp eq i8 [[TMP0]], 0
5046df63203Sbipmis; CHECK-NEXT:    br i1 [[CMP3_NOT_I]], label [[WHILE_END_I:%.*]], label [[WHILE_COND_I]]
5056df63203Sbipmis; CHECK:       while.end.i:
5066df63203Sbipmis; CHECK-NEXT:    ret i1 false
5076df63203Sbipmis;
5086df63203Sbipmisentry:
5096df63203Sbipmis  br label %while.cond.i
5106df63203Sbipmis
5116df63203Sbipmiswhile.cond.i:
5126df63203Sbipmis  %a.pn.i = phi ptr [ %test.0.i, %while.cond.i ], [ %val1, %entry ]
5136df63203Sbipmis  %test.0.i = getelementptr inbounds i8, ptr %a.pn.i, i64 1
5146df63203Sbipmis  %0 = load i8, ptr %test.0.i, align 2
5156df63203Sbipmis  %cmp3.not.i = icmp eq i8 %0, 0
5166df63203Sbipmis  br i1 %cmp3.not.i, label %while.end.i, label %while.cond.i
5176df63203Sbipmis
5186df63203Sbipmiswhile.end.i:
5196df63203Sbipmis  %sub.ptr.lhs.cast.i = ptrtoint ptr %test.0.i to i64
5206df63203Sbipmis  %sub.ptr.rhs.cast.i = ptrtoint ptr %val1 to i64
5216df63203Sbipmis  %sub.ptr.sub.i = sub i64 %sub.ptr.rhs.cast.i, %sub.ptr.lhs.cast.i
5226df63203Sbipmis  %bool = icmp eq i64 %sub.ptr.sub.i, 0
5236df63203Sbipmis  ret i1 %bool
5246df63203Sbipmis}
5256df63203Sbipmis
5266df63203Sbipmisdefine i1 @recursiveGEP_withPtrSub2(ptr %val1) {
5276df63203Sbipmis; CHECK-LABEL: @recursiveGEP_withPtrSub2(
5286df63203Sbipmis; CHECK-NEXT:  entry:
5296df63203Sbipmis; CHECK-NEXT:    br label [[WHILE_COND_I:%.*]]
5306df63203Sbipmis; CHECK:       while.cond.i:
5316df63203Sbipmis; CHECK-NEXT:    [[A_PN_I:%.*]] = phi ptr [ [[TEST_0_I:%.*]], [[WHILE_COND_I]] ], [ [[VAL1:%.*]], [[ENTRY:%.*]] ]
5326df63203Sbipmis; CHECK-NEXT:    [[TEST_0_I]] = getelementptr inbounds i8, ptr [[A_PN_I]], i64 -1
5336df63203Sbipmis; CHECK-NEXT:    [[TMP0:%.*]] = load i8, ptr [[TEST_0_I]], align 2
5346df63203Sbipmis; CHECK-NEXT:    [[CMP3_NOT_I:%.*]] = icmp eq i8 [[TMP0]], 0
5356df63203Sbipmis; CHECK-NEXT:    br i1 [[CMP3_NOT_I]], label [[WHILE_END_I:%.*]], label [[WHILE_COND_I]]
5366df63203Sbipmis; CHECK:       while.end.i:
5376df63203Sbipmis; CHECK-NEXT:    ret i1 false
5386df63203Sbipmis;
5396df63203Sbipmisentry:
5406df63203Sbipmis  br label %while.cond.i
5416df63203Sbipmis
5426df63203Sbipmiswhile.cond.i:
5436df63203Sbipmis  %a.pn.i = phi ptr [ %test.0.i, %while.cond.i ], [ %val1, %entry ]
5446df63203Sbipmis  %test.0.i = getelementptr inbounds i8, ptr %a.pn.i, i64 -1
5456df63203Sbipmis  %0 = load i8, ptr %test.0.i, align 2
5466df63203Sbipmis  %cmp3.not.i = icmp eq i8 %0, 0
5476df63203Sbipmis  br i1 %cmp3.not.i, label %while.end.i, label %while.cond.i
5486df63203Sbipmis
5496df63203Sbipmiswhile.end.i:
5506df63203Sbipmis  %sub.ptr.lhs.cast.i = ptrtoint ptr %test.0.i to i64
5516df63203Sbipmis  %sub.ptr.rhs.cast.i = ptrtoint ptr %val1 to i64
5526df63203Sbipmis  %sub.ptr.sub.i = sub i64 %sub.ptr.lhs.cast.i, %sub.ptr.rhs.cast.i
5536df63203Sbipmis  %bool = icmp eq i64 %sub.ptr.sub.i, 0
5546df63203Sbipmis  ret i1 %bool
5556df63203Sbipmis}
5566df63203Sbipmis
5576df63203Sbipmisdefine i1 @recursiveGEP_withPtrSub3(ptr %val1) {
5586df63203Sbipmis; CHECK-LABEL: @recursiveGEP_withPtrSub3(
5596df63203Sbipmis; CHECK-NEXT:  entry:
560462cb3cdSNikita Popov; CHECK-NEXT:    [[TEST_VAL1:%.*]] = getelementptr inbounds nuw i8, ptr [[VAL1:%.*]], i64 7
5616df63203Sbipmis; CHECK-NEXT:    br label [[WHILE_COND_I:%.*]]
5626df63203Sbipmis; CHECK:       while.cond.i:
5636df63203Sbipmis; CHECK-NEXT:    [[A_PN_I:%.*]] = phi ptr [ [[TEST_0_I:%.*]], [[WHILE_COND_I]] ], [ [[TEST_VAL1]], [[ENTRY:%.*]] ]
564f7685af4SNikita Popov; CHECK-NEXT:    [[TEST_0_I]] = getelementptr inbounds nuw i8, ptr [[A_PN_I]], i64 1
5656df63203Sbipmis; CHECK-NEXT:    [[TMP0:%.*]] = load i8, ptr [[TEST_0_I]], align 2
5666df63203Sbipmis; CHECK-NEXT:    [[CMP3_NOT_I:%.*]] = icmp eq i8 [[TMP0]], 0
5676df63203Sbipmis; CHECK-NEXT:    br i1 [[CMP3_NOT_I]], label [[WHILE_END_I:%.*]], label [[WHILE_COND_I]]
5686df63203Sbipmis; CHECK:       while.end.i:
5696df63203Sbipmis; CHECK-NEXT:    ret i1 false
5706df63203Sbipmis;
5716df63203Sbipmisentry:
5726df63203Sbipmis  %test.val1 = getelementptr inbounds i8, ptr %val1, i64 7
5736df63203Sbipmis  br label %while.cond.i
5746df63203Sbipmis
5756df63203Sbipmiswhile.cond.i:
5766df63203Sbipmis  %a.pn.i = phi ptr [ %test.0.i, %while.cond.i ], [ %test.val1, %entry ]
5776df63203Sbipmis  %test.0.i = getelementptr inbounds i8, ptr %a.pn.i, i64 1
5786df63203Sbipmis  %0 = load i8, ptr %test.0.i, align 2
5796df63203Sbipmis  %cmp3.not.i = icmp eq i8 %0, 0
5806df63203Sbipmis  br i1 %cmp3.not.i, label %while.end.i, label %while.cond.i
5816df63203Sbipmis
5826df63203Sbipmiswhile.end.i:
5836df63203Sbipmis  %sub.ptr.lhs.cast.i = ptrtoint ptr %test.0.i to i64
5846df63203Sbipmis  %1 = getelementptr inbounds i8, ptr %val1, i64 5
5856df63203Sbipmis  %sub.ptr.rhs.cast.i = ptrtoint ptr %1 to i64
5866df63203Sbipmis  %sub.ptr.sub.i = sub i64 %sub.ptr.lhs.cast.i, %sub.ptr.rhs.cast.i
5876df63203Sbipmis  %bool = icmp eq i64 %sub.ptr.sub.i, 0
5886df63203Sbipmis  ret i1 %bool
5896df63203Sbipmis}
5906df63203Sbipmis
5916df63203Sbipmisdefine i1 @recursiveGEP_withPtrSub1_notKnownNonEqual1(ptr %val1, i64 %val2) {
5926df63203Sbipmis; CHECK-LABEL: @recursiveGEP_withPtrSub1_notKnownNonEqual1(
5936df63203Sbipmis; CHECK-NEXT:  entry:
5946df63203Sbipmis; CHECK-NEXT:    br label [[WHILE_COND_I:%.*]]
5956df63203Sbipmis; CHECK:       while.cond.i:
5966df63203Sbipmis; CHECK-NEXT:    [[A_PN_I:%.*]] = phi ptr [ [[TEST_0_I:%.*]], [[WHILE_COND_I]] ], [ [[VAL1:%.*]], [[ENTRY:%.*]] ]
597f7685af4SNikita Popov; CHECK-NEXT:    [[TEST_0_I]] = getelementptr inbounds nuw i8, ptr [[A_PN_I]], i64 1
5986df63203Sbipmis; CHECK-NEXT:    [[TMP0:%.*]] = load i8, ptr [[TEST_0_I]], align 2
5996df63203Sbipmis; CHECK-NEXT:    [[CMP3_NOT_I:%.*]] = icmp eq i8 [[TMP0]], 0
6006df63203Sbipmis; CHECK-NEXT:    br i1 [[CMP3_NOT_I]], label [[WHILE_END_I:%.*]], label [[WHILE_COND_I]]
6016df63203Sbipmis; CHECK:       while.end.i:
6026df63203Sbipmis; CHECK-NEXT:    [[TMP1:%.*]] = getelementptr inbounds i8, ptr [[VAL1]], i64 [[VAL2:%.*]]
6036df63203Sbipmis; CHECK-NEXT:    [[BOOL:%.*]] = icmp eq ptr [[TEST_0_I]], [[TMP1]]
6046df63203Sbipmis; CHECK-NEXT:    ret i1 [[BOOL]]
6056df63203Sbipmis;
6066df63203Sbipmisentry:
6076df63203Sbipmis  br label %while.cond.i
6086df63203Sbipmis
6096df63203Sbipmiswhile.cond.i:
6106df63203Sbipmis  %a.pn.i = phi ptr [ %test.0.i, %while.cond.i ], [ %val1, %entry ]
6116df63203Sbipmis  %test.0.i = getelementptr inbounds i8, ptr %a.pn.i, i64 1
6126df63203Sbipmis  %0 = load i8, ptr %test.0.i, align 2
6136df63203Sbipmis  %cmp3.not.i = icmp eq i8 %0, 0
6146df63203Sbipmis  br i1 %cmp3.not.i, label %while.end.i, label %while.cond.i
6156df63203Sbipmis
6166df63203Sbipmiswhile.end.i:
6176df63203Sbipmis  %sub.ptr.lhs.cast.i = ptrtoint ptr %test.0.i to i64
6186df63203Sbipmis  %1 = getelementptr inbounds i8, ptr %val1, i64 %val2
6196df63203Sbipmis  %sub.ptr.rhs.cast.i = ptrtoint ptr %1 to i64
6206df63203Sbipmis  %sub.ptr.sub.i = sub i64 %sub.ptr.lhs.cast.i, %sub.ptr.rhs.cast.i
6216df63203Sbipmis  %bool = icmp eq i64 %sub.ptr.sub.i, 0
6226df63203Sbipmis  ret i1 %bool
6236df63203Sbipmis}
6246df63203Sbipmis
6256df63203Sbipmisdefine i1 @recursiveGEP_withPtrSub1_notKnownNonEqual2(ptr %val1) {
6266df63203Sbipmis; CHECK-LABEL: @recursiveGEP_withPtrSub1_notKnownNonEqual2(
6276df63203Sbipmis; CHECK-NEXT:  entry:
6286df63203Sbipmis; CHECK-NEXT:    [[TEST_VAL1:%.*]] = getelementptr inbounds i8, ptr [[VAL1:%.*]], i64 -1
6296df63203Sbipmis; CHECK-NEXT:    br label [[WHILE_COND_I:%.*]]
6306df63203Sbipmis; CHECK:       while.cond.i:
6316df63203Sbipmis; CHECK-NEXT:    [[A_PN_I:%.*]] = phi ptr [ [[TEST_0_I:%.*]], [[WHILE_COND_I]] ], [ [[TEST_VAL1]], [[ENTRY:%.*]] ]
632f7685af4SNikita Popov; CHECK-NEXT:    [[TEST_0_I]] = getelementptr inbounds nuw i8, ptr [[A_PN_I]], i64 1
6336df63203Sbipmis; CHECK-NEXT:    [[TMP0:%.*]] = load i8, ptr [[TEST_0_I]], align 2
6346df63203Sbipmis; CHECK-NEXT:    [[CMP3_NOT_I:%.*]] = icmp eq i8 [[TMP0]], 0
6356df63203Sbipmis; CHECK-NEXT:    br i1 [[CMP3_NOT_I]], label [[WHILE_END_I:%.*]], label [[WHILE_COND_I]]
6366df63203Sbipmis; CHECK:       while.end.i:
6376df63203Sbipmis; CHECK-NEXT:    [[BOOL:%.*]] = icmp eq ptr [[TEST_0_I]], [[VAL1]]
6386df63203Sbipmis; CHECK-NEXT:    ret i1 [[BOOL]]
6396df63203Sbipmis;
6406df63203Sbipmisentry:
6416df63203Sbipmis  %test.val1 = getelementptr inbounds i8, ptr %val1, i64 -1
6426df63203Sbipmis  br label %while.cond.i
6436df63203Sbipmis
6446df63203Sbipmiswhile.cond.i:
6456df63203Sbipmis  %a.pn.i = phi ptr [ %test.0.i, %while.cond.i ], [ %test.val1, %entry ]
6466df63203Sbipmis  %test.0.i = getelementptr inbounds i8, ptr %a.pn.i, i64 1
6476df63203Sbipmis  %0 = load i8, ptr %test.0.i, align 2
6486df63203Sbipmis  %cmp3.not.i = icmp eq i8 %0, 0
6496df63203Sbipmis  br i1 %cmp3.not.i, label %while.end.i, label %while.cond.i
6506df63203Sbipmis
6516df63203Sbipmiswhile.end.i:
6526df63203Sbipmis  %sub.ptr.lhs.cast.i = ptrtoint ptr %test.0.i to i64
6536df63203Sbipmis  %sub.ptr.rhs.cast.i = ptrtoint ptr %val1 to i64
6546df63203Sbipmis  %sub.ptr.sub.i = sub i64 %sub.ptr.lhs.cast.i, %sub.ptr.rhs.cast.i
6556df63203Sbipmis  %bool = icmp eq i64 %sub.ptr.sub.i, 0
6566df63203Sbipmis  ret i1 %bool
6576df63203Sbipmis}
6586df63203Sbipmis
6596df63203Sbipmisdefine i1 @recursiveGEP_withPtrSub1_notKnownNonEqual3(ptr %val1) {
6606df63203Sbipmis; CHECK-LABEL: @recursiveGEP_withPtrSub1_notKnownNonEqual3(
6616df63203Sbipmis; CHECK-NEXT:  entry:
662462cb3cdSNikita Popov; CHECK-NEXT:    [[TEST_VAL1:%.*]] = getelementptr inbounds nuw i8, ptr [[VAL1:%.*]], i64 5
6636df63203Sbipmis; CHECK-NEXT:    br label [[WHILE_COND_I:%.*]]
6646df63203Sbipmis; CHECK:       while.cond.i:
6656df63203Sbipmis; CHECK-NEXT:    [[A_PN_I:%.*]] = phi ptr [ [[TEST_0_I:%.*]], [[WHILE_COND_I]] ], [ [[TEST_VAL1]], [[ENTRY:%.*]] ]
6666df63203Sbipmis; CHECK-NEXT:    [[TEST_0_I]] = getelementptr inbounds i8, ptr [[A_PN_I]], i64 -1
6676df63203Sbipmis; CHECK-NEXT:    [[TMP0:%.*]] = load i8, ptr [[TEST_0_I]], align 2
6686df63203Sbipmis; CHECK-NEXT:    [[CMP3_NOT_I:%.*]] = icmp eq i8 [[TMP0]], 0
6696df63203Sbipmis; CHECK-NEXT:    br i1 [[CMP3_NOT_I]], label [[WHILE_END_I:%.*]], label [[WHILE_COND_I]]
6706df63203Sbipmis; CHECK:       while.end.i:
6716df63203Sbipmis; CHECK-NEXT:    [[BOOL:%.*]] = icmp eq ptr [[TEST_0_I]], [[VAL1]]
6726df63203Sbipmis; CHECK-NEXT:    ret i1 [[BOOL]]
6736df63203Sbipmis;
6746df63203Sbipmisentry:
6756df63203Sbipmis  %test.val1 = getelementptr inbounds i8, ptr %val1, i64 5
6766df63203Sbipmis  br label %while.cond.i
6776df63203Sbipmis
6786df63203Sbipmiswhile.cond.i:
6796df63203Sbipmis  %a.pn.i = phi ptr [ %test.0.i, %while.cond.i ], [ %test.val1, %entry ]
6806df63203Sbipmis  %test.0.i = getelementptr inbounds i8, ptr %a.pn.i, i64 -1
6816df63203Sbipmis  %0 = load i8, ptr %test.0.i, align 2
6826df63203Sbipmis  %cmp3.not.i = icmp eq i8 %0, 0
6836df63203Sbipmis  br i1 %cmp3.not.i, label %while.end.i, label %while.cond.i
6846df63203Sbipmis
6856df63203Sbipmiswhile.end.i:
6866df63203Sbipmis  %sub.ptr.lhs.cast.i = ptrtoint ptr %test.0.i to i64
6876df63203Sbipmis  %sub.ptr.rhs.cast.i = ptrtoint ptr %val1 to i64
6886df63203Sbipmis  %sub.ptr.sub.i = sub i64 %sub.ptr.lhs.cast.i, %sub.ptr.rhs.cast.i
6896df63203Sbipmis  %bool = icmp eq i64 %sub.ptr.sub.i, 0
6906df63203Sbipmis  ret i1 %bool
6916df63203Sbipmis}
6926df63203Sbipmis
6936df63203Sbipmisdefine i1 @recursiveGEP_withPtrSub_maybeZero(ptr %val1) {
6946df63203Sbipmis; CHECK-LABEL: @recursiveGEP_withPtrSub_maybeZero(
6956df63203Sbipmis; CHECK-NEXT:  entry:
6966df63203Sbipmis; CHECK-NEXT:    br label [[WHILE_COND_I:%.*]]
6976df63203Sbipmis; CHECK:       while.cond.i:
6986df63203Sbipmis; CHECK-NEXT:    [[A_PN_I:%.*]] = phi ptr [ [[TEST_0_I:%.*]], [[WHILE_COND_I]] ], [ [[VAL1:%.*]], [[ENTRY:%.*]] ]
6996df63203Sbipmis; CHECK-NEXT:    [[TMP0:%.*]] = load i8, ptr [[A_PN_I]], align 2
700f7685af4SNikita Popov; CHECK-NEXT:    [[TEST_0_I]] = getelementptr inbounds nuw i8, ptr [[A_PN_I]], i64 1
7016df63203Sbipmis; CHECK-NEXT:    [[CMP3_NOT_I:%.*]] = icmp eq i8 [[TMP0]], 0
7026df63203Sbipmis; CHECK-NEXT:    br i1 [[CMP3_NOT_I]], label [[WHILE_END_I:%.*]], label [[WHILE_COND_I]]
7036df63203Sbipmis; CHECK:       while.end.i:
7046df63203Sbipmis; CHECK-NEXT:    [[BOOL:%.*]] = icmp eq ptr [[A_PN_I]], [[VAL1]]
7056df63203Sbipmis; CHECK-NEXT:    ret i1 [[BOOL]]
7066df63203Sbipmis;
7076df63203Sbipmisentry:
7086df63203Sbipmis  br label %while.cond.i
7096df63203Sbipmis
7106df63203Sbipmiswhile.cond.i:
7116df63203Sbipmis  %a.pn.i = phi ptr [ %test.0.i, %while.cond.i ], [ %val1, %entry ]
7126df63203Sbipmis  %0 = load i8, ptr %a.pn.i, align 2
7136df63203Sbipmis  %test.0.i = getelementptr inbounds i8, ptr %a.pn.i, i64 1
7146df63203Sbipmis  %cmp3.not.i = icmp eq i8 %0, 0
7156df63203Sbipmis  br i1 %cmp3.not.i, label %while.end.i, label %while.cond.i
7166df63203Sbipmis
7176df63203Sbipmiswhile.end.i:
7186df63203Sbipmis  %sub.ptr.lhs.cast.i = ptrtoint ptr %a.pn.i to i64
7196df63203Sbipmis  %sub.ptr.rhs.cast.i = ptrtoint ptr %val1 to i64
7206df63203Sbipmis  %sub.ptr.sub.i = sub i64 %sub.ptr.lhs.cast.i, %sub.ptr.rhs.cast.i
7216df63203Sbipmis  %bool = icmp eq i64 %sub.ptr.sub.i, 0
7226df63203Sbipmis  ret i1 %bool
7236df63203Sbipmis}
7246df63203Sbipmis
7256df63203Sbipmis;Non-inbounds test.
7266df63203Sbipmis;Test where Step is non-inbound.
7276df63203Sbipmisdefine i1 @recursiveGEP_withPtrSub_noninboundStep1(ptr %val1) {
7286df63203Sbipmis; CHECK-LABEL: @recursiveGEP_withPtrSub_noninboundStep1(
7296df63203Sbipmis; CHECK-NEXT:  entry:
7306df63203Sbipmis; CHECK-NEXT:    br label [[WHILE_COND_I:%.*]]
7316df63203Sbipmis; CHECK:       while.cond.i:
7326df63203Sbipmis; CHECK-NEXT:    [[A_PN_I:%.*]] = phi ptr [ [[TEST_0_I:%.*]], [[WHILE_COND_I]] ], [ [[VAL1:%.*]], [[ENTRY:%.*]] ]
7336df63203Sbipmis; CHECK-NEXT:    [[TEST_0_I]] = getelementptr i8, ptr [[A_PN_I]], i64 1
7346df63203Sbipmis; CHECK-NEXT:    [[TMP0:%.*]] = load i8, ptr [[TEST_0_I]], align 2
7356df63203Sbipmis; CHECK-NEXT:    [[CMP3_NOT_I:%.*]] = icmp eq i8 [[TMP0]], 0
7366df63203Sbipmis; CHECK-NEXT:    br i1 [[CMP3_NOT_I]], label [[WHILE_END_I:%.*]], label [[WHILE_COND_I]]
7376df63203Sbipmis; CHECK:       while.end.i:
7386df63203Sbipmis; CHECK-NEXT:    [[BOOL:%.*]] = icmp eq ptr [[TEST_0_I]], [[VAL1]]
7396df63203Sbipmis; CHECK-NEXT:    ret i1 [[BOOL]]
7406df63203Sbipmis;
7416df63203Sbipmisentry:
7426df63203Sbipmis  br label %while.cond.i
7436df63203Sbipmis
7446df63203Sbipmiswhile.cond.i:
7456df63203Sbipmis  %a.pn.i = phi ptr [ %test.0.i, %while.cond.i ], [ %val1, %entry ]
7466df63203Sbipmis  %test.0.i = getelementptr i8, ptr %a.pn.i, i64 1
7476df63203Sbipmis  %0 = load i8, ptr %test.0.i, align 2
7486df63203Sbipmis  %cmp3.not.i = icmp eq i8 %0, 0
7496df63203Sbipmis  br i1 %cmp3.not.i, label %while.end.i, label %while.cond.i
7506df63203Sbipmis
7516df63203Sbipmiswhile.end.i:
7526df63203Sbipmis  %sub.ptr.lhs.cast.i = ptrtoint ptr %test.0.i to i64
7536df63203Sbipmis  %sub.ptr.rhs.cast.i = ptrtoint ptr %val1 to i64
7546df63203Sbipmis  %sub.ptr.sub.i = sub i64 %sub.ptr.lhs.cast.i, %sub.ptr.rhs.cast.i
7556df63203Sbipmis  %bool = icmp eq i64 %sub.ptr.sub.i, 0
7566df63203Sbipmis  ret i1 %bool
7576df63203Sbipmis}
7586df63203Sbipmis
7596df63203Sbipmisdefine i1 @recursiveGEP_withPtrSub_noninboundStep2(ptr %val1) {
7606df63203Sbipmis; CHECK-LABEL: @recursiveGEP_withPtrSub_noninboundStep2(
7616df63203Sbipmis; CHECK-NEXT:  entry:
7626df63203Sbipmis; CHECK-NEXT:    br label [[WHILE_COND_I:%.*]]
7636df63203Sbipmis; CHECK:       while.cond.i:
7646df63203Sbipmis; CHECK-NEXT:    [[A_PN_I:%.*]] = phi ptr [ [[TEST_0_I:%.*]], [[WHILE_COND_I]] ], [ [[VAL1:%.*]], [[ENTRY:%.*]] ]
7656df63203Sbipmis; CHECK-NEXT:    [[TEST_0_I]] = getelementptr i8, ptr [[A_PN_I]], i64 -1
7666df63203Sbipmis; CHECK-NEXT:    [[TMP0:%.*]] = load i8, ptr [[TEST_0_I]], align 2
7676df63203Sbipmis; CHECK-NEXT:    [[CMP3_NOT_I:%.*]] = icmp eq i8 [[TMP0]], 0
7686df63203Sbipmis; CHECK-NEXT:    br i1 [[CMP3_NOT_I]], label [[WHILE_END_I:%.*]], label [[WHILE_COND_I]]
7696df63203Sbipmis; CHECK:       while.end.i:
7706df63203Sbipmis; CHECK-NEXT:    [[BOOL:%.*]] = icmp eq ptr [[TEST_0_I]], [[VAL1]]
7716df63203Sbipmis; CHECK-NEXT:    ret i1 [[BOOL]]
7726df63203Sbipmis;
7736df63203Sbipmisentry:
7746df63203Sbipmis  br label %while.cond.i
7756df63203Sbipmis
7766df63203Sbipmiswhile.cond.i:
7776df63203Sbipmis  %a.pn.i = phi ptr [ %test.0.i, %while.cond.i ], [ %val1, %entry ]
7786df63203Sbipmis  %test.0.i = getelementptr i8, ptr %a.pn.i, i64 -1
7796df63203Sbipmis  %0 = load i8, ptr %test.0.i, align 2
7806df63203Sbipmis  %cmp3.not.i = icmp eq i8 %0, 0
7816df63203Sbipmis  br i1 %cmp3.not.i, label %while.end.i, label %while.cond.i
7826df63203Sbipmis
7836df63203Sbipmiswhile.end.i:
7846df63203Sbipmis  %sub.ptr.lhs.cast.i = ptrtoint ptr %test.0.i to i64
7856df63203Sbipmis  %sub.ptr.rhs.cast.i = ptrtoint ptr %val1 to i64
7866df63203Sbipmis  %sub.ptr.sub.i = sub i64 %sub.ptr.lhs.cast.i, %sub.ptr.rhs.cast.i
7876df63203Sbipmis  %bool = icmp eq i64 %sub.ptr.sub.i, 0
7886df63203Sbipmis  ret i1 %bool
7896df63203Sbipmis}
7906df63203Sbipmis
7916df63203Sbipmis;Test where Step and GEP B are non-inbound.
7926df63203Sbipmisdefine i1 @recursiveGEP_withPtrSub_noninboundStepAndB(ptr %val1) {
7936df63203Sbipmis; CHECK-LABEL: @recursiveGEP_withPtrSub_noninboundStepAndB(
7946df63203Sbipmis; CHECK-NEXT:  entry:
795462cb3cdSNikita Popov; CHECK-NEXT:    [[TEST:%.*]] = getelementptr inbounds nuw i8, ptr [[VAL1:%.*]], i64 2
7966df63203Sbipmis; CHECK-NEXT:    br label [[WHILE_COND_I:%.*]]
7976df63203Sbipmis; CHECK:       while.cond.i:
7986df63203Sbipmis; CHECK-NEXT:    [[A_PN_I:%.*]] = phi ptr [ [[TEST_0_I:%.*]], [[WHILE_COND_I]] ], [ [[TEST]], [[ENTRY:%.*]] ]
7996df63203Sbipmis; CHECK-NEXT:    [[TEST_0_I]] = getelementptr i8, ptr [[A_PN_I]], i64 1
8006df63203Sbipmis; CHECK-NEXT:    [[TMP0:%.*]] = load i8, ptr [[TEST_0_I]], align 2
8016df63203Sbipmis; CHECK-NEXT:    [[CMP3_NOT_I:%.*]] = icmp eq i8 [[TMP0]], 0
8026df63203Sbipmis; CHECK-NEXT:    br i1 [[CMP3_NOT_I]], label [[WHILE_END_I:%.*]], label [[WHILE_COND_I]]
8036df63203Sbipmis; CHECK:       while.end.i:
8046df63203Sbipmis; CHECK-NEXT:    [[BOOL:%.*]] = icmp eq ptr [[A_PN_I]], [[VAL1]]
8056df63203Sbipmis; CHECK-NEXT:    ret i1 [[BOOL]]
8066df63203Sbipmis;
8076df63203Sbipmisentry:
8086df63203Sbipmis  %test = getelementptr inbounds i8, ptr %val1, i64 2
8096df63203Sbipmis  br label %while.cond.i
8106df63203Sbipmis
8116df63203Sbipmiswhile.cond.i:
8126df63203Sbipmis  %a.pn.i = phi ptr [ %test.0.i, %while.cond.i ], [ %test, %entry ]
8136df63203Sbipmis  %test.0.i = getelementptr i8, ptr %a.pn.i, i64 1
8146df63203Sbipmis  %0 = load i8, ptr %test.0.i, align 2
8156df63203Sbipmis  %cmp3.not.i = icmp eq i8 %0, 0
8166df63203Sbipmis  br i1 %cmp3.not.i, label %while.end.i, label %while.cond.i
8176df63203Sbipmis
8186df63203Sbipmiswhile.end.i:
8196df63203Sbipmis  %sub.ptr.lhs.cast.i = ptrtoint ptr %test.0.i to i64
8206df63203Sbipmis  %test.1.i = getelementptr i8, ptr %val1, i64 1
8216df63203Sbipmis  %sub.ptr.rhs.cast.i = ptrtoint ptr %test.1.i to i64
8226df63203Sbipmis  %sub.ptr.sub.i = sub i64 %sub.ptr.lhs.cast.i, %sub.ptr.rhs.cast.i
8236df63203Sbipmis  %bool = icmp eq i64 %sub.ptr.sub.i, 0
8246df63203Sbipmis  ret i1 %bool
8256df63203Sbipmis}
8266df63203Sbipmis
8276df63203Sbipmis;Test where Start and Step are non-inbound.
8286df63203Sbipmisdefine i1 @recursiveGEP_withPtrSub_noninboundStartAndStep(ptr %val1) {
8296df63203Sbipmis; CHECK-LABEL: @recursiveGEP_withPtrSub_noninboundStartAndStep(
8306df63203Sbipmis; CHECK-NEXT:  entry:
8316df63203Sbipmis; CHECK-NEXT:    [[TEST:%.*]] = getelementptr i8, ptr [[VAL1:%.*]], i64 1
8326df63203Sbipmis; CHECK-NEXT:    br label [[WHILE_COND_I:%.*]]
8336df63203Sbipmis; CHECK:       while.cond.i:
8346df63203Sbipmis; CHECK-NEXT:    [[A_PN_I:%.*]] = phi ptr [ [[TEST_0_I:%.*]], [[WHILE_COND_I]] ], [ [[TEST]], [[ENTRY:%.*]] ]
8356df63203Sbipmis; CHECK-NEXT:    [[TEST_0_I]] = getelementptr i8, ptr [[A_PN_I]], i64 1
8366df63203Sbipmis; CHECK-NEXT:    [[TMP0:%.*]] = load i8, ptr [[TEST_0_I]], align 2
8376df63203Sbipmis; CHECK-NEXT:    [[CMP3_NOT_I:%.*]] = icmp eq i8 [[TMP0]], 0
8386df63203Sbipmis; CHECK-NEXT:    br i1 [[CMP3_NOT_I]], label [[WHILE_END_I:%.*]], label [[WHILE_COND_I]]
8396df63203Sbipmis; CHECK:       while.end.i:
8406df63203Sbipmis; CHECK-NEXT:    [[BOOL:%.*]] = icmp eq ptr [[TEST_0_I]], [[VAL1]]
8416df63203Sbipmis; CHECK-NEXT:    ret i1 [[BOOL]]
8426df63203Sbipmis;
8436df63203Sbipmisentry:
8446df63203Sbipmis  %test = getelementptr i8, ptr %val1, i64 1
8456df63203Sbipmis  br label %while.cond.i
8466df63203Sbipmis
8476df63203Sbipmiswhile.cond.i:
8486df63203Sbipmis  %a.pn.i = phi ptr [ %test.0.i, %while.cond.i ], [ %test, %entry ]
8496df63203Sbipmis  %test.0.i = getelementptr i8, ptr %a.pn.i, i64 1
8506df63203Sbipmis  %0 = load i8, ptr %test.0.i, align 2
8516df63203Sbipmis  %cmp3.not.i = icmp eq i8 %0, 0
8526df63203Sbipmis  br i1 %cmp3.not.i, label %while.end.i, label %while.cond.i
8536df63203Sbipmis
8546df63203Sbipmiswhile.end.i:
8556df63203Sbipmis  %sub.ptr.lhs.cast.i = ptrtoint ptr %test.0.i to i64
8566df63203Sbipmis  %sub.ptr.rhs.cast.i = ptrtoint ptr %val1 to i64
8576df63203Sbipmis  %sub.ptr.sub.i = sub i64 %sub.ptr.lhs.cast.i, %sub.ptr.rhs.cast.i
8586df63203Sbipmis  %bool = icmp eq i64 %sub.ptr.sub.i, 0
8596df63203Sbipmis  ret i1 %bool
8606df63203Sbipmis}
8616df63203Sbipmis
8626df63203Sbipmis;Test where Start and GEP B are non-inbounds pointer with same definition.
8636df63203Sbipmisdefine i1 @recursiveGEP_withPtrSub_noninboundSameDefStartAndB(ptr %val1) {
8646df63203Sbipmis; CHECK-LABEL: @recursiveGEP_withPtrSub_noninboundSameDefStartAndB(
8656df63203Sbipmis; CHECK-NEXT:  entry:
8666df63203Sbipmis; CHECK-NEXT:    [[TEST:%.*]] = getelementptr i8, ptr [[VAL1:%.*]], i64 1
8676df63203Sbipmis; CHECK-NEXT:    br label [[WHILE_COND_I:%.*]]
8686df63203Sbipmis; CHECK:       while.cond.i:
8696df63203Sbipmis; CHECK-NEXT:    [[A_PN_I:%.*]] = phi ptr [ [[TEST_0_I:%.*]], [[WHILE_COND_I]] ], [ [[TEST]], [[ENTRY:%.*]] ]
870f7685af4SNikita Popov; CHECK-NEXT:    [[TEST_0_I]] = getelementptr inbounds nuw i8, ptr [[A_PN_I]], i64 1
8716df63203Sbipmis; CHECK-NEXT:    [[TMP0:%.*]] = load i8, ptr [[TEST_0_I]], align 2
8726df63203Sbipmis; CHECK-NEXT:    [[CMP3_NOT_I:%.*]] = icmp eq i8 [[TMP0]], 0
8736df63203Sbipmis; CHECK-NEXT:    br i1 [[CMP3_NOT_I]], label [[WHILE_END_I:%.*]], label [[WHILE_COND_I]]
8746df63203Sbipmis; CHECK:       while.end.i:
8756df63203Sbipmis; CHECK-NEXT:    [[BOOL:%.*]] = icmp eq ptr [[A_PN_I]], [[VAL1]]
8766df63203Sbipmis; CHECK-NEXT:    ret i1 [[BOOL]]
8776df63203Sbipmis;
8786df63203Sbipmisentry:
8796df63203Sbipmis  %test = getelementptr i8, ptr %val1, i64 1
8806df63203Sbipmis  br label %while.cond.i
8816df63203Sbipmis
8826df63203Sbipmiswhile.cond.i:
8836df63203Sbipmis  %a.pn.i = phi ptr [ %test.0.i, %while.cond.i ], [ %test, %entry ]
8846df63203Sbipmis  %test.0.i = getelementptr inbounds i8, ptr %a.pn.i, i64 1
8856df63203Sbipmis  %0 = load i8, ptr %test.0.i, align 2
8866df63203Sbipmis  %cmp3.not.i = icmp eq i8 %0, 0
8876df63203Sbipmis  br i1 %cmp3.not.i, label %while.end.i, label %while.cond.i
8886df63203Sbipmis
8896df63203Sbipmiswhile.end.i:
8906df63203Sbipmis  %sub.ptr.lhs.cast.i = ptrtoint ptr %test.0.i to i64
8916df63203Sbipmis  %test2 = getelementptr i8, ptr %val1, i64 1
8926df63203Sbipmis  %sub.ptr.rhs.cast.i = ptrtoint ptr %test2 to i64
8936df63203Sbipmis  %sub.ptr.sub.i = sub i64 %sub.ptr.lhs.cast.i, %sub.ptr.rhs.cast.i
8946df63203Sbipmis  %bool = icmp eq i64 %sub.ptr.sub.i, 0
8956df63203Sbipmis  ret i1 %bool
8966df63203Sbipmis}
8976df63203Sbipmis
8986df63203Sbipmis;Test where Start and GEP B are non-inbounds and exactly same pointers.
8996df63203Sbipmisdefine i1 @recursiveGEP_withPtrSub_noninboundSameStartAndB(ptr %val1) {
9006df63203Sbipmis; CHECK-LABEL: @recursiveGEP_withPtrSub_noninboundSameStartAndB(
9016df63203Sbipmis; CHECK-NEXT:  entry:
9026df63203Sbipmis; CHECK-NEXT:    [[TEST:%.*]] = getelementptr i8, ptr [[VAL1:%.*]], i64 1
9036df63203Sbipmis; CHECK-NEXT:    br label [[WHILE_COND_I:%.*]]
9046df63203Sbipmis; CHECK:       while.cond.i:
9056df63203Sbipmis; CHECK-NEXT:    [[A_PN_I:%.*]] = phi ptr [ [[TEST_0_I:%.*]], [[WHILE_COND_I]] ], [ [[TEST]], [[ENTRY:%.*]] ]
906f7685af4SNikita Popov; CHECK-NEXT:    [[TEST_0_I]] = getelementptr inbounds nuw i8, ptr [[A_PN_I]], i64 1
9076df63203Sbipmis; CHECK-NEXT:    [[TMP0:%.*]] = load i8, ptr [[TEST_0_I]], align 2
9086df63203Sbipmis; CHECK-NEXT:    [[CMP3_NOT_I:%.*]] = icmp eq i8 [[TMP0]], 0
9096df63203Sbipmis; CHECK-NEXT:    br i1 [[CMP3_NOT_I]], label [[WHILE_END_I:%.*]], label [[WHILE_COND_I]]
9106df63203Sbipmis; CHECK:       while.end.i:
9116df63203Sbipmis; CHECK-NEXT:    ret i1 false
9126df63203Sbipmis;
9136df63203Sbipmisentry:
9146df63203Sbipmis  %test = getelementptr i8, ptr %val1, i64 1
9156df63203Sbipmis  br label %while.cond.i
9166df63203Sbipmis
9176df63203Sbipmiswhile.cond.i:
9186df63203Sbipmis  %a.pn.i = phi ptr [ %test.0.i, %while.cond.i ], [ %test, %entry ]
9196df63203Sbipmis  %test.0.i = getelementptr inbounds i8, ptr %a.pn.i, i64 1
9206df63203Sbipmis  %0 = load i8, ptr %test.0.i, align 2
9216df63203Sbipmis  %cmp3.not.i = icmp eq i8 %0, 0
9226df63203Sbipmis  br i1 %cmp3.not.i, label %while.end.i, label %while.cond.i
9236df63203Sbipmis
9246df63203Sbipmiswhile.end.i:
9256df63203Sbipmis  %sub.ptr.lhs.cast.i = ptrtoint ptr %test.0.i to i64
9266df63203Sbipmis  %sub.ptr.rhs.cast.i = ptrtoint ptr %test to i64
9276df63203Sbipmis  %sub.ptr.sub.i = sub i64 %sub.ptr.lhs.cast.i, %sub.ptr.rhs.cast.i
9286df63203Sbipmis  %bool = icmp eq i64 %sub.ptr.sub.i, 0
9296df63203Sbipmis  ret i1 %bool
9306df63203Sbipmis}
9316df63203Sbipmis
9326df63203Sbipmisdefine i1 @recursiveGEP_withPtrSub_scalableGEP(ptr %val1) {
9336df63203Sbipmis; CHECK-LABEL: @recursiveGEP_withPtrSub_scalableGEP(
9346df63203Sbipmis; CHECK-NEXT:  entry:
9356df63203Sbipmis; CHECK-NEXT:    br label [[WHILE_COND_I:%.*]]
9366df63203Sbipmis; CHECK:       while.cond.i:
9376df63203Sbipmis; CHECK-NEXT:    [[A_PN_I:%.*]] = phi ptr [ [[TEST_0_I:%.*]], [[WHILE_COND_I]] ], [ [[VAL1:%.*]], [[ENTRY:%.*]] ]
93874aa1abfSNikita Popov; CHECK-NEXT:    [[TMP0:%.*]] = call i64 @llvm.vscale.i64()
93974aa1abfSNikita Popov; CHECK-NEXT:    [[TMP1:%.*]] = shl i64 [[TMP0]], 4
94074aa1abfSNikita Popov; CHECK-NEXT:    [[TEST_0_I]] = getelementptr i8, ptr [[A_PN_I]], i64 [[TMP1]]
94174aa1abfSNikita Popov; CHECK-NEXT:    [[TMP2:%.*]] = load i8, ptr [[TEST_0_I]], align 1
94274aa1abfSNikita Popov; CHECK-NEXT:    [[CMP3_NOT_I:%.*]] = icmp eq i8 [[TMP2]], 0
9436df63203Sbipmis; CHECK-NEXT:    br i1 [[CMP3_NOT_I]], label [[WHILE_END_I:%.*]], label [[WHILE_COND_I]]
9446df63203Sbipmis; CHECK:       while.end.i:
9456df63203Sbipmis; CHECK-NEXT:    [[BOOL:%.*]] = icmp eq ptr [[TEST_0_I]], [[VAL1]]
9466df63203Sbipmis; CHECK-NEXT:    ret i1 [[BOOL]]
9476df63203Sbipmis;
9486df63203Sbipmisentry:
9496df63203Sbipmis  br label %while.cond.i
9506df63203Sbipmis
9516df63203Sbipmiswhile.cond.i:
9526df63203Sbipmis  %a.pn.i = phi ptr [ %test.0.i, %while.cond.i ], [ %val1, %entry ]
9536df63203Sbipmis  %test.0.i = getelementptr <vscale x 16 x i8>, ptr %a.pn.i, i64 1
9546df63203Sbipmis  %0 =  load i8, ptr %test.0.i, align 1
9556df63203Sbipmis  %cmp3.not.i = icmp eq i8 %0, 0
9566df63203Sbipmis  br  i1 %cmp3.not.i, label %while.end.i, label %while.cond.i
9576df63203Sbipmis
9586df63203Sbipmiswhile.end.i:
9596df63203Sbipmis  %sub.ptr.lhs.cast.i = ptrtoint ptr %test.0.i to i64
9606df63203Sbipmis  %sub.ptr.rhs.cast.i = ptrtoint ptr %val1 to i64
9616df63203Sbipmis  %sub.ptr.sub.i = sub i64 %sub.ptr.lhs.cast.i, %sub.ptr.rhs.cast.i
9626df63203Sbipmis  %bool = icmp eq i64 %sub.ptr.sub.i, 0
9636df63203Sbipmis  ret i1 %bool
9646df63203Sbipmis}
9656df63203Sbipmis
9666df63203Sbipmisdefine i1 @recursiveGEP_withPtrSub_scalableGEP_inbounds(ptr %val1) {
9676df63203Sbipmis; CHECK-LABEL: @recursiveGEP_withPtrSub_scalableGEP_inbounds(
9686df63203Sbipmis; CHECK-NEXT:  entry:
9696df63203Sbipmis; CHECK-NEXT:    br label [[WHILE_COND_I:%.*]]
9706df63203Sbipmis; CHECK:       while.cond.i:
9716df63203Sbipmis; CHECK-NEXT:    [[A_PN_I:%.*]] = phi ptr [ [[TEST_0_I:%.*]], [[WHILE_COND_I]] ], [ [[VAL1:%.*]], [[ENTRY:%.*]] ]
97274aa1abfSNikita Popov; CHECK-NEXT:    [[TMP0:%.*]] = call i64 @llvm.vscale.i64()
97374aa1abfSNikita Popov; CHECK-NEXT:    [[TMP1:%.*]] = shl i64 [[TMP0]], 4
97474aa1abfSNikita Popov; CHECK-NEXT:    [[TEST_0_I]] = getelementptr inbounds i8, ptr [[A_PN_I]], i64 [[TMP1]]
97574aa1abfSNikita Popov; CHECK-NEXT:    [[TMP2:%.*]] = load i8, ptr [[TEST_0_I]], align 1
97674aa1abfSNikita Popov; CHECK-NEXT:    [[CMP3_NOT_I:%.*]] = icmp eq i8 [[TMP2]], 0
9776df63203Sbipmis; CHECK-NEXT:    br i1 [[CMP3_NOT_I]], label [[WHILE_END_I:%.*]], label [[WHILE_COND_I]]
9786df63203Sbipmis; CHECK:       while.end.i:
9796df63203Sbipmis; CHECK-NEXT:    [[BOOL:%.*]] = icmp eq ptr [[TEST_0_I]], [[VAL1]]
9806df63203Sbipmis; CHECK-NEXT:    ret i1 [[BOOL]]
9816df63203Sbipmis;
9826df63203Sbipmisentry:
9836df63203Sbipmis  br label %while.cond.i
9846df63203Sbipmis
9856df63203Sbipmiswhile.cond.i:
9866df63203Sbipmis  %a.pn.i = phi ptr [ %test.0.i, %while.cond.i ], [ %val1, %entry ]
9876df63203Sbipmis  %test.0.i = getelementptr inbounds <vscale x 16 x i8>, ptr %a.pn.i, i64 1
9886df63203Sbipmis  %0 =  load i8, ptr %test.0.i, align 1
9896df63203Sbipmis  %cmp3.not.i = icmp eq i8 %0, 0
9906df63203Sbipmis  br  i1 %cmp3.not.i, label %while.end.i, label %while.cond.i
9916df63203Sbipmis
9926df63203Sbipmiswhile.end.i:
9936df63203Sbipmis  %sub.ptr.lhs.cast.i = ptrtoint ptr %test.0.i to i64
9946df63203Sbipmis  %sub.ptr.rhs.cast.i = ptrtoint ptr %val1 to i64
9956df63203Sbipmis  %sub.ptr.sub.i = sub i64 %sub.ptr.lhs.cast.i, %sub.ptr.rhs.cast.i
9966df63203Sbipmis  %bool = icmp eq i64 %sub.ptr.sub.i, 0
9976df63203Sbipmis  ret i1 %bool
9986df63203Sbipmis}
99964987c64Sbipmis
100064987c64Sbipmis; Test cmp(or), where one of argument to OR is a SUB of ptr2int with a recursive GEP.
100164987c64Sbipmisdefine i1 @recursiveGEP_orcmp(ptr %val1, i64 %val2) {
100264987c64Sbipmis; CHECK-LABEL: @recursiveGEP_orcmp(
100364987c64Sbipmis; CHECK-NEXT:  entry:
100464987c64Sbipmis; CHECK-NEXT:    br label [[WHILE_COND_I:%.*]]
100564987c64Sbipmis; CHECK:       while.cond.i:
100664987c64Sbipmis; CHECK-NEXT:    [[A_PN_I:%.*]] = phi ptr [ [[TEST_0_I:%.*]], [[WHILE_COND_I]] ], [ [[VAL1:%.*]], [[ENTRY:%.*]] ]
1007f7685af4SNikita Popov; CHECK-NEXT:    [[TEST_0_I]] = getelementptr inbounds nuw i8, ptr [[A_PN_I]], i64 1
100864987c64Sbipmis; CHECK-NEXT:    [[TMP0:%.*]] = load i8, ptr [[TEST_0_I]], align 2
100964987c64Sbipmis; CHECK-NEXT:    [[CMP3_NOT_I:%.*]] = icmp eq i8 [[TMP0]], 0
101064987c64Sbipmis; CHECK-NEXT:    br i1 [[CMP3_NOT_I]], label [[WHILE_END_I:%.*]], label [[WHILE_COND_I]]
101164987c64Sbipmis; CHECK:       while.end.i:
101264987c64Sbipmis; CHECK-NEXT:    ret i1 false
101364987c64Sbipmis;
101464987c64Sbipmisentry:
101564987c64Sbipmis  br label %while.cond.i
101664987c64Sbipmis
101764987c64Sbipmiswhile.cond.i:
101864987c64Sbipmis  %a.pn.i = phi ptr [ %test.0.i, %while.cond.i ], [ %val1, %entry ]
101964987c64Sbipmis  %test.0.i = getelementptr inbounds i8, ptr %a.pn.i, i64 1
102064987c64Sbipmis  %0 = load i8, ptr %test.0.i, align 2
102164987c64Sbipmis  %cmp3.not.i = icmp eq i8 %0, 0
102264987c64Sbipmis  br i1 %cmp3.not.i, label %while.end.i, label %while.cond.i
102364987c64Sbipmis
102464987c64Sbipmiswhile.end.i:
102564987c64Sbipmis  %sub.ptr.lhs.cast.i = ptrtoint ptr %test.0.i to i64
102664987c64Sbipmis  %sub.ptr.rhs.cast.i = ptrtoint ptr %val1 to i64
102764987c64Sbipmis  %sub.ptr.sub.i = sub i64 %sub.ptr.lhs.cast.i, %sub.ptr.rhs.cast.i
102864987c64Sbipmis  %orval = or i64 %sub.ptr.sub.i, %val2
102964987c64Sbipmis  %bool = icmp eq i64 %orval, 0
103064987c64Sbipmis  ret i1 %bool
103164987c64Sbipmis}
103264987c64Sbipmis
103364987c64Sbipmisdefine i1 @recursiveGEP_orcmp_orOperandsCommuted(ptr %val1, i64 %val2) {
103464987c64Sbipmis; CHECK-LABEL: @recursiveGEP_orcmp_orOperandsCommuted(
103564987c64Sbipmis; CHECK-NEXT:  entry:
103664987c64Sbipmis; CHECK-NEXT:    br label [[WHILE_COND_I:%.*]]
103764987c64Sbipmis; CHECK:       while.cond.i:
103864987c64Sbipmis; CHECK-NEXT:    [[A_PN_I:%.*]] = phi ptr [ [[TEST_0_I:%.*]], [[WHILE_COND_I]] ], [ [[VAL1:%.*]], [[ENTRY:%.*]] ]
1039f7685af4SNikita Popov; CHECK-NEXT:    [[TEST_0_I]] = getelementptr inbounds nuw i8, ptr [[A_PN_I]], i64 1
104064987c64Sbipmis; CHECK-NEXT:    [[TMP0:%.*]] = load i8, ptr [[TEST_0_I]], align 2
104164987c64Sbipmis; CHECK-NEXT:    [[CMP3_NOT_I:%.*]] = icmp eq i8 [[TMP0]], 0
104264987c64Sbipmis; CHECK-NEXT:    br i1 [[CMP3_NOT_I]], label [[WHILE_END_I:%.*]], label [[WHILE_COND_I]]
104364987c64Sbipmis; CHECK:       while.end.i:
104464987c64Sbipmis; CHECK-NEXT:    ret i1 false
104564987c64Sbipmis;
104664987c64Sbipmisentry:
104764987c64Sbipmis  br label %while.cond.i
104864987c64Sbipmis
104964987c64Sbipmiswhile.cond.i:
105064987c64Sbipmis  %a.pn.i = phi ptr [ %test.0.i, %while.cond.i ], [ %val1, %entry ]
105164987c64Sbipmis  %test.0.i = getelementptr inbounds i8, ptr %a.pn.i, i64 1
105264987c64Sbipmis  %0 = load i8, ptr %test.0.i, align 2
105364987c64Sbipmis  %cmp3.not.i = icmp eq i8 %0, 0
105464987c64Sbipmis  br i1 %cmp3.not.i, label %while.end.i, label %while.cond.i
105564987c64Sbipmis
105664987c64Sbipmiswhile.end.i:
105764987c64Sbipmis  %sub.ptr.lhs.cast.i = ptrtoint ptr %test.0.i to i64
105864987c64Sbipmis  %sub.ptr.rhs.cast.i = ptrtoint ptr %val1 to i64
105964987c64Sbipmis  %sub.ptr.sub.i = sub i64 %sub.ptr.lhs.cast.i, %sub.ptr.rhs.cast.i
106064987c64Sbipmis  %orval = or i64 %val2, %sub.ptr.sub.i
106164987c64Sbipmis  %bool = icmp eq i64 %orval, 0
106264987c64Sbipmis  ret i1 %bool
106364987c64Sbipmis}
106464987c64Sbipmis
106564987c64Sbipmis; Test one of the argument to SUB is a ptr2int of a recursive GEP, with multiple use of SUB.
106664987c64Sbipmisdefine i1 @recursiveGEP_orcmpMultiUse(ptr %val1, i64 %val2, ptr %dv1, ptr %dv2) {
106764987c64Sbipmis; CHECK-LABEL: @recursiveGEP_orcmpMultiUse(
106864987c64Sbipmis; CHECK-NEXT:  entry:
106964987c64Sbipmis; CHECK-NEXT:    br label [[WHILE_COND_I:%.*]]
107064987c64Sbipmis; CHECK:       while.cond.i:
107164987c64Sbipmis; CHECK-NEXT:    [[A_PN_I:%.*]] = phi ptr [ [[TEST_0_I:%.*]], [[WHILE_COND_I]] ], [ [[VAL1:%.*]], [[ENTRY:%.*]] ]
1072f7685af4SNikita Popov; CHECK-NEXT:    [[TEST_0_I]] = getelementptr inbounds nuw i8, ptr [[A_PN_I]], i64 1
107364987c64Sbipmis; CHECK-NEXT:    [[TMP0:%.*]] = load i8, ptr [[TEST_0_I]], align 2
107464987c64Sbipmis; CHECK-NEXT:    [[CMP3_NOT_I:%.*]] = icmp eq i8 [[TMP0]], 0
107564987c64Sbipmis; CHECK-NEXT:    br i1 [[CMP3_NOT_I]], label [[WHILE_END_I:%.*]], label [[WHILE_COND_I]]
107664987c64Sbipmis; CHECK:       while.end.i:
107764987c64Sbipmis; CHECK-NEXT:    br i1 false, label [[IF_THEN:%.*]], label [[IF_END4:%.*]]
107864987c64Sbipmis; CHECK:       if.then:
107964987c64Sbipmis; CHECK-NEXT:    br label [[CLEANUP:%.*]]
108064987c64Sbipmis; CHECK:       if.end4:
108164987c64Sbipmis; CHECK-NEXT:    br label [[CLEANUP]]
108264987c64Sbipmis; CHECK:       cleanup:
108364987c64Sbipmis; CHECK-NEXT:    ret i1 true
108464987c64Sbipmis;
108564987c64Sbipmisentry:
108664987c64Sbipmis  br label %while.cond.i
108764987c64Sbipmis
108864987c64Sbipmiswhile.cond.i:
108964987c64Sbipmis  %a.pn.i = phi ptr [ %test.0.i, %while.cond.i ], [ %val1, %entry ]
109064987c64Sbipmis  %test.0.i = getelementptr inbounds i8, ptr %a.pn.i, i64 1
109164987c64Sbipmis  %0 = load i8, ptr %test.0.i, align 2
109264987c64Sbipmis  %cmp3.not.i = icmp eq i8 %0, 0
109364987c64Sbipmis  br i1 %cmp3.not.i, label %while.end.i, label %while.cond.i
109464987c64Sbipmis
109564987c64Sbipmiswhile.end.i:
109664987c64Sbipmis  %sub.ptr.lhs.cast.i = ptrtoint ptr %test.0.i to i64
109764987c64Sbipmis  %sub.ptr.rhs.cast.i = ptrtoint ptr %val1 to i64
109864987c64Sbipmis  %sub.ptr.sub.i = sub i64 %sub.ptr.lhs.cast.i, %sub.ptr.rhs.cast.i
109964987c64Sbipmis  %orval = or i64 %sub.ptr.sub.i, %val2
110064987c64Sbipmis  %or.cond = icmp eq i64 %orval, 0
110164987c64Sbipmis  br i1 %or.cond, label %if.then, label %if.end4
110264987c64Sbipmis
110364987c64Sbipmisif.then:
110464987c64Sbipmis  %cmp = icmp eq ptr %dv1, %dv2
110564987c64Sbipmis  br label %cleanup
110664987c64Sbipmis
110764987c64Sbipmisif.end4:
110864987c64Sbipmis  %tobool = icmp ne i64 %sub.ptr.sub.i, 0
110964987c64Sbipmis  br label %cleanup
111064987c64Sbipmis
111164987c64Sbipmiscleanup:
111264987c64Sbipmis  %retval.0 = phi i1 [ %cmp, %if.then ], [ %tobool, %if.end4 ]
111364987c64Sbipmis  ret i1 %retval.0
111464987c64Sbipmis}
1115*c2fba023Sgoldsteinn
1116*c2fba023Sgoldsteinn
1117*c2fba023Sgoldsteinndefine i32 @issue_124275_wrong_br_direction(i32 noundef %inp) {
1118*c2fba023Sgoldsteinn; CHECK-LABEL: @issue_124275_wrong_br_direction(
1119*c2fba023Sgoldsteinn; CHECK-NEXT:  entry:
1120*c2fba023Sgoldsteinn; CHECK-NEXT:    [[TMP0:%.*]] = xor i32 [[INP:%.*]], -2
1121*c2fba023Sgoldsteinn; CHECK-NEXT:    [[XOR_INP_NEG:%.*]] = add i32 [[TMP0]], 1
1122*c2fba023Sgoldsteinn; CHECK-NEXT:    [[CMP_NE_NOT:%.*]] = icmp eq i32 [[XOR_INP_NEG]], 0
1123*c2fba023Sgoldsteinn; CHECK-NEXT:    br i1 [[CMP_NE_NOT]], label [[B1:%.*]], label [[B0:%.*]]
1124*c2fba023Sgoldsteinn; CHECK:       B0:
1125*c2fba023Sgoldsteinn; CHECK-NEXT:    [[PHI_B0:%.*]] = phi i32 [ [[PHI_B1:%.*]], [[B1]] ], [ [[XOR_INP_NEG]], [[ENTRY:%.*]] ]
1126*c2fba023Sgoldsteinn; CHECK-NEXT:    br label [[B1]]
1127*c2fba023Sgoldsteinn; CHECK:       B1:
1128*c2fba023Sgoldsteinn; CHECK-NEXT:    [[PHI_B1]] = phi i32 [ [[PHI_B0]], [[B0]] ], [ 0, [[ENTRY]] ]
1129*c2fba023Sgoldsteinn; CHECK-NEXT:    [[CMP_NE_B1_NOT:%.*]] = icmp eq i32 [[PHI_B1]], 0
1130*c2fba023Sgoldsteinn; CHECK-NEXT:    br i1 [[CMP_NE_B1_NOT]], label [[B0]], label [[END:%.*]]
1131*c2fba023Sgoldsteinn; CHECK:       end:
1132*c2fba023Sgoldsteinn; CHECK-NEXT:    ret i32 0
1133*c2fba023Sgoldsteinn;
1134*c2fba023Sgoldsteinnentry:
1135*c2fba023Sgoldsteinn  %xor_inp = xor i32 %inp, 1
1136*c2fba023Sgoldsteinn  %sub = sub i32 0, %xor_inp
1137*c2fba023Sgoldsteinn  %cmp_ne = icmp ne i32 %sub, 0
1138*c2fba023Sgoldsteinn  br i1 %cmp_ne, label %B0, label %B1
1139*c2fba023Sgoldsteinn
1140*c2fba023SgoldsteinnB0:
1141*c2fba023Sgoldsteinn  %phi_B0 = phi i32 [ %phi_B1, %B1 ], [ %sub, %entry ]
1142*c2fba023Sgoldsteinn  br label %B1
1143*c2fba023Sgoldsteinn
1144*c2fba023SgoldsteinnB1:
1145*c2fba023Sgoldsteinn  %phi_B1 = phi i32 [ %phi_B0, %B0 ], [ 0, %entry ]
1146*c2fba023Sgoldsteinn  %cmp_ne_B1 = icmp ne i32 %phi_B1, 0
1147*c2fba023Sgoldsteinn  %cmp_eq_B1 = xor i1 %cmp_ne_B1, true
1148*c2fba023Sgoldsteinn  br i1 %cmp_eq_B1, label %B0, label %end
1149*c2fba023Sgoldsteinn
1150*c2fba023Sgoldsteinnend:
1151*c2fba023Sgoldsteinn  ret i32 0
1152*c2fba023Sgoldsteinn}
1153