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