1882992a9SNoah Goldstein; NOTE: Assertions have been autogenerated by utils/update_test_checks.py 2882992a9SNoah Goldstein; RUN: opt -passes=instcombine -S < %s | FileCheck %s 3882992a9SNoah Goldstein 4882992a9SNoah Goldsteindefine i8 @select_condition_implies_highbits_op1(i8 %xx, i8 noundef %y) { 5882992a9SNoah Goldstein; CHECK-LABEL: @select_condition_implies_highbits_op1( 6882992a9SNoah Goldstein; CHECK-NEXT: [[X:%.*]] = and i8 [[XX:%.*]], 15 7882992a9SNoah Goldstein; CHECK-NEXT: [[COND:%.*]] = icmp ult i8 [[Y:%.*]], 3 8882992a9SNoah Goldstein; CHECK-NEXT: [[SEL:%.*]] = select i1 [[COND]], i8 [[Y]], i8 [[X]] 9*744a23f2SNoah Goldstein; CHECK-NEXT: [[R:%.*]] = or disjoint i8 [[SEL]], 32 10882992a9SNoah Goldstein; CHECK-NEXT: ret i8 [[R]] 11882992a9SNoah Goldstein; 12882992a9SNoah Goldstein %x = and i8 %xx, 15 13882992a9SNoah Goldstein %cond = icmp ult i8 %y, 3 14882992a9SNoah Goldstein %sel = select i1 %cond, i8 %y, i8 %x 15882992a9SNoah Goldstein %r = add i8 %sel, 32 16882992a9SNoah Goldstein ret i8 %r 17882992a9SNoah Goldstein} 18882992a9SNoah Goldstein 19882992a9SNoah Goldsteindefine i8 @select_condition_implies_highbits_op1_maybe_undef_fail(i8 %xx, i8 %y) { 20882992a9SNoah Goldstein; CHECK-LABEL: @select_condition_implies_highbits_op1_maybe_undef_fail( 21882992a9SNoah Goldstein; CHECK-NEXT: [[X:%.*]] = and i8 [[XX:%.*]], 15 22882992a9SNoah Goldstein; CHECK-NEXT: [[COND:%.*]] = icmp ult i8 [[Y:%.*]], 3 23882992a9SNoah Goldstein; CHECK-NEXT: [[SEL:%.*]] = select i1 [[COND]], i8 [[Y]], i8 [[X]] 24882992a9SNoah Goldstein; CHECK-NEXT: [[R:%.*]] = add i8 [[SEL]], 32 25882992a9SNoah Goldstein; CHECK-NEXT: ret i8 [[R]] 26882992a9SNoah Goldstein; 27882992a9SNoah Goldstein %x = and i8 %xx, 15 28882992a9SNoah Goldstein %cond = icmp ult i8 %y, 3 29882992a9SNoah Goldstein %sel = select i1 %cond, i8 %y, i8 %x 30882992a9SNoah Goldstein %r = add i8 %sel, 32 31882992a9SNoah Goldstein ret i8 %r 32882992a9SNoah Goldstein} 33882992a9SNoah Goldstein 34882992a9SNoah Goldsteindefine i8 @select_condition_implies_highbits_op2(i8 %xx, i8 noundef %y) { 35882992a9SNoah Goldstein; CHECK-LABEL: @select_condition_implies_highbits_op2( 36882992a9SNoah Goldstein; CHECK-NEXT: [[X:%.*]] = and i8 [[XX:%.*]], 15 37882992a9SNoah Goldstein; CHECK-NEXT: [[COND:%.*]] = icmp ugt i8 [[Y:%.*]], 3 38882992a9SNoah Goldstein; CHECK-NEXT: [[SEL:%.*]] = select i1 [[COND]], i8 [[X]], i8 [[Y]] 39*744a23f2SNoah Goldstein; CHECK-NEXT: [[R:%.*]] = or disjoint i8 [[SEL]], 32 40882992a9SNoah Goldstein; CHECK-NEXT: ret i8 [[R]] 41882992a9SNoah Goldstein; 42882992a9SNoah Goldstein %x = and i8 %xx, 15 43882992a9SNoah Goldstein %cond = icmp ugt i8 %y, 3 44882992a9SNoah Goldstein %sel = select i1 %cond, i8 %x, i8 %y 45882992a9SNoah Goldstein %r = add i8 %sel, 32 46882992a9SNoah Goldstein ret i8 %r 47882992a9SNoah Goldstein} 48882992a9SNoah Goldstein 49882992a9SNoah Goldsteindefine i8 @select_condition_implies_highbits_op1_and(i8 %xx, i8 noundef %y, i1 %other_cond) { 50882992a9SNoah Goldstein; CHECK-LABEL: @select_condition_implies_highbits_op1_and( 51882992a9SNoah Goldstein; CHECK-NEXT: [[X:%.*]] = and i8 [[XX:%.*]], 15 52882992a9SNoah Goldstein; CHECK-NEXT: [[COND0:%.*]] = icmp ult i8 [[Y:%.*]], 3 53882992a9SNoah Goldstein; CHECK-NEXT: [[COND:%.*]] = and i1 [[COND0]], [[OTHER_COND:%.*]] 54882992a9SNoah Goldstein; CHECK-NEXT: [[SEL:%.*]] = select i1 [[COND]], i8 [[Y]], i8 [[X]] 55*744a23f2SNoah Goldstein; CHECK-NEXT: [[R:%.*]] = or disjoint i8 [[SEL]], 32 56882992a9SNoah Goldstein; CHECK-NEXT: ret i8 [[R]] 57882992a9SNoah Goldstein; 58882992a9SNoah Goldstein %x = and i8 %xx, 15 59882992a9SNoah Goldstein %cond0 = icmp ult i8 %y, 3 60882992a9SNoah Goldstein %cond = and i1 %cond0, %other_cond 61882992a9SNoah Goldstein %sel = select i1 %cond, i8 %y, i8 %x 62882992a9SNoah Goldstein %r = add i8 %sel, 32 63882992a9SNoah Goldstein ret i8 %r 64882992a9SNoah Goldstein} 65882992a9SNoah Goldstein 66882992a9SNoah Goldsteindefine i8 @select_condition_implies_highbits_op2_or(i8 %xx, i8 noundef %y, i1 %other_cond) { 67882992a9SNoah Goldstein; CHECK-LABEL: @select_condition_implies_highbits_op2_or( 68882992a9SNoah Goldstein; CHECK-NEXT: [[X:%.*]] = and i8 [[XX:%.*]], 15 69882992a9SNoah Goldstein; CHECK-NEXT: [[COND0:%.*]] = icmp ugt i8 [[Y:%.*]], 3 70882992a9SNoah Goldstein; CHECK-NEXT: [[COND:%.*]] = or i1 [[COND0]], [[OTHER_COND:%.*]] 71882992a9SNoah Goldstein; CHECK-NEXT: [[SEL:%.*]] = select i1 [[COND]], i8 [[X]], i8 [[Y]] 72*744a23f2SNoah Goldstein; CHECK-NEXT: [[R:%.*]] = or disjoint i8 [[SEL]], 32 73882992a9SNoah Goldstein; CHECK-NEXT: ret i8 [[R]] 74882992a9SNoah Goldstein; 75882992a9SNoah Goldstein %x = and i8 %xx, 15 76882992a9SNoah Goldstein %cond0 = icmp ugt i8 %y, 3 77882992a9SNoah Goldstein %cond = or i1 %cond0, %other_cond 78882992a9SNoah Goldstein %sel = select i1 %cond, i8 %x, i8 %y 79882992a9SNoah Goldstein %r = add i8 %sel, 32 80882992a9SNoah Goldstein ret i8 %r 81882992a9SNoah Goldstein} 82