Skip to content

Commit ac87d6b

Browse files
authored
[mlir][arith] Fold arith.cmpi eq, %val, %one : i1 -> %val and arith.cmpi ne, %val, %zero : i1 -> %val (#124436)
https://alive2.llvm.org/ce/z/dNZMdC
1 parent 43a50de commit ac87d6b

File tree

3 files changed

+88
-6
lines changed

3 files changed

+88
-6
lines changed

flang/test/Lower/Intrinsics/ieee_next.f90

Lines changed: 4 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -131,9 +131,8 @@ program p
131131
! CHECK: %[[V_106:[0-9]+]] = arith.bitcast %[[V_104]] : f32 to i32
132132
! CHECK: %[[V_107:[0-9]+]] = arith.shrui %[[V_106]], %c31{{.*}} : i32
133133
! CHECK: %[[V_108:[0-9]+]] = fir.convert %[[V_107]] : (i32) -> i1
134-
! CHECK: %[[V_109:[0-9]+]] = arith.cmpi ne, %[[V_108]], %false{{[_0-9]*}} : i1
135134
! CHECK: %[[V_110:[0-9]+]] = "llvm.intr.is.fpclass"(%[[V_104]]) <{bit = 516 : i32}> : (f32) -> i1
136-
! CHECK: %[[V_111:[0-9]+]] = arith.andi %[[V_110]], %[[V_109]] : i1
135+
! CHECK: %[[V_111:[0-9]+]] = arith.andi %[[V_110]], %[[V_108]] : i1
137136
! CHECK: %[[V_112:[0-9]+]] = arith.ori %[[V_105]], %[[V_111]] : i1
138137
! CHECK: %[[V_113:[0-9]+]] = fir.if %[[V_112]] -> (f32) {
139138
! CHECK: %[[V_202:[0-9]+]] = "llvm.intr.is.fpclass"(%[[V_104]]) <{bit = 1 : i32}> : (f32) -> i1
@@ -149,7 +148,7 @@ program p
149148
! CHECK: } else {
150149
! CHECK-DAG: %[[V_204:[0-9]+]] = arith.subi %[[V_106]], %c1{{.*}} : i32
151150
! CHECK-DAG: %[[V_205:[0-9]+]] = arith.addi %[[V_106]], %c1{{.*}} : i32
152-
! CHECK: %[[V_206:[0-9]+]] = arith.select %[[V_109]], %[[V_205]], %[[V_204]] : i32
151+
! CHECK: %[[V_206:[0-9]+]] = arith.select %[[V_108]], %[[V_205]], %[[V_204]] : i32
153152
! CHECK: %[[V_207:[0-9]+]] = arith.bitcast %[[V_206]] : i32 to f32
154153
! CHECK: fir.result %[[V_207]] : f32
155154
! CHECK: }
@@ -253,9 +252,8 @@ program p
253252
! CHECK: %[[V_182:[0-9]+]] = arith.bitcast %[[V_180]] : f128 to i128
254253
! CHECK: %[[V_183:[0-9]+]] = arith.shrui %[[V_182]], %c127{{.*}} : i128
255254
! CHECK: %[[V_184:[0-9]+]] = fir.convert %[[V_183]] : (i128) -> i1
256-
! CHECK: %[[V_185:[0-9]+]] = arith.cmpi ne, %[[V_184]], %false{{[_0-9]*}} : i1
257255
! CHECK: %[[V_186:[0-9]+]] = "llvm.intr.is.fpclass"(%[[V_180]]) <{bit = 516 : i32}> : (f128) -> i1
258-
! CHECK: %[[V_187:[0-9]+]] = arith.andi %[[V_186]], %[[V_185]] : i1
256+
! CHECK: %[[V_187:[0-9]+]] = arith.andi %[[V_186]], %[[V_184]] : i1
259257
! CHECK: %[[V_188:[0-9]+]] = arith.ori %[[V_181]], %[[V_187]] : i1
260258
! CHECK: %[[V_189:[0-9]+]] = fir.if %[[V_188]] -> (f128) {
261259
! CHECK: %[[V_202:[0-9]+]] = "llvm.intr.is.fpclass"(%[[V_180]]) <{bit = 1 : i32}> : (f128) -> i1
@@ -271,7 +269,7 @@ program p
271269
! CHECK: } else {
272270
! CHECK-DAG: %[[V_204:[0-9]+]] = arith.subi %[[V_182]], %c1{{.*}} : i128
273271
! CHECK-DAG: %[[V_205:[0-9]+]] = arith.addi %[[V_182]], %c1{{.*}} : i128
274-
! CHECK: %[[V_206:[0-9]+]] = arith.select %[[V_185]], %[[V_205]], %[[V_204]] : i128
272+
! CHECK: %[[V_206:[0-9]+]] = arith.select %[[V_184]], %[[V_205]], %[[V_204]] : i128
275273
! CHECK: %[[V_207:[0-9]+]] = arith.bitcast %[[V_206]] : i128 to f128
276274
! CHECK: fir.result %[[V_207]] : f128
277275
! CHECK: }

mlir/lib/Dialect/Arith/IR/ArithOps.cpp

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1865,6 +1865,18 @@ OpFoldResult arith::CmpIOp::fold(FoldAdaptor adaptor) {
18651865
getPredicate() == arith::CmpIPredicate::ne)
18661866
return extOp.getOperand();
18671867
}
1868+
1869+
// arith.cmpi ne, %val, %zero : i1 -> %val
1870+
if (getElementTypeOrSelf(getLhs().getType()).isInteger(1) &&
1871+
getPredicate() == arith::CmpIPredicate::ne)
1872+
return getLhs();
1873+
}
1874+
1875+
if (matchPattern(adaptor.getRhs(), m_One())) {
1876+
// arith.cmpi eq, %val, %one : i1 -> %val
1877+
if (getElementTypeOrSelf(getLhs().getType()).isInteger(1) &&
1878+
getPredicate() == arith::CmpIPredicate::eq)
1879+
return getLhs();
18681880
}
18691881

