[llvm] [ConstraintElim] Don't decompose values wider than 64 bits (PR #68803)
Nikita Popov via llvm-commits
llvm-commits at lists.llvm.org
Wed Oct 11 07:09:24 PDT 2023
https://github.com/nikic created https://github.com/llvm/llvm-project/pull/68803
Our coefficients are 64-bits, so adding/multiplying them can wrap in 64-bits even if there would be no wrapping the full bit width.
The alternative would be to check for overflows during all adds/muls in decomposition. I assume that we don't particularly care about handling wide integers here, so I've opted to bail out.
Fixes https://github.com/llvm/llvm-project/issues/68751.
>From 9f7b64baf43a8ac3b48a43b961e7982667d3f525 Mon Sep 17 00:00:00 2001
From: Nikita Popov <npopov at redhat.com>
Date: Wed, 11 Oct 2023 16:06:29 +0200
Subject: [PATCH] [ConstraintElim] Don't decompose values wider than 64 bits
Our coefficients are 64-bits, so adding/multiplying them can
wrap in 64-bits even if there would be no wrapping the full
bit width.
The alternative would be to check for overflows during all
adds/muls in decomposition. I assume that we don't particularly
care about handling wide integers here, so I've opted to bail out.
Fixes https://github.com/llvm/llvm-project/issues/68751.
---
.../Transforms/Scalar/ConstraintElimination.cpp | 16 +++++++++++++---
.../ConstraintElimination/large-constant-ints.ll | 8 +++++---
.../test/Transforms/ConstraintElimination/shl.ll | 3 ++-
3 files changed, 20 insertions(+), 7 deletions(-)
diff --git a/llvm/lib/Transforms/Scalar/ConstraintElimination.cpp b/llvm/lib/Transforms/Scalar/ConstraintElimination.cpp
index 1eb7e481d43cd2b..37f720ec40f4e54 100644
--- a/llvm/lib/Transforms/Scalar/ConstraintElimination.cpp
+++ b/llvm/lib/Transforms/Scalar/ConstraintElimination.cpp
@@ -451,6 +451,19 @@ static Decomposition decompose(Value *V,
return ResA;
};
+ Type *Ty = V->getType()->getScalarType();
+ if (Ty->isPointerTy() && !IsSigned) {
+ if (auto *GEP = dyn_cast<GEPOperator>(V))
+ return decomposeGEP(*GEP, Preconditions, IsSigned, DL);
+ return V;
+ }
+
+ // Don't handle integers > 64 bit. Our coefficients are 64-bit large, so
+ // coefficient add/mul may wrap, while the operation in the full bit width
+ // would not.
+ if (!Ty->isIntegerTy() || Ty->getIntegerBitWidth() > 64)
+ return V;
+
// Decompose \p V used with a signed predicate.
if (IsSigned) {
if (auto *CI = dyn_cast<ConstantInt>(V)) {
@@ -478,9 +491,6 @@ static Decomposition decompose(Value *V,
return int64_t(CI->getZExtValue());
}
- if (auto *GEP = dyn_cast<GEPOperator>(V))
- return decomposeGEP(*GEP, Preconditions, IsSigned, DL);
-
Value *Op0;
bool IsKnownNonNegative = false;
if (match(V, m_ZExt(m_Value(Op0)))) {
diff --git a/llvm/test/Transforms/ConstraintElimination/large-constant-ints.ll b/llvm/test/Transforms/ConstraintElimination/large-constant-ints.ll
index 6b616aa700330a9..9568b155af13ae9 100644
--- a/llvm/test/Transforms/ConstraintElimination/large-constant-ints.ll
+++ b/llvm/test/Transforms/ConstraintElimination/large-constant-ints.ll
@@ -96,6 +96,7 @@ else:
ret i1 false
}
+; TODO: This could be folded.
define i1 @sub_decomp_i80(i80 %a) {
; CHECK-LABEL: @sub_decomp_i80(
; CHECK-NEXT: entry:
@@ -104,7 +105,8 @@ define i1 @sub_decomp_i80(i80 %a) {
; CHECK-NEXT: br i1 [[C]], label [[THEN:%.*]], label [[ELSE:%.*]]
; CHECK: then:
; CHECK-NEXT: [[SUB_1:%.*]] = sub nuw i80 [[A]], 1973801615886922022913
-; CHECK-NEXT: ret i1 true
+; CHECK-NEXT: [[C_1:%.*]] = icmp ult i80 [[SUB_1]], 1346612317380797267967
+; CHECK-NEXT: ret i1 [[C_1]]
; CHECK: else:
; CHECK-NEXT: ret i1 false
;
@@ -418,12 +420,12 @@ entry:
ret i1 %res
}
-; FIXME: This is a miscompile.
define i1 @pr68751(i128 %arg) {
; CHECK-LABEL: @pr68751(
; CHECK-NEXT: [[SHL1:%.*]] = shl nuw nsw i128 [[ARG:%.*]], 32
; CHECK-NEXT: [[SHL2:%.*]] = shl nuw nsw i128 [[SHL1]], 32
-; CHECK-NEXT: ret i1 true
+; CHECK-NEXT: [[CMP:%.*]] = icmp eq i128 [[SHL2]], 0
+; CHECK-NEXT: ret i1 [[CMP]]
;
%shl1 = shl nuw nsw i128 %arg, 32
%shl2 = shl nuw nsw i128 %shl1, 32
diff --git a/llvm/test/Transforms/ConstraintElimination/shl.ll b/llvm/test/Transforms/ConstraintElimination/shl.ll
index 982e0e745833351..9f98a9d3a57caef 100644
--- a/llvm/test/Transforms/ConstraintElimination/shl.ll
+++ b/llvm/test/Transforms/ConstraintElimination/shl.ll
@@ -1277,7 +1277,8 @@ define i1 @shl_55() {
; CHECK-LABEL: @shl_55(
; CHECK-NEXT: entry:
; CHECK-NEXT: [[SHL_UB:%.*]] = shl nuw nsw i256 1, 55
-; CHECK-NEXT: ret i1 true
+; CHECK-NEXT: [[SHL_CMP:%.*]] = icmp uge i256 [[SHL_UB]], 1
+; CHECK-NEXT: ret i1 [[SHL_CMP]]
;
entry:
%shl.ub = shl nuw nsw i256 1, 55
More information about the llvm-commits
mailing list