diff --git a/flang/include/flang/Optimizer/Dialect/FIROps.td b/flang/include/flang/Optimizer/Dialect/FIROps.td index 14a3879906186..fcecc605dfa5c 100644 --- a/flang/include/flang/Optimizer/Dialect/FIROps.td +++ b/flang/include/flang/Optimizer/Dialect/FIROps.td @@ -2553,14 +2553,18 @@ def fir_DivcOp : ComplexArithmeticOp<"divc", // Pow is a builtin call and not a primitive def fir_CmpcOp : fir_Op<"cmpc", - [NoMemoryEffect, SameTypeOperands, SameOperandsAndResultShape]> { + [NoMemoryEffect, SameTypeOperands, SameOperandsAndResultShape, + DeclareOpInterfaceMethods]> { let summary = "complex floating-point comparison operator"; let description = [{ A complex comparison to handle complex types found in FIR. }]; - let arguments = (ins fir_ComplexType:$lhs, fir_ComplexType:$rhs); + let arguments = (ins + fir_ComplexType:$lhs, + fir_ComplexType:$rhs, + DefaultValuedAttr:$fastmath); let results = (outs AnyLogicalLike); diff --git a/flang/lib/Optimizer/CodeGen/CodeGen.cpp b/flang/lib/Optimizer/CodeGen/CodeGen.cpp index 408377f1d7a17..bf175c8ebadee 100644 --- a/flang/lib/Optimizer/CodeGen/CodeGen.cpp +++ b/flang/lib/Optimizer/CodeGen/CodeGen.cpp @@ -840,16 +840,18 @@ struct CmpcOpConversion : public FIROpConversion { mlir::ValueRange operands = adaptor.getOperands(); mlir::Type resTy = convertType(cmp.getType()); mlir::Location loc = cmp.getLoc(); - llvm::SmallVector rp = { + mlir::LLVM::FastmathFlags fmf = + mlir::arith::convertArithFastMathFlagsToLLVM(cmp.getFastmath()); + mlir::LLVM::FCmpPredicate pred = + static_cast(cmp.getPredicate()); + auto rcp = rewriter.create( + loc, resTy, pred, rewriter.create(loc, operands[0], 0), - rewriter.create(loc, operands[1], 0)}; - auto rcp = - rewriter.create(loc, resTy, rp, cmp->getAttrs()); - llvm::SmallVector ip = { + rewriter.create(loc, operands[1], 0), fmf); + auto icp = rewriter.create( + loc, resTy, pred, rewriter.create(loc, operands[0], 1), - rewriter.create(loc, operands[1], 1)}; - auto icp = - rewriter.create(loc, resTy, ip, cmp->getAttrs()); + rewriter.create(loc, operands[1], 1), fmf); llvm::SmallVector cp = {rcp, icp}; switch (cmp.getPredicate()) { case mlir::arith::CmpFPredicate::OEQ: // .EQ. diff --git a/flang/test/Fir/convert-to-llvm.fir b/flang/test/Fir/convert-to-llvm.fir index c9a44914b9870..993058ebb0a4d 100644 --- a/flang/test/Fir/convert-to-llvm.fir +++ b/flang/test/Fir/convert-to-llvm.fir @@ -656,7 +656,7 @@ func.func @compare_complex_eq(%a : !fir.complex<8>, %b : !fir.complex<8>) -> i1 // CHECK: return [[RES]] : i1 func.func @compare_complex_ne(%a : !fir.complex<8>, %b : !fir.complex<8>) -> i1 { - %r = fir.cmpc "une", %a, %b : !fir.complex<8> + %r = fir.cmpc "une", %a, %b {fastmath = #arith.fastmath} : !fir.complex<8> return %r : i1 } @@ -667,13 +667,13 @@ func.func @compare_complex_ne(%a : !fir.complex<8>, %b : !fir.complex<8>) -> i1 // CHECK-DAG: [[IA:%.*]] = llvm.extractvalue [[A]][1] : !llvm.struct<(f64, f64)> // CHECK-DAG: [[RB:%.*]] = llvm.extractvalue [[B]][0] : !llvm.struct<(f64, f64)> // CHECK-DAG: [[IB:%.*]] = llvm.extractvalue [[B]][1] : !llvm.struct<(f64, f64)> -// CHECK-DAG: [[RESR:%.*]] = llvm.fcmp "une" [[RA]], [[RB]] : f64 -// CHECK-DAG: [[RESI:%.*]] = llvm.fcmp "une" [[IA]], [[IB]] : f64 +// CHECK-DAG: [[RESR:%.*]] = llvm.fcmp "une" [[RA]], [[RB]] {fastmathFlags = #llvm.fastmath} : f64 +// CHECK-DAG: [[RESI:%.*]] = llvm.fcmp "une" [[IA]], [[IB]] {fastmathFlags = #llvm.fastmath} : f64 // CHECK: [[RES:%.*]] = llvm.or [[RESR]], [[RESI]] : i1 // CHECK: return [[RES]] : i1 func.func @compare_complex_other(%a : !fir.complex<8>, %b : !fir.complex<8>) -> i1 { - %r = fir.cmpc "ogt", %a, %b : !fir.complex<8> + %r = fir.cmpc "ogt", %a, %b {fastmath = #arith.fastmath} : !fir.complex<8> return %r : i1 } @@ -682,7 +682,7 @@ func.func @compare_complex_other(%a : !fir.complex<8>, %b : !fir.complex<8>) -> // CHECK-SAME: [[B:%.*]]: !llvm.struct<(f64, f64)> // CHECK-DAG: [[RA:%.*]] = llvm.extractvalue [[A]][0] : !llvm.struct<(f64, f64)> // CHECK-DAG: [[RB:%.*]] = llvm.extractvalue [[B]][0] : !llvm.struct<(f64, f64)> -// CHECK: [[RESR:%.*]] = llvm.fcmp "ogt" [[RA]], [[RB]] : f64 +// CHECK: [[RESR:%.*]] = llvm.fcmp "ogt" [[RA]], [[RB]] {fastmathFlags = #llvm.fastmath} : f64 // CHECK: return [[RESR]] : i1 // ----- diff --git a/flang/test/Fir/fir-ops.fir b/flang/test/Fir/fir-ops.fir index dd0fbb3be36c4..3c4095b9fdb14 100644 --- a/flang/test/Fir/fir-ops.fir +++ b/flang/test/Fir/fir-ops.fir @@ -464,37 +464,37 @@ fir.type_info @test_type_info noinit nodestroy nofinal extends !fir.type, [[VAL_152:%.*]]: !fir.complex<16>) { func.func @compare_complex(%a : !fir.complex<16>, %b : !fir.complex<16>) { -// CHECK: [[VAL_153:%.*]] = fir.cmpc "false", [[VAL_151]], [[VAL_152]] : !fir.complex<16> -// CHECK: [[VAL_154:%.*]] = fir.cmpc "oeq", [[VAL_151]], [[VAL_152]] : !fir.complex<16> -// CHECK: [[VAL_155:%.*]] = fir.cmpc "ogt", [[VAL_151]], [[VAL_152]] : !fir.complex<16> -// CHECK: [[VAL_156:%.*]] = fir.cmpc "oge", [[VAL_151]], [[VAL_152]] : !fir.complex<16> +// CHECK: [[VAL_153:%.*]] = fir.cmpc "false", [[VAL_151]], [[VAL_152]] {fastmath = {{.*}}} : !fir.complex<16> +// CHECK: [[VAL_154:%.*]] = fir.cmpc "oeq", [[VAL_151]], [[VAL_152]] {fastmath = {{.*}}} : !fir.complex<16> +// CHECK: [[VAL_155:%.*]] = fir.cmpc "ogt", [[VAL_151]], [[VAL_152]] {fastmath = {{.*}}} : !fir.complex<16> +// CHECK: [[VAL_156:%.*]] = fir.cmpc "oge", [[VAL_151]], [[VAL_152]] {fastmath = {{.*}}} : !fir.complex<16> %d0 = fir.cmpc "false", %a, %b : !fir.complex<16> %d1 = fir.cmpc "oeq", %a, %b : !fir.complex<16> %d2 = fir.cmpc "ogt", %a, %b : !fir.complex<16> %d3 = fir.cmpc "oge", %a, %b : !fir.complex<16> -// CHECK: [[VAL_157:%.*]] = fir.cmpc "olt", [[VAL_151]], [[VAL_152]] : !fir.complex<16> -// CHECK: [[VAL_158:%.*]] = fir.cmpc "ole", [[VAL_151]], [[VAL_152]] : !fir.complex<16> -// CHECK: [[VAL_159:%.*]] = fir.cmpc "one", [[VAL_151]], [[VAL_152]] : !fir.complex<16> -// CHECK: [[VAL_160:%.*]] = fir.cmpc "ord", [[VAL_151]], [[VAL_152]] : !fir.complex<16> +// CHECK: [[VAL_157:%.*]] = fir.cmpc "olt", [[VAL_151]], [[VAL_152]] {fastmath = {{.*}}} : !fir.complex<16> +// CHECK: [[VAL_158:%.*]] = fir.cmpc "ole", [[VAL_151]], [[VAL_152]] {fastmath = {{.*}}} : !fir.complex<16> +// CHECK: [[VAL_159:%.*]] = fir.cmpc "one", [[VAL_151]], [[VAL_152]] {fastmath = {{.*}}} : !fir.complex<16> +// CHECK: [[VAL_160:%.*]] = fir.cmpc "ord", [[VAL_151]], [[VAL_152]] {fastmath = {{.*}}} : !fir.complex<16> %a0 = fir.cmpc "olt", %a, %b : !fir.complex<16> %a1 = fir.cmpc "ole", %a, %b : !fir.complex<16> %a2 = fir.cmpc "one", %a, %b : !fir.complex<16> %a3 = fir.cmpc "ord", %a, %b : !fir.complex<16> -// CHECK: [[VAL_161:%.*]] = fir.cmpc "ueq", [[VAL_151]], [[VAL_152]] : !fir.complex<16> -// CHECK: [[VAL_162:%.*]] = fir.cmpc "ugt", [[VAL_151]], [[VAL_152]] : !fir.complex<16> -// CHECK: [[VAL_163:%.*]] = fir.cmpc "uge", [[VAL_151]], [[VAL_152]] : !fir.complex<16> -// CHECK: [[VAL_164:%.*]] = fir.cmpc "ult", [[VAL_151]], [[VAL_152]] : !fir.complex<16> +// CHECK: [[VAL_161:%.*]] = fir.cmpc "ueq", [[VAL_151]], [[VAL_152]] {fastmath = {{.*}}} : !fir.complex<16> +// CHECK: [[VAL_162:%.*]] = fir.cmpc "ugt", [[VAL_151]], [[VAL_152]] {fastmath = {{.*}}} : !fir.complex<16> +// CHECK: [[VAL_163:%.*]] = fir.cmpc "uge", [[VAL_151]], [[VAL_152]] {fastmath = {{.*}}} : !fir.complex<16> +// CHECK: [[VAL_164:%.*]] = fir.cmpc "ult", [[VAL_151]], [[VAL_152]] {fastmath = {{.*}}} : !fir.complex<16> %b0 = fir.cmpc "ueq", %a, %b : !fir.complex<16> %b1 = fir.cmpc "ugt", %a, %b : !fir.complex<16> %b2 = fir.cmpc "uge", %a, %b : !fir.complex<16> %b3 = fir.cmpc "ult", %a, %b : !fir.complex<16> -// CHECK: [[VAL_165:%.*]] = fir.cmpc "ule", [[VAL_151]], [[VAL_152]] : !fir.complex<16> -// CHECK: [[VAL_166:%.*]] = fir.cmpc "une", [[VAL_151]], [[VAL_152]] : !fir.complex<16> -// CHECK: [[VAL_167:%.*]] = fir.cmpc "uno", [[VAL_151]], [[VAL_152]] : !fir.complex<16> -// CHECK: [[VAL_168:%.*]] = fir.cmpc "true", [[VAL_151]], [[VAL_152]] : !fir.complex<16> +// CHECK: [[VAL_165:%.*]] = fir.cmpc "ule", [[VAL_151]], [[VAL_152]] {fastmath = {{.*}}} : !fir.complex<16> +// CHECK: [[VAL_166:%.*]] = fir.cmpc "une", [[VAL_151]], [[VAL_152]] {fastmath = {{.*}}} : !fir.complex<16> +// CHECK: [[VAL_167:%.*]] = fir.cmpc "uno", [[VAL_151]], [[VAL_152]] {fastmath = {{.*}}} : !fir.complex<16> +// CHECK: [[VAL_168:%.*]] = fir.cmpc "true", [[VAL_151]], [[VAL_152]] {fastmath = {{.*}}} : !fir.complex<16> %c0 = fir.cmpc "ule", %a, %b : !fir.complex<16> %c1 = fir.cmpc "une", %a, %b : !fir.complex<16> %c2 = fir.cmpc "uno", %a, %b : !fir.complex<16> diff --git a/flang/test/HLFIR/call_with_poly_dummy.f90 b/flang/test/HLFIR/call_with_poly_dummy.f90 index c4b98fbe5f557..af6876e26603e 100644 --- a/flang/test/HLFIR/call_with_poly_dummy.f90 +++ b/flang/test/HLFIR/call_with_poly_dummy.f90 @@ -25,7 +25,7 @@ end subroutine test1 ! CHECK: %[[VAL_1:.*]]:2 = hlfir.declare %[[VAL_0]] {uniq_name = "_QFtest2Ex"} : (!fir.ref) -> (!fir.ref, !fir.ref) ! CHECK: %[[VAL_2:.*]] = fir.load %[[VAL_1]]#0 : !fir.ref ! CHECK: %[[VAL_3:.*]] = arith.constant 0.000000e+00 : f32 -! CHECK: %[[VAL_4:.*]] = arith.cmpf oeq, %[[VAL_2]], %[[VAL_3]] : f32 +! CHECK: %[[VAL_4:.*]] = arith.cmpf oeq, %[[VAL_2]], %[[VAL_3]] {{.*}} : f32 ! CHECK: %[[VAL_5:.*]] = fir.convert %[[VAL_4]] : (i1) -> !fir.logical<4> ! CHECK: %[[VAL_6:.*]]:3 = hlfir.associate %[[VAL_5]] {adapt.valuebyref} : (!fir.logical<4>) -> (!fir.ref>, !fir.ref>, i1) ! CHECK: %[[VAL_7:.*]] = fir.embox %[[VAL_6]]#0 : (!fir.ref>) -> !fir.box> diff --git a/flang/test/Lower/HLFIR/binary-ops.f90 b/flang/test/Lower/HLFIR/binary-ops.f90 index 6b89577cc5458..e0af9258cda32 100644 --- a/flang/test/Lower/HLFIR/binary-ops.f90 +++ b/flang/test/Lower/HLFIR/binary-ops.f90 @@ -246,7 +246,7 @@ subroutine cmp_real(l, x, y) ! CHECK: %[[VAL_5:.*]]:2 = hlfir.declare {{.*}}y" ! CHECK: %[[VAL_6:.*]] = fir.load %[[VAL_4]]#0 : !fir.ref ! CHECK: %[[VAL_7:.*]] = fir.load %[[VAL_5]]#0 : !fir.ref -! CHECK: %[[VAL_8:.*]] = arith.cmpf oeq, %[[VAL_6]], %[[VAL_7]] : f32 +! CHECK: %[[VAL_8:.*]] = arith.cmpf oeq, %[[VAL_6]], %[[VAL_7]] {{.*}} : f32 subroutine cmp_real_2(l, x, y) logical :: l @@ -273,7 +273,7 @@ subroutine cmp_cmplx(l, x, y) ! CHECK: %[[VAL_5:.*]]:2 = hlfir.declare {{.*}}y" ! CHECK: %[[VAL_6:.*]] = fir.load %[[VAL_4]]#0 : !fir.ref> ! CHECK: %[[VAL_7:.*]] = fir.load %[[VAL_5]]#0 : !fir.ref> -! CHECK: %[[VAL_8:.*]] = fir.cmpc "oeq", %[[VAL_6]], %[[VAL_7]] : !fir.complex<4> +! CHECK: %[[VAL_8:.*]] = fir.cmpc "oeq", %[[VAL_6]], %[[VAL_7]] {{.*}} : !fir.complex<4> subroutine cmp_char(l, x, y) logical :: l diff --git a/flang/test/Lower/HLFIR/user-defined-assignment.f90 b/flang/test/Lower/HLFIR/user-defined-assignment.f90 index a41044a60fd89..6f887cb00de31 100644 --- a/flang/test/Lower/HLFIR/user-defined-assignment.f90 +++ b/flang/test/Lower/HLFIR/user-defined-assignment.f90 @@ -101,7 +101,7 @@ subroutine test_non_elemental_array(x) ! CHECK: ^bb0(%[[VAL_7:.*]]: index): ! CHECK: %[[VAL_8:.*]] = hlfir.designate %[[VAL_1]]#0 (%[[VAL_7]]) : (!fir.box>, index) -> !fir.ref ! CHECK: %[[VAL_9:.*]] = fir.load %[[VAL_8]] : !fir.ref -! CHECK: %[[VAL_10:.*]] = arith.cmpf olt, %[[VAL_9]], %[[VAL_2]] : f32 +! CHECK: %[[VAL_10:.*]] = arith.cmpf olt, %[[VAL_9]], %[[VAL_2]] {{.*}} : f32 ! CHECK: %[[VAL_11:.*]] = fir.convert %[[VAL_10]] : (i1) -> !fir.logical<4> ! CHECK: hlfir.yield_element %[[VAL_11]] : !fir.logical<4> ! CHECK: } diff --git a/flang/test/Lower/Intrinsics/bessel_jn.f90 b/flang/test/Lower/Intrinsics/bessel_jn.f90 index 3fdef7446100d..428733d547d7b 100644 --- a/flang/test/Lower/Intrinsics/bessel_jn.f90 +++ b/flang/test/Lower/Intrinsics/bessel_jn.f90 @@ -42,7 +42,7 @@ subroutine test_transformational_real4(x, n1, n2, r) ! ALL-DAG: %[[x:.*]] = fir.load %[[argx]] : !fir.ref ! ALL-DAG: %[[n1:.*]] = fir.load %[[argn1]] : !fir.ref ! ALL-DAG: %[[n2:.*]] = fir.load %[[argn2]] : !fir.ref - ! ALL-DAG: %[[xeq0:.*]] = arith.cmpf ueq, %[[x]], %[[zero]] : f32 + ! ALL-DAG: %[[xeq0:.*]] = arith.cmpf ueq, %[[x]], %[[zero]] {{.*}} : f32 ! ALL-DAG: %[[n1ltn2:.*]] = arith.cmpi slt, %[[n1]], %[[n2]] : i32 ! ALL-DAG: %[[n1eqn2:.*]] = arith.cmpi eq, %[[n1]], %[[n2]] : i32 ! ALL: fir.if %[[xeq0]] { @@ -85,7 +85,7 @@ subroutine test_transformational_real8(x, n1, n2, r) ! ALL-DAG: %[[x:.*]] = fir.load %[[argx]] : !fir.ref ! ALL-DAG: %[[n1:.*]] = fir.load %[[argn1]] : !fir.ref ! ALL-DAG: %[[n2:.*]] = fir.load %[[argn2]] : !fir.ref - ! ALL-DAG: %[[xeq0:.*]] = arith.cmpf ueq, %[[x]], %[[zero]] : f64 + ! ALL-DAG: %[[xeq0:.*]] = arith.cmpf ueq, %[[x]], %[[zero]] {{.*}} : f64 ! ALL-DAG: %[[n1ltn2:.*]] = arith.cmpi slt, %[[n1]], %[[n2]] : i32 ! ALL-DAG: %[[n1eqn2:.*]] = arith.cmpi eq, %[[n1]], %[[n2]] : i32 ! ALL: fir.if %[[xeq0]] { diff --git a/flang/test/Lower/Intrinsics/bessel_yn.f90 b/flang/test/Lower/Intrinsics/bessel_yn.f90 index 9f4fbfbb89d31..ac77e4db5614d 100644 --- a/flang/test/Lower/Intrinsics/bessel_yn.f90 +++ b/flang/test/Lower/Intrinsics/bessel_yn.f90 @@ -42,7 +42,7 @@ subroutine test_transformational_real4(x, n1, n2, r) ! ALL-DAG: %[[x:.*]] = fir.load %[[argx]] : !fir.ref ! ALL-DAG: %[[n1:.*]] = fir.load %[[argn1]] : !fir.ref ! ALL-DAG: %[[n2:.*]] = fir.load %[[argn2]] : !fir.ref - ! ALL-DAG: %[[xeq0:.*]] = arith.cmpf ueq, %[[x]], %[[zero]] : f32 + ! ALL-DAG: %[[xeq0:.*]] = arith.cmpf ueq, %[[x]], %[[zero]] {{.*}} : f32 ! ALL-DAG: %[[n1ltn2:.*]] = arith.cmpi slt, %[[n1]], %[[n2]] : i32 ! ALL-DAG: %[[n1eqn2:.*]] = arith.cmpi eq, %[[n1]], %[[n2]] : i32 ! ALL: fir.if %[[xeq0]] { @@ -85,7 +85,7 @@ subroutine test_transformational_real8(x, n1, n2, r) ! ALL-DAG: %[[x:.*]] = fir.load %[[argx]] : !fir.ref ! ALL-DAG: %[[n1:.*]] = fir.load %[[argn1]] : !fir.ref ! ALL-DAG: %[[n2:.*]] = fir.load %[[argn2]] : !fir.ref - ! ALL-DAG: %[[xeq0:.*]] = arith.cmpf ueq, %[[x]], %[[zero]] : f64 + ! ALL-DAG: %[[xeq0:.*]] = arith.cmpf ueq, %[[x]], %[[zero]] {{.*}} : f64 ! ALL-DAG: %[[n1ltn2:.*]] = arith.cmpi slt, %[[n1]], %[[n2]] : i32 ! ALL-DAG: %[[n1eqn2:.*]] = arith.cmpi eq, %[[n1]], %[[n2]] : i32 ! ALL: fir.if %[[xeq0]] { diff --git a/flang/test/Lower/Intrinsics/dim.f90 b/flang/test/Lower/Intrinsics/dim.f90 index 6b6d2179fad9f..fb1a496570ca1 100644 --- a/flang/test/Lower/Intrinsics/dim.f90 +++ b/flang/test/Lower/Intrinsics/dim.f90 @@ -8,7 +8,7 @@ subroutine dim_testr(x, y, z) ! CHECK: %[[VAL_4:.*]] = fir.load %[[VAL_1]] : !fir.ref ! CHECK: %[[VAL_5:.*]] = arith.constant 0.000000e+00 : f32 ! CHECK: %[[VAL_6:.*]] = arith.subf %[[VAL_3]], %[[VAL_4]] {{.*}}: f32 -! CHECK: %[[VAL_7:.*]] = arith.cmpf ogt, %[[VAL_6]], %[[VAL_5]] : f32 +! CHECK: %[[VAL_7:.*]] = arith.cmpf ogt, %[[VAL_6]], %[[VAL_5]] {{.*}} : f32 ! CHECK: %[[VAL_8:.*]] = arith.select %[[VAL_7]], %[[VAL_6]], %[[VAL_5]] : f32 ! CHECK: fir.store %[[VAL_8]] to %[[VAL_2]] : !fir.ref ! CHECK: return diff --git a/flang/test/Lower/Intrinsics/min.f90 b/flang/test/Lower/Intrinsics/min.f90 index 40e6d96db6e53..c9744cf33d827 100644 --- a/flang/test/Lower/Intrinsics/min.f90 +++ b/flang/test/Lower/Intrinsics/min.f90 @@ -18,11 +18,11 @@ real function test(a, b, c) ! CHECK: %[[VAL_8:.*]] = fir.load %[[VAL_3]]#0 : !fir.ref ! CHECK: %[[VAL_9:.*]] = fir.load %[[VAL_5]]#0 : !fir.ref ! CHECK: %[[VAL_10:.*]] = fir.is_present %[[VAL_5]]#0 : (!fir.ref) -> i1 -! CHECK: %[[VAL_11:.*]] = arith.cmpf olt, %[[VAL_8]], %[[VAL_9]] : f32 +! CHECK: %[[VAL_11:.*]] = arith.cmpf olt, %[[VAL_8]], %[[VAL_9]] {{.*}} : f32 ! CHECK: %[[VAL_12:.*]] = arith.select %[[VAL_11]], %[[VAL_8]], %[[VAL_9]] : f32 ! CHECK: %[[VAL_13:.*]] = fir.if %[[VAL_10]] -> (f32) { ! CHECK: %[[VAL_14:.*]] = fir.load %[[VAL_5]]#0 : !fir.ref -! CHECK: %[[VAL_15:.*]] = arith.cmpf olt, %[[VAL_12]], %[[VAL_14]] : f32 +! CHECK: %[[VAL_15:.*]] = arith.cmpf olt, %[[VAL_12]], %[[VAL_14]] {{.*}} : f32 ! CHECK: %[[VAL_16:.*]] = arith.select %[[VAL_15]], %[[VAL_12]], %[[VAL_14]] : f32 ! CHECK: fir.result %[[VAL_16]] : f32 ! CHECK: } else { diff --git a/flang/test/Lower/Intrinsics/modulo.f90 b/flang/test/Lower/Intrinsics/modulo.f90 index 4c8c1ff4da3b0..64a6607a09ccd 100644 --- a/flang/test/Lower/Intrinsics/modulo.f90 +++ b/flang/test/Lower/Intrinsics/modulo.f90 @@ -8,9 +8,9 @@ subroutine modulo_testr(r, a, p) ! CHECK-DAG: %[[p:.*]] = fir.load %[[arg2]] : !fir.ref ! CHECK-DAG: %[[rem:.*]] = arith.remf %[[a]], %[[p]] {{.*}}: f64 ! CHECK-DAG: %[[zero:.*]] = arith.constant 0.000000e+00 : f64 - ! CHECK-DAG: %[[remNotZero:.*]] = arith.cmpf une, %[[rem]], %[[zero]] : f64 - ! CHECK-DAG: %[[aNeg:.*]] = arith.cmpf olt, %[[a]], %[[zero]] : f64 - ! CHECK-DAG: %[[pNeg:.*]] = arith.cmpf olt, %[[p]], %[[zero]] : f64 + ! CHECK-DAG: %[[remNotZero:.*]] = arith.cmpf une, %[[rem]], %[[zero]] {{.*}} : f64 + ! CHECK-DAG: %[[aNeg:.*]] = arith.cmpf olt, %[[a]], %[[zero]] {{.*}} : f64 + ! CHECK-DAG: %[[pNeg:.*]] = arith.cmpf olt, %[[p]], %[[zero]] {{.*}} : f64 ! CHECK-DAG: %[[signDifferent:.*]] = arith.xori %[[aNeg]], %[[pNeg]] : i1 ! CHECK-DAG: %[[mustAddP:.*]] = arith.andi %[[remNotZero]], %[[signDifferent]] : i1 ! CHECK-DAG: %[[remPlusP:.*]] = arith.addf %[[rem]], %[[p]] {{.*}}: f64 diff --git a/flang/test/Lower/Intrinsics/nearest.f90 b/flang/test/Lower/Intrinsics/nearest.f90 index 02ded4919dd7e..a023fa8cd804e 100644 --- a/flang/test/Lower/Intrinsics/nearest.f90 +++ b/flang/test/Lower/Intrinsics/nearest.f90 @@ -7,7 +7,7 @@ subroutine nearest_test1(x, s) ! CHECK: %[[x:.*]] = fir.load %arg0 : !fir.ref ! CHECK: %[[s:.*]] = fir.load %arg1 : !fir.ref ! CHECK: %[[zero:.*]] = arith.constant 0.000000e+00 : f32 - ! CHECK: %[[cmp:.*]] = arith.cmpf ogt, %[[s]], %[[zero]] : f32 + ! CHECK: %[[cmp:.*]] = arith.cmpf ogt, %[[s]], %[[zero]] {{.*}} : f32 ! CHECK: %[[pos:.*]] = arith.select %[[cmp]], %true, %false : i1 res = nearest(x, s) ! CHECK: %[[tmp:.*]] = fir.call @_FortranANearest4(%[[x]], %[[pos]]) {{.*}}: (f32, i1) -> f32 @@ -21,7 +21,7 @@ subroutine nearest_test2(x, s) ! CHECK: %[[x:.*]] = fir.load %arg0 : !fir.ref ! CHECK: %[[s:.*]] = fir.load %arg1 : !fir.ref ! CHECK: %[[zero:.*]] = arith.constant 0.000000e+00 : f64 - ! CHECK: %[[cmp:.*]] = arith.cmpf ogt, %[[s]], %[[zero]] : f64 + ! CHECK: %[[cmp:.*]] = arith.cmpf ogt, %[[s]], %[[zero]] {{.*}} : f64 ! CHECK: %[[pos:.*]] = arith.select %[[cmp]], %true, %false : i1 res = nearest(x, s) ! CHECK: %[[tmp:.*]] = fir.call @_FortranANearest8(%[[x]], %[[pos]]) {{.*}}: (f64, i1) -> f64 @@ -35,7 +35,7 @@ subroutine nearest_test3(x, s) ! CHECK: %[[x:.*]] = fir.load %arg0 : !fir.ref ! CHECK: %[[s:.*]] = fir.load %arg1 : !fir.ref ! CHECK: %[[zero:.*]] = arith.constant 0.000000e+00 : f80 - ! CHECK: %[[cmp:.*]] = arith.cmpf ogt, %[[s]], %[[zero]] : f80 + ! CHECK: %[[cmp:.*]] = arith.cmpf ogt, %[[s]], %[[zero]] {{.*}} : f80 ! CHECK: %[[pos:.*]] = arith.select %[[cmp]], %true, %false : i1 res = nearest(x, s) ! CHECK: %[[tmp:.*]] = fir.call @_FortranANearest10(%[[x]], %[[pos]]) {{.*}}: (f80, i1) -> f80 @@ -49,7 +49,7 @@ subroutine nearest_test4(x, s) ! CHECK: %[[x:.*]] = fir.load %arg0 : !fir.ref ! CHECK: %[[s:.*]] = fir.load %arg1 : !fir.ref ! CHECK: %[[zero:.*]] = arith.constant 0.000000e+00 : f128 - ! CHECK: %[[cmp:.*]] = arith.cmpf ogt, %[[s]], %[[zero]] : f128 + ! CHECK: %[[cmp:.*]] = arith.cmpf ogt, %[[s]], %[[zero]] {{.*}} : f128 ! CHECK: %[[pos:.*]] = arith.select %[[cmp]], %true, %false : i1 res = nearest(x, s) ! CHECK: %[[tmp:.*]] = fir.call @_FortranANearest16(%[[x]], %[[pos]]) {{.*}}: (f128, i1) -> f128 @@ -64,7 +64,7 @@ subroutine nearest_test5(x, s) real :: s ! CHECK: %[[s:.*]] = fir.load %arg1 : !fir.ref ! CHECK: %[[zero:.*]] = arith.constant 0.000000e+00 : f32 - ! CHECK: %[[cmp:.*]] = arith.cmpf ogt, %[[s]], %[[zero]] : f32 + ! CHECK: %[[cmp:.*]] = arith.cmpf ogt, %[[s]], %[[zero]] {{.*}} : f32 ! CHECK: %[[pos:.*]] = arith.select %[[cmp]], %true, %false : i1 res = nearest(x, s) ! CHECK: %[[tmp:.*]] = fir.call @_FortranANearest16(%[[x]], %[[pos]]) {{.*}}: (f128, i1) -> f128 diff --git a/flang/test/Lower/OpenACC/acc-reduction.f90 b/flang/test/Lower/OpenACC/acc-reduction.f90 index 73f7176cd4506..a8f7e1fa81ef7 100644 --- a/flang/test/Lower/OpenACC/acc-reduction.f90 +++ b/flang/test/Lower/OpenACC/acc-reduction.f90 @@ -24,7 +24,7 @@ ! HLFIR: %[[D2:.*]] = hlfir.designate %14 (%[[ARG0]], %[[ARG1]]) : (!fir.box>, index, index) -> !fir.ref ! HLFIR: %[[LOAD1:.*]] = fir.load %[[D1]] : !fir.ref ! HLFIR: %[[LOAD2:.*]] = fir.load %[[D2]] : !fir.ref -! HLFIR: %[[CMP:.*]] = arith.cmpf ogt, %[[LOAD1]], %[[LOAD2]] : f32 +! HLFIR: %[[CMP:.*]] = arith.cmpf ogt, %[[LOAD1]], %[[LOAD2]] {{.*}} : f32 ! HLFIR: %[[SELECT:.*]] = arith.select %[[CMP]], %[[LOAD1]], %[[LOAD2]] : f32 ! HLFIR: hlfir.yield_element %[[SELECT]] : f32 ! HLFIR: } @@ -59,7 +59,7 @@ ! HLFIR: %[[V2:.*]] = hlfir.designate %[[DES_V2]] (%[[IV]]) : (!fir.box>>, index) -> !fir.ref ! HLFIR: %[[LOAD_V1:.*]] = fir.load %[[V1]] : !fir.ref ! HLFIR: %[[LOAD_V2:.*]] = fir.load %[[V2]] : !fir.ref -! HLFIR: %[[CMP:.*]] = arith.cmpf ogt, %[[LOAD_V1]], %[[LOAD_V2]] : f32 +! HLFIR: %[[CMP:.*]] = arith.cmpf ogt, %[[LOAD_V1]], %[[LOAD_V2]] {{.*}} : f32 ! HLFIR: %[[SELECT:.*]] = arith.select %[[CMP]], %[[LOAD_V1]], %[[LOAD_V2]] : f32 ! HLFIR: hlfir.yield_element %[[SELECT]] : f32 ! HLFIR: } @@ -113,7 +113,7 @@ ! HLFIR: %[[DES_V2:.*]] = hlfir.designate %[[RIGHT]] (%{{.*}}) : (!fir.box>, index) -> !fir.ref ! HLFIR: %[[LOAD_V1:.*]] = fir.load %[[DES_V1]] : !fir.ref ! HLFIR: %[[LOAD_V2:.*]] = fir.load %[[DES_V2]] : !fir.ref -! HLFIR: %[[CMPF:.*]] = arith.cmpf ogt, %[[LOAD_V1]], %[[LOAD_V2]] : f32 +! HLFIR: %[[CMPF:.*]] = arith.cmpf ogt, %[[LOAD_V1]], %[[LOAD_V2]] {{.*}} : f32 ! HLFIR: %[[SELECT:.*]] = arith.select %[[CMPF]], %[[LOAD_V1]], %[[LOAD_V2]] : f32 ! HLFIR: hlfir.yield_element %[[SELECT]] : f32 ! HLFIR: } @@ -340,7 +340,7 @@ ! CHECK: %[[COORD2:.*]] = fir.coordinate_of %[[ARG1]], %[[IV0]] : (!fir.ref>, index) -> !fir.ref ! CHECK: %[[LOAD1:.*]] = fir.load %[[COORD1]] : !fir.ref ! CHECK: %[[LOAD2:.*]] = fir.load %[[COORD2]] : !fir.ref -! CHECK: %[[CMP:.*]] = arith.cmpf ogt, %[[LOAD1]], %[[LOAD2]] : f32 +! CHECK: %[[CMP:.*]] = arith.cmpf ogt, %[[LOAD1]], %[[LOAD2]] {{.*}} : f32 ! CHECK: %[[SELECT:.*]] = arith.select %[[CMP]], %[[LOAD1]], %[[LOAD2]] : f32 ! CHECK: fir.store %[[SELECT]] to %[[COORD1]] : !fir.ref ! CHECK: } @@ -358,7 +358,7 @@ ! CHECK: ^bb0(%[[ARG0:.*]]: !fir.ref, %[[ARG1:.*]]: !fir.ref): ! CHECK: %[[LOAD0:.*]] = fir.load %[[ARG0]] : !fir.ref ! CHECK: %[[LOAD1:.*]] = fir.load %[[ARG1]] : !fir.ref -! CHECK: %[[CMP:.*]] = arith.cmpf ogt, %[[LOAD0]], %[[LOAD1]] : f32 +! CHECK: %[[CMP:.*]] = arith.cmpf ogt, %[[LOAD0]], %[[LOAD1]] {{.*}} : f32 ! CHECK: %[[SELECT:.*]] = arith.select %[[CMP]], %[[LOAD0]], %[[LOAD1]] : f32 ! CHECK: fir.store %[[SELECT]] to %[[ARG0]] : !fir.ref ! CHECK: acc.yield %[[ARG0]] : !fir.ref @@ -431,7 +431,7 @@ ! CHECK: %[[COORD2:.*]] = fir.coordinate_of %[[ARG1]], %[[IV0]], %[[IV1]] : (!fir.ref>, index, index) -> !fir.ref ! CHECK: %[[LOAD1:.*]] = fir.load %[[COORD1]] : !fir.ref ! CHECK: %[[LOAD2:.*]] = fir.load %[[COORD2]] : !fir.ref -! CHECK: %[[CMP:.*]] = arith.cmpf olt, %[[LOAD1]], %[[LOAD2]] : f32 +! CHECK: %[[CMP:.*]] = arith.cmpf olt, %[[LOAD1]], %[[LOAD2]] {{.*}} : f32 ! CHECK: %[[SELECT:.*]] = arith.select %[[CMP]], %[[LOAD1]], %[[LOAD2]] : f32 ! CHECK: fir.store %[[SELECT]] to %[[COORD1]] : !fir.ref ! CHECK: } @@ -450,7 +450,7 @@ ! CHECK: ^bb0(%[[ARG0:.*]]: !fir.ref, %[[ARG1:.*]]: !fir.ref): ! CHECK: %[[LOAD0:.*]] = fir.load %[[ARG0]] : !fir.ref ! CHECK: %[[LOAD1:.*]] = fir.load %[[ARG1]] : !fir.ref -! CHECK: %[[CMP:.*]] = arith.cmpf olt, %[[LOAD0]], %[[LOAD1]] : f32 +! CHECK: %[[CMP:.*]] = arith.cmpf olt, %[[LOAD0]], %[[LOAD1]] {{.*}} : f32 ! CHECK: %[[SELECT:.*]] = arith.select %[[CMP]], %[[LOAD0]], %[[LOAD1]] : f32 ! CHECK: fir.store %[[SELECT]] to %[[ARG0]] : !fir.ref ! CHECK: acc.yield %[[ARG0]] : !fir.ref diff --git a/flang/test/Lower/arithmetic-goto.f90 b/flang/test/Lower/arithmetic-goto.f90 index 73f82c309d2da..7b5288f727487 100644 --- a/flang/test/Lower/arithmetic-goto.f90 +++ b/flang/test/Lower/arithmetic-goto.f90 @@ -36,10 +36,10 @@ function kagf(findex) ! CHECK: %[[V_3:[0-9]+]] = arith.addf %[[V_1]], %[[V_2]] {{.*}} : f32 ! CHECK: %[[V_4:[0-9]+]] = arith.addf %[[V_3]], %[[V_3]] {{.*}} : f32 ! CHECK: %cst = arith.constant 0.000000e+00 : f32 - ! CHECK: %[[V_5:[0-9]+]] = arith.cmpf olt, %[[V_4]], %cst : f32 + ! CHECK: %[[V_5:[0-9]+]] = arith.cmpf olt, %[[V_4]], %cst {{.*}} : f32 ! CHECK: cf.cond_br %[[V_5]], ^bb2, ^bb1 ! CHECK: ^bb1: // pred: ^bb0 - ! CHECK: %[[V_6:[0-9]+]] = arith.cmpf ogt, %[[V_4]], %cst : f32 + ! CHECK: %[[V_6:[0-9]+]] = arith.cmpf ogt, %[[V_4]], %cst {{.*}} : f32 ! CHECK: cf.cond_br %[[V_6]], ^bb4, ^bb3 ! CHECK: ^bb2: // pred: ^bb0 ! CHECK: fir.store %c1{{.*}} to %[[V_0]] : !fir.ref diff --git a/flang/test/Lower/array-elemental-calls-2.f90 b/flang/test/Lower/array-elemental-calls-2.f90 index 1d2c18f8bc7ba..c3e40f3f6d4f5 100644 --- a/flang/test/Lower/array-elemental-calls-2.f90 +++ b/flang/test/Lower/array-elemental-calls-2.f90 @@ -122,7 +122,7 @@ subroutine check_compare() ! CHECK: fir.do_loop ! CHECK: %[[VAL_25:.*]] = fir.array_fetch %{{.*}}, %{{.*}} : (!fir.array<10xf64>, index) -> f64 ! CHECK: %[[VAL_26:.*]] = fir.array_fetch %{{.*}}, %{{.*}} : (!fir.array<10xf64>, index) -> f64 -! CHECK: %[[VAL_27:.*]] = arith.cmpf olt, %[[VAL_25]], %[[VAL_26]] : f64 +! CHECK: %[[VAL_27:.*]] = arith.cmpf olt, %[[VAL_25]], %[[VAL_26]] {{.*}} : f64 ! CHECK: %[[VAL_28:.*]] = fir.convert %[[VAL_27]] : (i1) -> !fir.logical<4> ! CHECK: fir.store %[[VAL_28]] to %[[VAL_0]] : !fir.ref> ! CHECK: fir.call @_QPelem_func_logical4(%[[VAL_0]]) {{.*}}: (!fir.ref>) -> i32 diff --git a/flang/test/Lower/array-expression-slice-1.f90 b/flang/test/Lower/array-expression-slice-1.f90 index d7865a395db1c..d81b8488205e0 100644 --- a/flang/test/Lower/array-expression-slice-1.f90 +++ b/flang/test/Lower/array-expression-slice-1.f90 @@ -93,7 +93,7 @@ ! CHECK: %[[VAL_78:.*]] = fir.load %[[VAL_77]] : !fir.ref ! CHECK: %[[VAL_79:.*]] = fir.coordinate_of %[[VAL_26]], %[[VAL_19]] : (!fir.ref>, i64) -> !fir.ref ! CHECK: %[[VAL_80:.*]] = fir.load %[[VAL_79]] : !fir.ref -! CHECK: %[[VAL_81:.*]] = arith.cmpf une, %[[VAL_78]], %[[VAL_80]] : f32 +! CHECK: %[[VAL_81:.*]] = arith.cmpf une, %[[VAL_78]], %[[VAL_80]] {{.*}} : f32 ! CHECK: cond_br %[[VAL_81]], ^bb10, ^bb11 ! CHECK: ^bb10: ! CHECK: %[[VAL_82:.*]] = fir.address_of(@_QQclX{{.*}}) : !fir.ref ! CHECK: %[[VAL_96:.*]] = fir.coordinate_of %[[VAL_26]], %[[VAL_20]] : (!fir.ref>, i64) -> !fir.ref ! CHECK: %[[VAL_97:.*]] = fir.load %[[VAL_96]] : !fir.ref -! CHECK: %[[VAL_98:.*]] = arith.cmpf une, %[[VAL_95]], %[[VAL_97]] : f32 +! CHECK: %[[VAL_98:.*]] = arith.cmpf une, %[[VAL_95]], %[[VAL_97]] {{.*}} : f32 ! CHECK: cond_br %[[VAL_98]], ^bb12, ^bb13 ! CHECK: ^bb12: ! CHECK: %[[VAL_99:.*]] = fir.address_of(@_QQclX{{.*}}) : !fir.ref ! CHECK: %[[VAL_113:.*]] = fir.coordinate_of %[[VAL_26]], %[[VAL_13]] : (!fir.ref>, i64) -> !fir.ref ! CHECK: %[[VAL_114:.*]] = fir.load %[[VAL_113]] : !fir.ref -! CHECK: %[[VAL_115:.*]] = arith.cmpf une, %[[VAL_112]], %[[VAL_114]] : f32 +! CHECK: %[[VAL_115:.*]] = arith.cmpf une, %[[VAL_112]], %[[VAL_114]] {{.*}} : f32 ! CHECK: cond_br %[[VAL_115]], ^bb14, ^bb15 ! CHECK: ^bb14: ! CHECK: %[[VAL_116:.*]] = fir.address_of(@_QQclX{{.*}} : !fir.ref ! CHECK: %[[VAL_139:.*]] = fir.coordinate_of %[[VAL_27]], %[[VAL_19]] : (!fir.ref>, i64) -> !fir.ref ! CHECK: %[[VAL_140:.*]] = fir.load %[[VAL_139]] : !fir.ref -! CHECK: %[[VAL_141:.*]] = arith.cmpf une, %[[VAL_138]], %[[VAL_140]] : f32 +! CHECK: %[[VAL_141:.*]] = arith.cmpf une, %[[VAL_138]], %[[VAL_140]] {{.*}} : f32 ! CHECK: cond_br %[[VAL_141]], ^bb19, ^bb20 ! CHECK: ^bb19: ! CHECK: %[[VAL_142:.*]] = fir.address_of(@_QQclX{{.*}}) : !fir.ref ! CHECK: %[[VAL_155:.*]] = fir.coordinate_of %[[VAL_27]], %[[VAL_16]] : (!fir.ref>, i64) -> !fir.ref ! CHECK: %[[VAL_156:.*]] = fir.load %[[VAL_155]] : !fir.ref -! CHECK: %[[VAL_157:.*]] = arith.cmpf une, %[[VAL_154]], %[[VAL_156]] : f32 +! CHECK: %[[VAL_157:.*]] = arith.cmpf une, %[[VAL_154]], %[[VAL_156]] {{.*}} : f32 ! CHECK: cond_br %[[VAL_157]], ^bb21, ^bb22 ! CHECK: ^bb21: ! CHECK: %[[VAL_158:.*]] = fir.address_of(@_QQclX{{.*}}) : !fir.ref ! CHECK: %[[VAL_171:.*]] = fir.coordinate_of %[[VAL_27]], %[[VAL_8]] : (!fir.ref>, i64) -> !fir.ref ! CHECK: %[[VAL_172:.*]] = fir.load %[[VAL_171]] : !fir.ref -! CHECK: %[[VAL_173:.*]] = arith.cmpf une, %[[VAL_170]], %[[VAL_172]] : f32 +! CHECK: %[[VAL_173:.*]] = arith.cmpf une, %[[VAL_170]], %[[VAL_172]] {{.*}} : f32 ! CHECK: cond_br %[[VAL_173]], ^bb23, ^bb24 ! CHECK: ^bb23: ! CHECK: %[[VAL_174:.*]] = fir.address_of(@_QQclX{{.*}}) : !fir.ref> ! CHECK: %[[VAL_224:.*]] = fir.load %[[VAL_77]] : !fir.ref ! CHECK: %[[VAL_225:.*]] = fir.load %[[VAL_96]] : !fir.ref -! CHECK: %[[VAL_226:.*]] = arith.cmpf une, %[[VAL_224]], %[[VAL_225]] : f32 +! CHECK: %[[VAL_226:.*]] = arith.cmpf une, %[[VAL_224]], %[[VAL_225]] {{.*}} : f32 ! CHECK: cond_br %[[VAL_226]], ^bb35, ^bb36 ! CHECK: ^bb35: ! CHECK: %[[VAL_227:.*]] = fir.address_of(@_QQclX{{.*}}) : !fir.ref ! CHECK: %[[VAL_240:.*]] = fir.load %[[VAL_113]] : !fir.ref -! CHECK: %[[VAL_241:.*]] = arith.cmpf une, %[[VAL_239]], %[[VAL_240]] : f32 +! CHECK: %[[VAL_241:.*]] = arith.cmpf une, %[[VAL_239]], %[[VAL_240]] {{.*}} : f32 ! CHECK: cond_br %[[VAL_241]], ^bb37, ^bb38 ! CHECK: ^bb37: ! CHECK: %[[VAL_242:.*]] = fir.address_of(@_QQclX{{.*}}) : !fir.ref ! CHECK: %[[VAL_255:.*]] = fir.load %[[VAL_79]] : !fir.ref -! CHECK: %[[VAL_256:.*]] = arith.cmpf une, %[[VAL_254]], %[[VAL_255]] : f32 +! CHECK: %[[VAL_256:.*]] = arith.cmpf une, %[[VAL_254]], %[[VAL_255]] {{.*}} : f32 ! CHECK: cond_br %[[VAL_256]], ^bb39, ^bb40 ! CHECK: ^bb39: ! CHECK: %[[VAL_257:.*]] = fir.address_of(@_QQclX{{.*}}) : !fir.ref (!fir.array<100xf32>) { ! CHECK: %[[V_11:[0-9]+]] = fir.array_fetch %[[V_8]], %arg1 : (!fir.array<100xf32>, index) -> f32 -! CHECK: %[[V_12:[0-9]+]] = arith.cmpf olt, %[[V_11]], %[[C_st]] : f32 +! CHECK: %[[V_12:[0-9]+]] = arith.cmpf olt, %[[V_11]], %[[C_st]] {{.*}} : f32 ! CHECK: %[[V_13:[0-9]+]]:2 = fir.array_modify %arg2, %arg1 : (!fir.array<100xf32>, index) -> (!fir.ref, !fir.array<100xf32>) ! CHECK: %[[V_14:[0-9]+]] = fir.convert %[[V_12:[0-9]+]] : (i1) -> !fir.logical<4> ! CHECK: fir.store %[[V_14]] to %[[V_0:[0-9]+]] : !fir.ref> @@ -267,7 +267,7 @@ elemental subroutine sto_char(a,b) ! CHECK: %[[V_11:[0-9]+]] = arith.subi %[[V_10]], %[[C_1_0]] : index ! CHECK: %[[V_12:[0-9]+]] = fir.array_fetch %[[V_5]], %[[V_11:[0-9]+]] : (!fir.array<10xf32>, index) -> f32 ! CHECK: %[[C_st:[-0-9a-z_]+]] = arith.constant 0.000000e+00 : f32 -! CHECK: %[[V_13:[0-9]+]] = arith.cmpf olt, %[[V_12]], %[[C_st]] : f32 +! CHECK: %[[V_13:[0-9]+]] = arith.cmpf olt, %[[V_12]], %[[C_st]] {{.*}} : f32 ! CHECK: %[[C_1_1:[-0-9a-z_]+]] = arith.constant 1 : index ! CHECK: %[[V_14:[0-9]+]] = fir.load %[[V_1:[0-9]+]] : !fir.ref ! CHECK: %[[V_15:[0-9]+]] = fir.convert %[[V_14:[0-9]+]] : (i32) -> i64 @@ -372,7 +372,7 @@ elemental subroutine sto_char(a,b) ! CHECK: %[[V_18:[0-9]+]] = fir.convert %[[V_17:[0-9]+]] : (!fir.logical<4>) -> i1 ! CHECK: %[[V_19:[0-9]+]] = fir.if %[[V_18]] -> (!fir.array<10xf32>) { ! CHECK: %[[V_20:[0-9]+]] = fir.array_fetch %[[V_12]], %arg3 : (!fir.array<10xf32>, index) -> f32 -! CHECK: %[[V_21:[0-9]+]] = arith.cmpf olt, %[[V_20]], %[[C_st]] : f32 +! CHECK: %[[V_21:[0-9]+]] = arith.cmpf olt, %[[V_20]], %[[C_st]] {{.*}} : f32 ! CHECK: %[[V_22:[0-9]+]]:2 = fir.array_modify %arg4, %arg3 : (!fir.array<10xf32>, index) -> (!fir.ref, !fir.array<10xf32>) ! CHECK: %[[V_23:[0-9]+]] = fir.convert %[[V_21:[0-9]+]] : (i1) -> !fir.logical<4> ! CHECK: fir.store %[[V_23]] to %[[V_0:[0-9]+]] : !fir.ref> diff --git a/flang/test/Lower/forall/forall-construct.f90 b/flang/test/Lower/forall/forall-construct.f90 index 4d2d2d8764e77..6d4dad580ec96 100644 --- a/flang/test/Lower/forall/forall-construct.f90 +++ b/flang/test/Lower/forall/forall-construct.f90 @@ -60,7 +60,7 @@ end subroutine test_forall_construct ! CHECK: %[[VAL_48:.*]] = fir.coordinate_of %[[VAL_1]], %[[VAL_43]], %[[VAL_47]] : (!fir.box>, i64, i64) -> !fir.ref ! CHECK: %[[VAL_49:.*]] = fir.load %[[VAL_48]] : !fir.ref ! CHECK: %[[VAL_50:.*]] = arith.constant 0.000000e+00 : f32 -! CHECK: %[[VAL_51:.*]] = arith.cmpf ogt, %[[VAL_49]], %[[VAL_50]] : f32 +! CHECK: %[[VAL_51:.*]] = arith.cmpf ogt, %[[VAL_49]], %[[VAL_50]] {{.*}} : f32 ! CHECK: %[[VAL_52:.*]] = fir.if %[[VAL_51]] -> (!fir.array) { ! CHECK: %[[VAL_53:.*]] = arith.constant 1 : index ! CHECK: %[[VAL_54:.*]] = fir.load %[[VAL_2]] : !fir.ref diff --git a/flang/test/Lower/forall/forall-where.f90 b/flang/test/Lower/forall/forall-where.f90 index 56bce6fc4fc2e..af309e63535fa 100644 --- a/flang/test/Lower/forall/forall-where.f90 +++ b/flang/test/Lower/forall/forall-where.f90 @@ -172,7 +172,7 @@ end subroutine test_nested_forall_where ! CHECK: %[[VAL_141:.*]] = arith.subi %[[VAL_114]], %[[VAL_139]] : index ! CHECK: %[[VAL_142:.*]] = fir.do_loop %[[VAL_143:.*]] = %[[VAL_140]] to %[[VAL_141]] step %[[VAL_139]] unordered iter_args(%[[VAL_144:.*]] = %[[VAL_122]]) -> (!fir.array) { ! CHECK: %[[VAL_145:.*]] = fir.array_fetch %[[VAL_116]], %[[VAL_143]] : (!fir.array<100xf32>, index) -> f32 -! CHECK: %[[VAL_146:.*]] = arith.cmpf ogt, %[[VAL_145]], %[[VAL_117]] : f32 +! CHECK: %[[VAL_146:.*]] = arith.cmpf ogt, %[[VAL_145]], %[[VAL_117]] {{.*}} : f32 ! CHECK: %[[VAL_147:.*]] = arith.constant 1 : i32 ! CHECK: %[[VAL_148:.*]] = fir.coordinate_of %[[VAL_102]], %[[VAL_147]] : (!fir.ref>, !fir.heap>>>, i32) -> !fir.ref>> ! CHECK: %[[VAL_149:.*]] = fir.load %[[VAL_148]] : !fir.ref>> diff --git a/flang/test/Lower/host-associated.f90 b/flang/test/Lower/host-associated.f90 index e2db6deb8803d..073493d7fe28a 100644 --- a/flang/test/Lower/host-associated.f90 +++ b/flang/test/Lower/host-associated.f90 @@ -70,7 +70,7 @@ subroutine test2_inner ! CHECK: %[[bb:.*]] = fir.load %[[b]] : !fir.llvm_ptr> ! CHECK-DAG: %[[bd:.*]] = fir.load %[[bb]] : !fir.ref ! CHECK-DAG: %[[ad:.*]] = fir.load %[[aa]] : !fir.ref - ! CHECK: %{{.*}} = arith.cmpf ogt, %[[ad]], %[[bd]] : f32 + ! CHECK: %{{.*}} = arith.cmpf ogt, %[[ad]], %[[bd]] {{.*}} : f32 if (a > b) then b = b + 2.0 end if diff --git a/flang/test/Lower/real-operations-2.f90 b/flang/test/Lower/real-operations-2.f90 index 0323f201f9dde..b8859e9524073 100644 --- a/flang/test/Lower/real-operations-2.f90 +++ b/flang/test/Lower/real-operations-2.f90 @@ -8,7 +8,7 @@ LOGICAL FUNCTION eq0_test(x0, x1) REAL(4) :: x1 ! CHECK-DAG:[[reg1:%[0-9]+]] = fir.load %arg0 ! CHECK-DAG:[[reg2:%[0-9]+]] = fir.load %arg1 -! CHECK:[[reg3:%[0-9]+]] = arith.cmpf oeq, [[reg1]], [[reg2]] : f32 +! CHECK:[[reg3:%[0-9]+]] = arith.cmpf oeq, [[reg1]], [[reg2]] {{.*}} : f32 ! CHECK:fir.convert [[reg3]] {{.*}} -> !fir.logical<4> eq0_test = x0 .EQ. x1 END FUNCTION @@ -19,7 +19,7 @@ LOGICAL FUNCTION ne1_test(x0, x1) REAL(4) :: x1 ! CHECK-DAG:[[reg1:%[0-9]+]] = fir.load %arg0 ! CHECK-DAG:[[reg2:%[0-9]+]] = fir.load %arg1 -! CHECK:[[reg3:%[0-9]+]] = arith.cmpf une, [[reg1]], [[reg2]] : f32 +! CHECK:[[reg3:%[0-9]+]] = arith.cmpf une, [[reg1]], [[reg2]] {{.*}} : f32 ! CHECK:fir.convert [[reg3]] {{.*}} -> !fir.logical<4> ne1_test = x0 .NE. x1 END FUNCTION @@ -30,7 +30,7 @@ LOGICAL FUNCTION lt2_test(x0, x1) REAL(4) :: x1 ! CHECK-DAG:[[reg1:%[0-9]+]] = fir.load %arg0 ! CHECK-DAG:[[reg2:%[0-9]+]] = fir.load %arg1 -! CHECK:[[reg3:%[0-9]+]] = arith.cmpf olt, [[reg1]], [[reg2]] : f32 +! CHECK:[[reg3:%[0-9]+]] = arith.cmpf olt, [[reg1]], [[reg2]] {{.*}} : f32 ! CHECK:fir.convert [[reg3]] {{.*}} -> !fir.logical<4> lt2_test = x0 .LT. x1 END FUNCTION @@ -41,7 +41,7 @@ LOGICAL FUNCTION le3_test(x0, x1) REAL(4) :: x1 ! CHECK-DAG:[[reg1:%[0-9]+]] = fir.load %arg0 ! CHECK-DAG:[[reg2:%[0-9]+]] = fir.load %arg1 -! CHECK:[[reg3:%[0-9]+]] = arith.cmpf ole, [[reg1]], [[reg2]] : f32 +! CHECK:[[reg3:%[0-9]+]] = arith.cmpf ole, [[reg1]], [[reg2]] {{.*}} : f32 ! CHECK:fir.convert [[reg3]] {{.*}} -> !fir.logical<4> le3_test = x0 .LE. x1 END FUNCTION @@ -52,7 +52,7 @@ LOGICAL FUNCTION gt4_test(x0, x1) REAL(4) :: x1 ! CHECK-DAG:[[reg1:%[0-9]+]] = fir.load %arg0 ! CHECK-DAG:[[reg2:%[0-9]+]] = fir.load %arg1 -! CHECK:[[reg3:%[0-9]+]] = arith.cmpf ogt, [[reg1]], [[reg2]] : f32 +! CHECK:[[reg3:%[0-9]+]] = arith.cmpf ogt, [[reg1]], [[reg2]] {{.*}} : f32 ! CHECK:fir.convert [[reg3]] {{.*}} -> !fir.logical<4> gt4_test = x0 .GT. x1 END FUNCTION @@ -63,7 +63,7 @@ LOGICAL FUNCTION ge5_test(x0, x1) REAL(4) :: x1 ! CHECK-DAG:[[reg1:%[0-9]+]] = fir.load %arg0 ! CHECK-DAG:[[reg2:%[0-9]+]] = fir.load %arg1 -! CHECK:[[reg3:%[0-9]+]] = arith.cmpf oge, [[reg1]], [[reg2]] : f32 +! CHECK:[[reg3:%[0-9]+]] = arith.cmpf oge, [[reg1]], [[reg2]] {{.*}} : f32 ! CHECK:fir.convert [[reg3]] {{.*}} -> !fir.logical<4> ge5_test = x0 .GE. x1 END FUNCTION diff --git a/flang/test/Lower/where.f90 b/flang/test/Lower/where.f90 index 117371b19ddaf..277cead48f486 100644 --- a/flang/test/Lower/where.f90 +++ b/flang/test/Lower/where.f90 @@ -17,7 +17,7 @@ ! CHECK: %[[VAL_14:.*]] = arith.subi %[[VAL_5]], %[[VAL_12]] : index ! CHECK: %[[VAL_15:.*]] = fir.do_loop %[[VAL_16:.*]] = %[[VAL_13]] to %[[VAL_14]] step %[[VAL_12]] unordered iter_args(%[[VAL_17:.*]] = %[[VAL_11]]) -> (!fir.array<10x!fir.logical<4>>) { ! CHECK: %[[VAL_18:.*]] = fir.array_fetch %[[VAL_7]], %[[VAL_16]] : (!fir.array<10xf32>, index) -> f32 - ! CHECK: %[[VAL_19:.*]] = arith.cmpf ogt, %[[VAL_18]], %[[VAL_8]] : f32 + ! CHECK: %[[VAL_19:.*]] = arith.cmpf ogt, %[[VAL_18]], %[[VAL_8]] {{.*}} : f32 ! CHECK: %[[VAL_20:.*]] = fir.convert %[[VAL_19]] : (i1) -> !fir.logical<4> ! CHECK: %[[VAL_21:.*]] = fir.array_update %[[VAL_17]], %[[VAL_20]], %[[VAL_16]] : (!fir.array<10x!fir.logical<4>>, !fir.logical<4>, index) -> !fir.array<10x!fir.logical<4>> ! CHECK: fir.result %[[VAL_21]] : !fir.array<10x!fir.logical<4>> @@ -61,7 +61,7 @@ ! CHECK: %[[VAL_55:.*]] = arith.subi %[[VAL_46]], %[[VAL_53]] : index ! CHECK: %[[VAL_56:.*]] = fir.do_loop %[[VAL_57:.*]] = %[[VAL_54]] to %[[VAL_55]] step %[[VAL_53]] unordered iter_args(%[[VAL_58:.*]] = %[[VAL_52]]) -> (!fir.array<10x!fir.logical<4>>) { ! CHECK: %[[VAL_59:.*]] = fir.array_fetch %[[VAL_48]], %[[VAL_57]] : (!fir.array<10xf32>, index) -> f32 - ! CHECK: %[[VAL_60:.*]] = arith.cmpf ogt, %[[VAL_59]], %[[VAL_49]] : f32 + ! CHECK: %[[VAL_60:.*]] = arith.cmpf ogt, %[[VAL_59]], %[[VAL_49]] {{.*}} : f32 ! CHECK: %[[VAL_61:.*]] = fir.convert %[[VAL_60]] : (i1) -> !fir.logical<4> ! CHECK: %[[VAL_62:.*]] = fir.array_update %[[VAL_58]], %[[VAL_61]], %[[VAL_57]] : (!fir.array<10x!fir.logical<4>>, !fir.logical<4>, index) -> !fir.array<10x!fir.logical<4>> ! CHECK: fir.result %[[VAL_62]] : !fir.array<10x!fir.logical<4>> @@ -105,7 +105,7 @@ ! CHECK: %[[VAL_97:.*]] = arith.subi %[[VAL_88]], %[[VAL_95]] : index ! CHECK: %[[VAL_98:.*]] = fir.do_loop %[[VAL_99:.*]] = %[[VAL_96]] to %[[VAL_97]] step %[[VAL_95]] unordered iter_args(%[[VAL_100:.*]] = %[[VAL_94]]) -> (!fir.array<10x!fir.logical<4>>) { ! CHECK: %[[VAL_101:.*]] = fir.array_fetch %[[VAL_90]], %[[VAL_99]] : (!fir.array<10xf32>, index) -> f32 - ! CHECK: %[[VAL_102:.*]] = arith.cmpf ogt, %[[VAL_101]], %[[VAL_91]] : f32 + ! CHECK: %[[VAL_102:.*]] = arith.cmpf ogt, %[[VAL_101]], %[[VAL_91]] {{.*}} : f32 ! CHECK: %[[VAL_103:.*]] = fir.convert %[[VAL_102]] : (i1) -> !fir.logical<4> ! CHECK: %[[VAL_104:.*]] = fir.array_update %[[VAL_100]], %[[VAL_103]], %[[VAL_99]] : (!fir.array<10x!fir.logical<4>>, !fir.logical<4>, index) -> !fir.array<10x!fir.logical<4>> ! CHECK: fir.result %[[VAL_104]] : !fir.array<10x!fir.logical<4>> diff --git a/flang/test/Transforms/simplifyintrinsics.fir b/flang/test/Transforms/simplifyintrinsics.fir index 8cb2dcfe31d78..39483a9cc18fe 100644 --- a/flang/test/Transforms/simplifyintrinsics.fir +++ b/flang/test/Transforms/simplifyintrinsics.fir @@ -2028,7 +2028,7 @@ func.func @_QPtestminloc_works1d_scalarmask_f64(%arg0: !fir.ref (f64) { // CHECK: %[[INARR_ITEM:.*]] = fir.coordinate_of %[[BOX_INARR]], %[[ITER]] : (!fir.box>, index) -> !fir.ref // CHECK: %[[INARR_ITEMVAL:.*]] = fir.load %[[INARR_ITEM]] : !fir.ref -// CHECK: %[[NEW_MIN:.*]] = arith.cmpf olt, %[[INARR_ITEMVAL]], %[[MIN]] : f64 +// CHECK: %[[NEW_MIN:.*]] = arith.cmpf olt, %[[INARR_ITEMVAL]], %[[MIN]] fastmath<{{.*}}> : f64 // CHECK: %[[IF_NEW_MIN:.*]] = fir.if %[[NEW_MIN]] -> (f64) { // CHECK: %[[ONE:.*]] = arith.constant 1 : i32 // CHECK: %[[OUTARR_IDX:.*]] = arith.constant 0 : index @@ -2048,7 +2048,7 @@ func.func @_QPtestminloc_works1d_scalarmask_f64(%arg0: !fir.ref : f64 // CHECK: fir.if %[[INIT_NOT_CHANGED]] { // CHECK: %[[FLAG_OUTARR_IDX:.*]] = arith.constant 0 : index // CHECK: %[[FLAG_OUTARR_ITEM:.*]] = fir.coordinate_of %[[BOX_OUTARR]], %[[FLAG_OUTARR_IDX]] : (!fir.box>>, index) -> !fir.ref diff --git a/mlir/include/mlir/Dialect/Arith/IR/ArithOps.td b/mlir/include/mlir/Dialect/Arith/IR/ArithOps.td index 38cce99679e99..02e0b7980c107 100644 --- a/mlir/include/mlir/Dialect/Arith/IR/ArithOps.td +++ b/mlir/include/mlir/Dialect/Arith/IR/ArithOps.td @@ -1368,7 +1368,8 @@ def Arith_CmpIOp // CmpFOp //===----------------------------------------------------------------------===// -def Arith_CmpFOp : Arith_CompareOp<"cmpf"> { +def Arith_CmpFOp : Arith_CompareOp<"cmpf", + [DeclareOpInterfaceMethods]> { let summary = "floating-point comparison operation"; let description = [{ The `cmpf` operation compares its two operands according to the float @@ -1398,14 +1399,27 @@ def Arith_CmpFOp : Arith_CompareOp<"cmpf"> { let arguments = (ins Arith_CmpFPredicateAttr:$predicate, FloatLike:$lhs, - FloatLike:$rhs); + FloatLike:$rhs, + DefaultValuedAttr< + Arith_FastMathAttr, "::mlir::arith::FastMathFlags::none">:$fastmath); let extraClassDeclaration = [{ static arith::CmpFPredicate getPredicateByName(StringRef name); }]; + let builders = [ + OpBuilder<(ins "::mlir::arith::CmpFPredicateAttr":$predicate, + "Value":$lhs, "Value":$rhs), [{ + build($_builder, $_state, predicate, lhs, rhs, + mlir::arith::FastMathFlagsAttr::get($_builder.getContext(), + mlir::arith::FastMathFlags::none)); + }]> + ]; + let hasFolder = 1; let hasCanonicalizer = 1; + let assemblyFormat = [{ $predicate `,` $lhs `,` $rhs (`fastmath` `` $fastmath^)? + attr-dict `:` type($lhs)}]; } //===----------------------------------------------------------------------===// diff --git a/mlir/lib/Conversion/ArithToLLVM/ArithToLLVM.cpp b/mlir/lib/Conversion/ArithToLLVM/ArithToLLVM.cpp index 337f2dbcbe4ed..5e4213cc4e874 100644 --- a/mlir/lib/Conversion/ArithToLLVM/ArithToLLVM.cpp +++ b/mlir/lib/Conversion/ArithToLLVM/ArithToLLVM.cpp @@ -13,6 +13,7 @@ #include "mlir/Conversion/LLVMCommon/ConversionTarget.h" #include "mlir/Conversion/LLVMCommon/VectorPattern.h" #include "mlir/Dialect/Arith/IR/Arith.h" +#include "mlir/Dialect/LLVMIR/LLVMAttrs.h" #include "mlir/Dialect/LLVMIR/LLVMDialect.h" #include "mlir/IR/TypeUtilities.h" #include "mlir/Pass/Pass.h" @@ -394,13 +395,15 @@ CmpFOpLowering::matchAndRewrite(arith::CmpFOp op, OpAdaptor adaptor, ConversionPatternRewriter &rewriter) const { Type operandType = adaptor.getLhs().getType(); Type resultType = op.getResult().getType(); + LLVM::FastmathFlags fmf = + arith::convertArithFastMathFlagsToLLVM(op.getFastmath()); // Handle the scalar and 1D vector cases. if (!isa(operandType)) { rewriter.replaceOpWithNewOp( op, typeConverter->convertType(resultType), convertCmpPredicate(op.getPredicate()), - adaptor.getLhs(), adaptor.getRhs()); + adaptor.getLhs(), adaptor.getRhs(), fmf); return success(); } @@ -414,7 +417,7 @@ CmpFOpLowering::matchAndRewrite(arith::CmpFOp op, OpAdaptor adaptor, return rewriter.create( op.getLoc(), llvm1DVectorTy, convertCmpPredicate(op.getPredicate()), - adaptor.getLhs(), adaptor.getRhs()); + adaptor.getLhs(), adaptor.getRhs(), fmf); }, rewriter); } diff --git a/mlir/test/Conversion/ArithToLLVM/arith-to-llvm.mlir b/mlir/test/Conversion/ArithToLLVM/arith-to-llvm.mlir index 6f614b113788c..e16dbb5661058 100644 --- a/mlir/test/Conversion/ArithToLLVM/arith-to-llvm.mlir +++ b/mlir/test/Conversion/ArithToLLVM/arith-to-llvm.mlir @@ -330,6 +330,7 @@ func.func @fcmp(f32, f32) -> () { // CHECK-NEXT: llvm.fcmp "ule" %arg0, %arg1 : f32 // CHECK-NEXT: llvm.fcmp "une" %arg0, %arg1 : f32 // CHECK-NEXT: llvm.fcmp "uno" %arg0, %arg1 : f32 + // CHECK-NEXT: llvm.fcmp "oeq" %arg0, %arg1 {fastmathFlags = #llvm.fastmath} : f32 // CHECK-NEXT: return %1 = arith.cmpf oeq, %arg0, %arg1 : f32 %2 = arith.cmpf ogt, %arg0, %arg1 : f32 @@ -346,6 +347,8 @@ func.func @fcmp(f32, f32) -> () { %13 = arith.cmpf une, %arg0, %arg1 : f32 %14 = arith.cmpf uno, %arg0, %arg1 : f32 + %15 = arith.cmpf oeq, %arg0, %arg1 {fastmath = #arith.fastmath} : f32 + return } diff --git a/mlir/test/Dialect/Arith/ops.mlir b/mlir/test/Dialect/Arith/ops.mlir index 88cc0072c7c57..6e10e540d1d17 100644 --- a/mlir/test/Dialect/Arith/ops.mlir +++ b/mlir/test/Dialect/Arith/ops.mlir @@ -1118,6 +1118,8 @@ func.func @fastmath(%arg0: f32, %arg1: f32, %arg2: i32) { %7 = arith.addf %arg0, %arg1 fastmath : f32 // CHECK: {{.*}} = arith.mulf %arg0, %arg1 fastmath : f32 %8 = arith.mulf %arg0, %arg1 fastmath : f32 +// CHECK: {{.*}} = arith.cmpf oeq, %arg0, %arg1 fastmath : f32 + %9 = arith.cmpf oeq, %arg0, %arg1 fastmath : f32 return }