18701882
// Move constant to the right side.

mlir/test/Dialect/Arith/canonicalize.mlir

Lines changed: 72 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -160,6 +160,78 @@ func.func @selNotCond(%arg0: i1, %arg1 : i32, %arg2 : i32, %arg3 : i32, %arg4 :
160160
return %res1, %res2 : i32, i32
161161
}
162162

163+
// CHECK-LABEL: @cmpiI1eq
164+
// CHECK-SAME: (%[[ARG:.*]]: i1)
165+
// CHECK: return %[[ARG]]
166+
func.func @cmpiI1eq(%arg0: i1) -> i1 {
167+
%one = arith.constant 1 : i1
168+
%res = arith.cmpi eq, %arg0, %one : i1
169+
return %res : i1
170+
}
171+
172+
// CHECK-LABEL: @cmpiI1eqVec
173+
// CHECK-SAME: (%[[ARG:.*]]: vector<4xi1>)
174+
// CHECK: return %[[ARG]]
175+
func.func @cmpiI1eqVec(%arg0: vector<4xi1>) -> vector<4xi1> {
176+
%one = arith.constant dense<1> : vector<4xi1>
177+
%res = arith.cmpi eq, %arg0, %one : vector<4xi1>
178+
return %res : vector<4xi1>
179+
}
180+
181+
// CHECK-LABEL: @cmpiI1ne
182+
// CHECK-SAME: (%[[ARG:.*]]: i1)
183+
// CHECK: return %[[ARG]]
184+
func.func @cmpiI1ne(%arg0: i1) -> i1 {
185+
%zero = arith.constant 0 : i1
186+
%res = arith.cmpi ne, %arg0, %zero : i1
187+
return %res : i1
188+
}
189+
190+
// CHECK-LABEL: @cmpiI1neVec
191+
// CHECK-SAME: (%[[ARG:.*]]: vector<4xi1>)
192+
// CHECK: return %[[ARG]]
193+
func.func @cmpiI1neVec(%arg0: vector<4xi1>) -> vector<4xi1> {
194+
%zero = arith.constant dense<0> : vector<4xi1>
195+
%res = arith.cmpi ne, %arg0, %zero : vector<4xi1>
196+
return %res : vector<4xi1>
197+
}
198+
199+
// CHECK-LABEL: @cmpiI1eqLhs
200+
// CHECK-SAME: (%[[ARG:.*]]: i1)
201+
// CHECK: return %[[ARG]]
202+
func.func @cmpiI1eqLhs(%arg0: i1) -> i1 {
203+
%one = arith.constant 1 : i1
204+
%res = arith.cmpi eq, %one, %arg0 : i1
205+
return %res : i1
206+
}
207+
208+
// CHECK-LABEL: @cmpiI1eqVecLhs
209+
// CHECK-SAME: (%[[ARG:.*]]: vector<4xi1>)
210+
// CHECK: return %[[ARG]]
211+
func.func @cmpiI1eqVecLhs(%arg0: vector<4xi1>) -> vector<4xi1> {
212+
%one = arith.constant dense<1> : vector<4xi1>
213+
%res = arith.cmpi eq, %one, %arg0 : vector<4xi1>
214+
return %res : vector<4xi1>
215+
}
216+
217+
// CHECK-LABEL: @cmpiI1neLhs
218+
// CHECK-SAME: (%[[ARG:.*]]: i1)
219+
// CHECK: return %[[ARG]]
220+
func.func @cmpiI1neLhs(%arg0: i1) -> i1 {
221+
%zero = arith.constant 0 : i1
222+
%res = arith.cmpi ne, %zero, %arg0 : i1
223+
return %res : i1
224+
}
225+
226+
// CHECK-LABEL: @cmpiI1neVecLhs
227+
// CHECK-SAME: (%[[ARG:.*]]: vector<4xi1>)
228+
// CHECK: return %[[ARG]]
229+
func.func @cmpiI1neVecLhs(%arg0: vector<4xi1>) -> vector<4xi1> {
230+
%zero = arith.constant dense<0> : vector<4xi1>
231+
%res = arith.cmpi ne, %zero, %arg0 : vector<4xi1>
232+
return %res : vector<4xi1>
233+
}
234+
163235
// Test case: Folding of comparisons with equal operands.
164236
// CHECK-LABEL: @cmpi_equal_operands
165237
// CHECK-DAG: %[[T:.*]] = arith.constant true

0 commit comments

Comments
 (0)