xref: /llvm-project/llvm/test/Analysis/ValueTracking/knownbits-select-from-cond.ll (revision 744a23f24b08e8b988b176173c433d64761e66b3)
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