[PATCH] D158810: [ConstraintElim] fix crash with large constants in mul nsw

Erik Desjardins via Phabricator via llvm-commits llvm-commits at lists.llvm.org
Thu Aug 24 21:15:02 PDT 2023


erikdesjardins created this revision.
erikdesjardins added reviewers: fhahn, nikic, antoniofrighetto.
Herald added subscribers: StephenFan, hiraditya.
Herald added a project: All.
erikdesjardins requested review of this revision.
Herald added a project: LLVM.
Herald added a subscriber: llvm-commits.

Another case of https://github.com/llvm/llvm-project/issues/55085.

The added test would trip an assertion due to calling `getSExtValue()` on a value that doesn't fit in int64_t.


https://reviews.llvm.org/D158810

Files:
  llvm/lib/Transforms/Scalar/ConstraintElimination.cpp
  llvm/test/Transforms/ConstraintElimination/large-constant-ints.ll


Index: llvm/test/Transforms/ConstraintElimination/large-constant-ints.ll
===================================================================
--- llvm/test/Transforms/ConstraintElimination/large-constant-ints.ll
+++ llvm/test/Transforms/ConstraintElimination/large-constant-ints.ll
@@ -280,6 +280,19 @@
   ret i1 false
 }
 
+define i1 @mul_nsw_decomp(i128 %x) {
+    %val = mul nsw i128 %x, 9223372036854775808
+    %cmp = icmp sgt i128 %x, %val
+    br i1 %cmp, label %then, label %else
+
+then:
+    %cmp2 = icmp sgt i128 %x, 0
+    ret i1 %cmp2
+
+else:
+    ret i1 false
+}
+
 define i1 @add_nuw_decomp_recursive() {
 ; CHECK-LABEL: @add_nuw_decomp_recursive(
 ; CHECK-NEXT:    [[ADD:%.*]] = add nuw nsw i64 -9223372036854775808, 10
Index: llvm/lib/Transforms/Scalar/ConstraintElimination.cpp
===================================================================
--- llvm/lib/Transforms/Scalar/ConstraintElimination.cpp
+++ llvm/lib/Transforms/Scalar/ConstraintElimination.cpp
@@ -424,7 +424,7 @@
       return MergeResults(Op0, Op1, IsSigned);
 
     ConstantInt *CI;
-    if (match(V, m_NSWMul(m_Value(Op0), m_ConstantInt(CI)))) {
+    if (match(V, m_NSWMul(m_Value(Op0), m_ConstantInt(CI))) && canUseSExt(CI)) {
       auto Result = decompose(Op0, Preconditions, IsSigned, DL);
       Result.mul(CI->getSExtValue());
       return Result;


-------------- next part --------------
A non-text attachment was scrubbed...
Name: D158810.553345.patch
Type: text/x-patch
Size: 1343 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20230825/33b795d2/attachment.bin>


More information about the llvm-commits mailing list