1 ; RUN: opt -instcombine -S -o - %s | FileCheck %s
3 define i1 @masked_and_notallzeroes(i32 %A) {
4 ; CHECK-LABEL: @masked_and_notallzeroes
5 ; CHECK: [[MASK:%.*]] = and i32 %A, 7
6 ; CHECK: icmp ne i32 [[MASK]], 0
7 ; CHECK-NOT: and i32 %A, 39
10 %mask1 = and i32 %A, 7
11 %tst1 = icmp ne i32 %mask1, 0
13 %mask2 = and i32 %A, 39
14 %tst2 = icmp ne i32 %mask2, 0
16 %res = and i1 %tst1, %tst2
20 define i1 @masked_or_allzeroes(i32 %A) {
21 ; CHECK-LABEL: @masked_or_allzeroes
22 ; CHECK: [[MASK:%.*]] = and i32 %A, 7
23 ; CHECK: icmp eq i32 [[MASK]], 0
24 ; CHECK-NOT: and i32 %A, 39
27 %mask1 = and i32 %A, 7
28 %tst1 = icmp eq i32 %mask1, 0
30 %mask2 = and i32 %A, 39
31 %tst2 = icmp eq i32 %mask2, 0
33 %res = or i1 %tst1, %tst2
37 define i1 @masked_and_notallones(i32 %A) {
38 ; CHECK-LABEL: @masked_and_notallones
39 ; CHECK: [[MASK:%.*]] = and i32 %A, 7
40 ; CHECK: icmp ne i32 [[MASK]], 7
41 ; CHECK-NOT: and i32 %A, 39
44 %mask1 = and i32 %A, 7
45 %tst1 = icmp ne i32 %mask1, 7
47 %mask2 = and i32 %A, 39
48 %tst2 = icmp ne i32 %mask2, 39
50 %res = and i1 %tst1, %tst2
54 define i1 @masked_or_allones(i32 %A) {
55 ; CHECK-LABEL: @masked_or_allones
56 ; CHECK: [[MASK:%.*]] = and i32 %A, 7
57 ; CHECK: icmp eq i32 [[MASK]], 7
58 ; CHECK-NOT: and i32 %A, 39
61 %mask1 = and i32 %A, 7
62 %tst1 = icmp eq i32 %mask1, 7
64 %mask2 = and i32 %A, 39
65 %tst2 = icmp eq i32 %mask2, 39
67 %res = or i1 %tst1, %tst2
71 define i1 @masked_and_notA(i32 %A) {
72 ; CHECK-LABEL: @masked_and_notA
73 ; CHECK: [[MASK:%.*]] = and i32 %A, 39
74 ; CHECK: icmp ne i32 [[MASK]], %A
75 ; CHECK-NOT: and i32 %A, 7
78 %mask1 = and i32 %A, 7
79 %tst1 = icmp ne i32 %mask1, %A
81 %mask2 = and i32 %A, 39
82 %tst2 = icmp ne i32 %mask2, %A
84 %res = and i1 %tst1, %tst2
88 define i1 @masked_or_A(i32 %A) {
89 ; CHECK-LABEL: @masked_or_A
90 ; CHECK: [[MASK:%.*]] = and i32 %A, 39
91 ; CHECK: icmp eq i32 [[MASK]], %A
92 ; CHECK-NOT: and i32 %A, 7
95 %mask1 = and i32 %A, 7
96 %tst1 = icmp eq i32 %mask1, %A
98 %mask2 = and i32 %A, 39
99 %tst2 = icmp eq i32 %mask2, %A
101 %res = or i1 %tst1, %tst2
105 define i1 @masked_or_allzeroes_notoptimised(i32 %A) {
106 ; CHECK-LABEL: @masked_or_allzeroes_notoptimised
107 ; CHECK: [[MASK:%.*]] = and i32 %A, 15
108 ; CHECK: icmp eq i32 [[MASK]], 0
109 ; CHECK: [[MASK:%.*]] = and i32 %A, 39
110 ; CHECK: icmp eq i32 [[MASK]], 0
113 %mask1 = and i32 %A, 15
114 %tst1 = icmp eq i32 %mask1, 0
116 %mask2 = and i32 %A, 39
117 %tst2 = icmp eq i32 %mask2, 0
119 %res = or i1 %tst1, %tst2
123 define i1 @nomask_lhs(i32 %in) {
124 ; CHECK-LABEL: @nomask_lhs
125 ; CHECK: [[MASK:%.*]] = and i32 %in, 1
126 ; CHECK: icmp eq i32 [[MASK]], 0
129 %tst1 = icmp eq i32 %in, 0
131 %masked = and i32 %in, 1
132 %tst2 = icmp eq i32 %masked, 0
134 %val = or i1 %tst1, %tst2
139 define i1 @nomask_rhs(i32 %in) {
140 ; CHECK-LABEL: @nomask_rhs
141 ; CHECK: [[MASK:%.*]] = and i32 %in, 1
142 ; CHECK: icmp eq i32 [[MASK]], 0
145 %masked = and i32 %in, 1
146 %tst1 = icmp eq i32 %masked, 0
148 %tst2 = icmp eq i32 %in, 0
150 %val = or i1 %tst1, %tst2