xref: /llvm-project/llvm/test/Transforms/InstCombine/known-phi-br.ll (revision f1106ef6c9d14d5b516ec352279aeee8f9d12818)
158ea2454SSimon Pilgrim; NOTE: Assertions have been autogenerated by utils/update_test_checks.py
258ea2454SSimon Pilgrim; RUN: opt -S -passes=instcombine < %s | FileCheck %s
358ea2454SSimon Pilgrim
458ea2454SSimon Pilgrim;
558ea2454SSimon Pilgrim; Tests to show cases where computeKnownBits should be able to determine
658ea2454SSimon Pilgrim; the known bits of a phi edge based off a conditional branch feeding the phi.
758ea2454SSimon Pilgrim;
858ea2454SSimon Pilgrim
908d153d8SSimon Pilgrim; %x either eq 7 or is set to 7
1058ea2454SSimon Pilgrimdefine i64 @limit_i64_eq_7(i64 %x) {
1158ea2454SSimon Pilgrim; CHECK-LABEL: @limit_i64_eq_7(
1258ea2454SSimon Pilgrim; CHECK-NEXT:  entry:
1358ea2454SSimon Pilgrim; CHECK-NEXT:    [[CMP:%.*]] = icmp eq i64 [[X:%.*]], 7
1458ea2454SSimon Pilgrim; CHECK-NEXT:    br i1 [[CMP]], label [[END:%.*]], label [[BODY:%.*]]
1558ea2454SSimon Pilgrim; CHECK:       body:
1658ea2454SSimon Pilgrim; CHECK-NEXT:    br label [[END]]
1758ea2454SSimon Pilgrim; CHECK:       end:
18*f1106ef6SNikita Popov; CHECK-NEXT:    [[RES:%.*]] = phi i64 [ [[X]], [[ENTRY:%.*]] ], [ 7, [[BODY]] ]
19*f1106ef6SNikita Popov; CHECK-NEXT:    ret i64 [[RES]]
2058ea2454SSimon Pilgrim;
2158ea2454SSimon Pilgrimentry:
2258ea2454SSimon Pilgrim  %cmp = icmp eq i64 %x, 7
2358ea2454SSimon Pilgrim  br i1 %cmp, label %end, label %body
2458ea2454SSimon Pilgrimbody:
2558ea2454SSimon Pilgrim  br label %end
2658ea2454SSimon Pilgrimend:
2758ea2454SSimon Pilgrim  %res = phi i64 [ %x, %entry ], [ 7, %body ]
2858ea2454SSimon Pilgrim  ret i64 %res
2958ea2454SSimon Pilgrim}
3058ea2454SSimon Pilgrim
3108d153d8SSimon Pilgrim; %x either eq 255 or is set to 255
3258ea2454SSimon Pilgrimdefine i64 @limit_i64_ne_255(i64 %x) {
3358ea2454SSimon Pilgrim; CHECK-LABEL: @limit_i64_ne_255(
3458ea2454SSimon Pilgrim; CHECK-NEXT:  entry:
3508d153d8SSimon Pilgrim; CHECK-NEXT:    [[CMP:%.*]] = icmp ne i64 [[X:%.*]], 255
3608d153d8SSimon Pilgrim; CHECK-NEXT:    call void @use(i1 [[CMP]])
3708d153d8SSimon Pilgrim; CHECK-NEXT:    br i1 [[CMP]], label [[BODY:%.*]], label [[END:%.*]]
3858ea2454SSimon Pilgrim; CHECK:       body:
3958ea2454SSimon Pilgrim; CHECK-NEXT:    br label [[END]]
4058ea2454SSimon Pilgrim; CHECK:       end:
41*f1106ef6SNikita Popov; CHECK-NEXT:    [[RES:%.*]] = phi i64 [ [[X]], [[ENTRY:%.*]] ], [ 255, [[BODY]] ]
42*f1106ef6SNikita Popov; CHECK-NEXT:    ret i64 [[RES]]
4358ea2454SSimon Pilgrim;
4458ea2454SSimon Pilgrimentry:
4558ea2454SSimon Pilgrim  %cmp = icmp ne i64 %x, 255
4608d153d8SSimon Pilgrim  call void @use(i1 %cmp)
4758ea2454SSimon Pilgrim  br i1 %cmp, label %body, label %end
4858ea2454SSimon Pilgrimbody:
4958ea2454SSimon Pilgrim  br label %end
5058ea2454SSimon Pilgrimend:
5158ea2454SSimon Pilgrim  %res = phi i64 [ %x, %entry ], [ 255, %body ]
5258ea2454SSimon Pilgrim  ret i64 %res
5358ea2454SSimon Pilgrim}
5408d153d8SSimon Pilgrimdeclare void @use(i1)
5558ea2454SSimon Pilgrim
5608d153d8SSimon Pilgrim; %x either ule 15 or is masked with 15
5758ea2454SSimon Pilgrimdefine i64 @limit_i64_ule_15(i64 %x) {
5858ea2454SSimon Pilgrim; CHECK-LABEL: @limit_i64_ule_15(
5958ea2454SSimon Pilgrim; CHECK-NEXT:  entry:
6058ea2454SSimon Pilgrim; CHECK-NEXT:    [[CMP:%.*]] = icmp ult i64 [[X:%.*]], 16
6158ea2454SSimon Pilgrim; CHECK-NEXT:    br i1 [[CMP]], label [[END:%.*]], label [[BODY:%.*]]
6258ea2454SSimon Pilgrim; CHECK:       body:
6358ea2454SSimon Pilgrim; CHECK-NEXT:    [[MASK:%.*]] = and i64 [[X]], 15
6458ea2454SSimon Pilgrim; CHECK-NEXT:    br label [[END]]
6558ea2454SSimon Pilgrim; CHECK:       end:
6658ea2454SSimon Pilgrim; CHECK-NEXT:    [[X_MASK:%.*]] = phi i64 [ [[X]], [[ENTRY:%.*]] ], [ [[MASK]], [[BODY]] ]
6708d153d8SSimon Pilgrim; CHECK-NEXT:    ret i64 [[X_MASK]]
6858ea2454SSimon Pilgrim;
6958ea2454SSimon Pilgrimentry:
7058ea2454SSimon Pilgrim  %cmp = icmp ule i64 %x, 15
7158ea2454SSimon Pilgrim  br i1 %cmp, label %end, label %body
7258ea2454SSimon Pilgrimbody:
7358ea2454SSimon Pilgrim  %mask = and i64 %x, 15
7458ea2454SSimon Pilgrim  br label %end
7558ea2454SSimon Pilgrimend:
7658ea2454SSimon Pilgrim  %x.mask = phi i64 [ %x, %entry ], [ %mask, %body ]
7758ea2454SSimon Pilgrim  %res = and i64 %x.mask, 15
7858ea2454SSimon Pilgrim  ret i64 %res
7958ea2454SSimon Pilgrim}
8058ea2454SSimon Pilgrim
8108d153d8SSimon Pilgrim; %x either uge 8 or is masked with 7
8294b62a1dSSimon Pilgrimdefine i64 @limit_i64_uge_8(i64 %x) {
8394b62a1dSSimon Pilgrim; CHECK-LABEL: @limit_i64_uge_8(
8458ea2454SSimon Pilgrim; CHECK-NEXT:  entry:
8594b62a1dSSimon Pilgrim; CHECK-NEXT:    [[CMP:%.*]] = icmp ugt i64 [[X:%.*]], 7
8658ea2454SSimon Pilgrim; CHECK-NEXT:    br i1 [[CMP]], label [[BODY:%.*]], label [[END:%.*]]
8758ea2454SSimon Pilgrim; CHECK:       body:
8858ea2454SSimon Pilgrim; CHECK-NEXT:    [[MASK:%.*]] = and i64 [[X]], 7
8958ea2454SSimon Pilgrim; CHECK-NEXT:    br label [[END]]
9058ea2454SSimon Pilgrim; CHECK:       end:
9158ea2454SSimon Pilgrim; CHECK-NEXT:    [[X_MASK:%.*]] = phi i64 [ [[X]], [[ENTRY:%.*]] ], [ [[MASK]], [[BODY]] ]
9208d153d8SSimon Pilgrim; CHECK-NEXT:    ret i64 [[X_MASK]]
9358ea2454SSimon Pilgrim;
9458ea2454SSimon Pilgrimentry:
9594b62a1dSSimon Pilgrim  %cmp = icmp uge i64 %x, 8
9658ea2454SSimon Pilgrim  br i1 %cmp, label %body, label %end
9758ea2454SSimon Pilgrimbody:
9858ea2454SSimon Pilgrim  %mask = and i64 %x, 7
9958ea2454SSimon Pilgrim  br label %end
10058ea2454SSimon Pilgrimend:
10158ea2454SSimon Pilgrim  %x.mask = phi i64 [ %x, %entry ], [ %mask, %body ]
10258ea2454SSimon Pilgrim  %res = and i64 %x.mask, 7
10358ea2454SSimon Pilgrim  ret i64 %res
10458ea2454SSimon Pilgrim}
10558ea2454SSimon Pilgrim
10608d153d8SSimon Pilgrim; %x either ult 8 or is masked with 7
10758ea2454SSimon Pilgrimdefine i64 @limit_i64_ult_8(i64 %x) {
10858ea2454SSimon Pilgrim; CHECK-LABEL: @limit_i64_ult_8(
10958ea2454SSimon Pilgrim; CHECK-NEXT:  entry:
11058ea2454SSimon Pilgrim; CHECK-NEXT:    [[CMP:%.*]] = icmp ult i64 [[X:%.*]], 8
11158ea2454SSimon Pilgrim; CHECK-NEXT:    br i1 [[CMP]], label [[END:%.*]], label [[BODY:%.*]]
11258ea2454SSimon Pilgrim; CHECK:       body:
11358ea2454SSimon Pilgrim; CHECK-NEXT:    [[MASK:%.*]] = and i64 [[X]], 7
11458ea2454SSimon Pilgrim; CHECK-NEXT:    br label [[END]]
11558ea2454SSimon Pilgrim; CHECK:       end:
11658ea2454SSimon Pilgrim; CHECK-NEXT:    [[X_MASK:%.*]] = phi i64 [ [[X]], [[ENTRY:%.*]] ], [ [[MASK]], [[BODY]] ]
11708d153d8SSimon Pilgrim; CHECK-NEXT:    ret i64 [[X_MASK]]
11858ea2454SSimon Pilgrim;
11958ea2454SSimon Pilgrimentry:
12058ea2454SSimon Pilgrim  %cmp = icmp ult i64 %x, 8
12158ea2454SSimon Pilgrim  br i1 %cmp, label %end, label %body
12258ea2454SSimon Pilgrimbody:
12358ea2454SSimon Pilgrim  %mask = and i64 %x, 7
12458ea2454SSimon Pilgrim  br label %end
12558ea2454SSimon Pilgrimend:
12658ea2454SSimon Pilgrim  %x.mask = phi i64 [ %x, %entry ], [ %mask, %body ]
12758ea2454SSimon Pilgrim  %res = and i64 %x.mask, 7
12858ea2454SSimon Pilgrim  ret i64 %res
12958ea2454SSimon Pilgrim}
13058ea2454SSimon Pilgrim
13108d153d8SSimon Pilgrim; %x either ugt 7 or is masked with 7
13294b62a1dSSimon Pilgrimdefine i64 @limit_i64_ugt_7(i64 %x) {
13394b62a1dSSimon Pilgrim; CHECK-LABEL: @limit_i64_ugt_7(
13458ea2454SSimon Pilgrim; CHECK-NEXT:  entry:
13594b62a1dSSimon Pilgrim; CHECK-NEXT:    [[CMP:%.*]] = icmp ugt i64 [[X:%.*]], 7
13658ea2454SSimon Pilgrim; CHECK-NEXT:    br i1 [[CMP]], label [[BODY:%.*]], label [[END:%.*]]
13758ea2454SSimon Pilgrim; CHECK:       body:
13858ea2454SSimon Pilgrim; CHECK-NEXT:    [[MASK:%.*]] = and i64 [[X]], 7
13958ea2454SSimon Pilgrim; CHECK-NEXT:    br label [[END]]
14058ea2454SSimon Pilgrim; CHECK:       end:
14158ea2454SSimon Pilgrim; CHECK-NEXT:    [[X_MASK:%.*]] = phi i64 [ [[X]], [[ENTRY:%.*]] ], [ [[MASK]], [[BODY]] ]
14208d153d8SSimon Pilgrim; CHECK-NEXT:    ret i64 [[X_MASK]]
14358ea2454SSimon Pilgrim;
14458ea2454SSimon Pilgrimentry:
14594b62a1dSSimon Pilgrim  %cmp = icmp ugt i64 %x, 7
14658ea2454SSimon Pilgrim  br i1 %cmp, label %body, label %end
14758ea2454SSimon Pilgrimbody:
14858ea2454SSimon Pilgrim  %mask = and i64 %x, 7
14958ea2454SSimon Pilgrim  br label %end
15058ea2454SSimon Pilgrimend:
15158ea2454SSimon Pilgrim  %x.mask = phi i64 [ %x, %entry ], [ %mask, %body ]
15258ea2454SSimon Pilgrim  %res = and i64 %x.mask, 7
15358ea2454SSimon Pilgrim  ret i64 %res
15458ea2454SSimon Pilgrim}
15558ea2454SSimon Pilgrim
156e471fdadSSimon Pilgrim;
157e471fdadSSimon Pilgrim; negative tests
158e471fdadSSimon Pilgrim;
15958ea2454SSimon Pilgrim
160e471fdadSSimon Pilgrim; %x either ule 15 or is masked with 15
161e471fdadSSimon Pilgrimdefine i64 @limit_i64_ule_15_mask3(i64 %x) {
162e471fdadSSimon Pilgrim; CHECK-LABEL: @limit_i64_ule_15_mask3(
163e471fdadSSimon Pilgrim; CHECK-NEXT:  entry:
164e471fdadSSimon Pilgrim; CHECK-NEXT:    [[CMP:%.*]] = icmp ult i64 [[X:%.*]], 16
165e471fdadSSimon Pilgrim; CHECK-NEXT:    br i1 [[CMP]], label [[END:%.*]], label [[BODY:%.*]]
166e471fdadSSimon Pilgrim; CHECK:       body:
167e471fdadSSimon Pilgrim; CHECK-NEXT:    [[MASK:%.*]] = and i64 [[X]], 15
168e471fdadSSimon Pilgrim; CHECK-NEXT:    br label [[END]]
169e471fdadSSimon Pilgrim; CHECK:       end:
170e471fdadSSimon Pilgrim; CHECK-NEXT:    [[X_MASK:%.*]] = phi i64 [ [[X]], [[ENTRY:%.*]] ], [ [[MASK]], [[BODY]] ]
171e471fdadSSimon Pilgrim; CHECK-NEXT:    [[RES:%.*]] = and i64 [[X_MASK]], 3
172e471fdadSSimon Pilgrim; CHECK-NEXT:    ret i64 [[RES]]
173e471fdadSSimon Pilgrim;
174e471fdadSSimon Pilgrimentry:
175e471fdadSSimon Pilgrim  %cmp = icmp ule i64 %x, 15
176e471fdadSSimon Pilgrim  br i1 %cmp, label %end, label %body
177e471fdadSSimon Pilgrimbody:
178e471fdadSSimon Pilgrim  %mask = and i64 %x, 15
179e471fdadSSimon Pilgrim  br label %end
180e471fdadSSimon Pilgrimend:
181e471fdadSSimon Pilgrim  %x.mask = phi i64 [ %x, %entry ], [ %mask, %body ]
182e471fdadSSimon Pilgrim  %res = and i64 %x.mask, 3
183e471fdadSSimon Pilgrim  ret i64 %res
184e471fdadSSimon Pilgrim}
185e471fdadSSimon Pilgrim
186e471fdadSSimon Pilgrim; %x either ult 8 or is masked with 7
187e471fdadSSimon Pilgrimdefine i64 @limit_i64_ult_8_mask1(i64 %x) {
188e471fdadSSimon Pilgrim; CHECK-LABEL: @limit_i64_ult_8_mask1(
189e471fdadSSimon Pilgrim; CHECK-NEXT:  entry:
190e471fdadSSimon Pilgrim; CHECK-NEXT:    [[CMP:%.*]] = icmp ult i64 [[X:%.*]], 8
191e471fdadSSimon Pilgrim; CHECK-NEXT:    br i1 [[CMP]], label [[END:%.*]], label [[BODY:%.*]]
192e471fdadSSimon Pilgrim; CHECK:       body:
193e471fdadSSimon Pilgrim; CHECK-NEXT:    [[MASK:%.*]] = and i64 [[X]], 7
194e471fdadSSimon Pilgrim; CHECK-NEXT:    br label [[END]]
195e471fdadSSimon Pilgrim; CHECK:       end:
196e471fdadSSimon Pilgrim; CHECK-NEXT:    [[X_MASK:%.*]] = phi i64 [ [[X]], [[ENTRY:%.*]] ], [ [[MASK]], [[BODY]] ]
197e471fdadSSimon Pilgrim; CHECK-NEXT:    [[RES:%.*]] = and i64 [[X_MASK]], 1
198e471fdadSSimon Pilgrim; CHECK-NEXT:    ret i64 [[RES]]
199e471fdadSSimon Pilgrim;
200e471fdadSSimon Pilgrimentry:
201e471fdadSSimon Pilgrim  %cmp = icmp ult i64 %x, 8
202e471fdadSSimon Pilgrim  br i1 %cmp, label %end, label %body
203e471fdadSSimon Pilgrimbody:
204e471fdadSSimon Pilgrim  %mask = and i64 %x, 7
205e471fdadSSimon Pilgrim  br label %end
206e471fdadSSimon Pilgrimend:
207e471fdadSSimon Pilgrim  %x.mask = phi i64 [ %x, %entry ], [ %mask, %body ]
208e471fdadSSimon Pilgrim  %res = and i64 %x.mask, 1
209e471fdadSSimon Pilgrim  ret i64 %res
210e471fdadSSimon Pilgrim}
211