[Mlir-commits] [mlir] Fix Android build failure in InferIntRangeCommon (PR #96154)

Thomas Preud'homme llvmlistbot at llvm.org
Thu Jun 20 02:54:18 PDT 2024


https://github.com/RoboTux created https://github.com/llvm/llvm-project/pull/96154

As of today, Android's libcxx is missing C++17's std::function's CTAD
added in e1eabcdfad89f67ae575b0c86aa4a72d277378b4. This leads to
InferIntRangeCommon.cpp to fail to compile. This commit makes the
template parameter of std::function in that function explicit, therefore
avoiding CTAD. While LLVM/MLIR's requirement is C++17, the rest of the
code builds fine so hopefully this is acceptable.


>From 37eb39861222c554bbd45adeeff4cb21011456c8 Mon Sep 17 00:00:00 2001
From: Thomas Preud'homme <thomas.preudhomme at arm.com>
Date: Thu, 20 Jun 2024 09:54:22 +0100
Subject: [PATCH] Fix Android build failure in InferIntRangeCommon

As of today, Android's libcxx is missing C++17's std::function's CTAD
added in e1eabcdfad89f67ae575b0c86aa4a72d277378b4. This leads to
InferIntRangeCommon.cpp to fail to compile. This commit makes the
template parameter of std::function in that function explicit, therefore
avoiding CTAD. While LLVM/MLIR's requirement is C++17, the rest of the
code builds fine so hopefully this is acceptable.

Change-Id: I78517af440e8b8bcca62f5176e8e3aa437a0d314
---
 .../Interfaces/Utils/InferIntRangeCommon.cpp  | 34 ++++++++++---------
 1 file changed, 18 insertions(+), 16 deletions(-)

diff --git a/mlir/lib/Interfaces/Utils/InferIntRangeCommon.cpp b/mlir/lib/Interfaces/Utils/InferIntRangeCommon.cpp
index 5b8d35e7bd519..ca3631d53bda9 100644
--- a/mlir/lib/Interfaces/Utils/InferIntRangeCommon.cpp
+++ b/mlir/lib/Interfaces/Utils/InferIntRangeCommon.cpp
@@ -35,6 +35,8 @@ using namespace mlir;
 /// constants and returns std::nullopt on overflow.
 using ConstArithFn =
     function_ref<std::optional<APInt>(const APInt &, const APInt &)>;
+using ConstArithStdFn =
+    std::function<std::optional<APInt>(const APInt &, const APInt &)>;
 
 /// Compute op(minLeft, minRight) and op(maxLeft, maxRight) if possible,
 /// If either computation overflows, make the result unbounded.
@@ -182,16 +184,16 @@ mlir::intrange::inferAdd(ArrayRef<ConstantIntRanges> argRanges,
                          OverflowFlags ovfFlags) {
   const ConstantIntRanges &lhs = argRanges[0], &rhs = argRanges[1];
 
-  std::function uadd = [=](const APInt &a,
-                           const APInt &b) -> std::optional<APInt> {
+  ConstArithStdFn uadd = [=](const APInt &a,
+                             const APInt &b) -> std::optional<APInt> {
     bool overflowed = false;
     APInt result = any(ovfFlags & OverflowFlags::Nuw)
                        ? a.uadd_sat(b)
                        : a.uadd_ov(b, overflowed);
     return overflowed ? std::optional<APInt>() : result;
   };
-  std::function sadd = [=](const APInt &a,
-                           const APInt &b) -> std::optional<APInt> {
+  ConstArithStdFn sadd = [=](const APInt &a,
+                             const APInt &b) -> std::optional<APInt> {
     bool overflowed = false;
     APInt result = any(ovfFlags & OverflowFlags::Nsw)
                        ? a.sadd_sat(b)
@@ -215,16 +217,16 @@ mlir::intrange::inferSub(ArrayRef<ConstantIntRanges> argRanges,
                          OverflowFlags ovfFlags) {
   const ConstantIntRanges &lhs = argRanges[0], &rhs = argRanges[1];
 
-  std::function usub = [=](const APInt &a,
-                           const APInt &b) -> std::optional<APInt> {
+  ConstArithStdFn usub = [=](const APInt &a,
+                             const APInt &b) -> std::optional<APInt> {
     bool overflowed = false;
     APInt result = any(ovfFlags & OverflowFlags::Nuw)
                        ? a.usub_sat(b)
                        : a.usub_ov(b, overflowed);
     return overflowed ? std::optional<APInt>() : result;
   };
-  std::function ssub = [=](const APInt &a,
-                           const APInt &b) -> std::optional<APInt> {
+  ConstArithStdFn ssub = [=](const APInt &a,
+                             const APInt &b) -> std::optional<APInt> {
     bool overflowed = false;
     APInt result = any(ovfFlags & OverflowFlags::Nsw)
                        ? a.ssub_sat(b)
@@ -247,16 +249,16 @@ mlir::intrange::inferMul(ArrayRef<ConstantIntRanges> argRanges,
                          OverflowFlags ovfFlags) {
   const ConstantIntRanges &lhs = argRanges[0], &rhs = argRanges[1];
 
-  std::function umul = [=](const APInt &a,
-                           const APInt &b) -> std::optional<APInt> {
+  ConstArithStdFn umul = [=](const APInt &a,
+                             const APInt &b) -> std::optional<APInt> {
     bool overflowed = false;
     APInt result = any(ovfFlags & OverflowFlags::Nuw)
                        ? a.umul_sat(b)
                        : a.umul_ov(b, overflowed);
     return overflowed ? std::optional<APInt>() : result;
   };
-  std::function smul = [=](const APInt &a,
-                           const APInt &b) -> std::optional<APInt> {
+  ConstArithStdFn smul = [=](const APInt &a,
+                             const APInt &b) -> std::optional<APInt> {
     bool overflowed = false;
     APInt result = any(ovfFlags & OverflowFlags::Nsw)
                        ? a.smul_sat(b)
@@ -565,16 +567,16 @@ mlir::intrange::inferShl(ArrayRef<ConstantIntRanges> argRanges,
 
   // The signed/unsigned overflow behavior of shl by `rhs` matches a mul with
   // 2^rhs.
-  std::function ushl = [=](const APInt &l,
-                           const APInt &r) -> std::optional<APInt> {
+  ConstArithStdFn ushl = [=](const APInt &l,
+                             const APInt &r) -> std::optional<APInt> {
     bool overflowed = false;
     APInt result = any(ovfFlags & OverflowFlags::Nuw)
                        ? l.ushl_sat(r)
                        : l.ushl_ov(r, overflowed);
     return overflowed ? std::optional<APInt>() : result;
   };
-  std::function sshl = [=](const APInt &l,
-                           const APInt &r) -> std::optional<APInt> {
+  ConstArithStdFn sshl = [=](const APInt &l,
+                             const APInt &r) -> std::optional<APInt> {
     bool overflowed = false;
     APInt result = any(ovfFlags & OverflowFlags::Nsw)
                        ? l.sshl_sat(r)



More information about the Mlir-commits mailing list