[llvm-branch-commits] [llvm] 8988ce3 - [DebugInfo][LSR] Avoid crashes on large integer inputs
Chris Jackson via llvm-branch-commits
llvm-branch-commits at lists.llvm.org
Thu Aug 5 03:26:45 PDT 2021
Author: Chris Jackson
Date: 2021-08-05T10:38:19+01:00
New Revision: 8988ce302864ef3216e252af7d491482e71f79c7
URL: https://github.com/llvm/llvm-project/commit/8988ce302864ef3216e252af7d491482e71f79c7
DIFF: https://github.com/llvm/llvm-project/commit/8988ce302864ef3216e252af7d491482e71f79c7.diff
LOG: [DebugInfo][LSR] Avoid crashes on large integer inputs
SCEV-based salvaging in LSR translates SCEVs to DIExpressions. SCEVs may
contain very large integers but the translation does not support
integers greater than 64 bits. This patch adds checks to ensure
conversions of these large integers is not attempted. A regression test
is added to ensure no such translation is attempted.
Reviewed by: StephenTozer
PR: https://bugs.llvm.org/show_bug.cgi?id=51329
Differential Revision: https://reviews.llvm.org/D107438
(cherry picked from commit 21ee38e24f9801a567306b2a88defacf6e589a8b)
Added:
llvm/test/Transforms/LoopStrengthReduce/pr51329.ll
Modified:
llvm/lib/Transforms/Scalar/LoopStrengthReduce.cpp
Removed:
################################################################################
diff --git a/llvm/lib/Transforms/Scalar/LoopStrengthReduce.cpp b/llvm/lib/Transforms/Scalar/LoopStrengthReduce.cpp
index 1ea4e116bd2fc..404852f1dd4dd 100644
--- a/llvm/lib/Transforms/Scalar/LoopStrengthReduce.cpp
+++ b/llvm/lib/Transforms/Scalar/LoopStrengthReduce.cpp
@@ -5906,9 +5906,12 @@ struct SCEVDbgValueBuilder {
pushValue(V);
}
- void pushConst(const SCEVConstant *C) {
+ bool pushConst(const SCEVConstant *C) {
+ if (C->getAPInt().getMinSignedBits() > 64)
+ return false;
Expr.push_back(llvm::dwarf::DW_OP_consts);
Expr.push_back(C->getAPInt().getSExtValue());
+ return true;
}
/// Several SCEV types are sequences of the same arithmetic operator applied
@@ -5947,7 +5950,7 @@ struct SCEVDbgValueBuilder {
bool pushSCEV(const llvm::SCEV *S) {
bool Success = true;
if (const SCEVConstant *StartInt = dyn_cast<SCEVConstant>(S)) {
- pushConst(StartInt);
+ Success &= pushConst(StartInt);
} else if (const SCEVUnknown *U = dyn_cast<SCEVUnknown>(S)) {
if (!U->getValue())
@@ -6033,6 +6036,8 @@ struct SCEVDbgValueBuilder {
/// SCEV constant value is an identity function.
bool isIdentityFunction(uint64_t Op, const SCEV *S) {
if (const SCEVConstant *C = dyn_cast<SCEVConstant>(S)) {
+ if (C->getAPInt().getMinSignedBits() > 64)
+ return false;
int64_t I = C->getAPInt().getSExtValue();
switch (Op) {
case llvm::dwarf::DW_OP_plus:
diff --git a/llvm/test/Transforms/LoopStrengthReduce/pr51329.ll b/llvm/test/Transforms/LoopStrengthReduce/pr51329.ll
new file mode 100644
index 0000000000000..f8f1c48eeaa86
--- /dev/null
+++ b/llvm/test/Transforms/LoopStrengthReduce/pr51329.ll
@@ -0,0 +1,50 @@
+; RUN: opt -S -loop-reduce %s | FileCheck %s
+;
+; Test that LSR SCEV-based salvaging does not crash when translating SCEVs
+; that contain integers with binary representations greater than 64-bits.
+;
+; CHECK: call void @llvm.dbg.value(metadata i64 %var2, metadata !{{[0-9]+}}, metadata !DIExpression(DW_OP_plus_uconst, 228, DW_OP_stack_value))
+
+
+target datalayout = "e-m:e-p270:32:32-p271:32:32-p272:64:64-i64:64-f80:128-n8:16:32:64-S128"
+target triple = "x86_64-unknown-linux-gnu"
+
+; Function Attrs: nofree nosync nounwind readnone speculatable willreturn
+declare void @llvm.dbg.value(metadata, metadata, metadata)
+
+; Function Attrs: nounwind
+define hidden void @reproducer() local_unnamed_addr !dbg !5 {
+init:
+ %0 = lshr i128 undef, 64
+ %var1 = trunc i128 %0 to i64
+ %1 = add nuw i64 undef, %var1
+ %var2 = lshr i64 %1, 12
+ br label %Label_d0
+
+Label_d0: ; preds = %Label_d0, %init
+ %var3 = phi i64 [ %var2, %init ], [ %var4, %Label_d0 ]
+ call void @llvm.dbg.value(metadata i64 %var2, metadata !11, metadata !DIExpression(DW_OP_plus_uconst, 228, DW_OP_stack_value)), !dbg !12
+ %var4 = add i64 %var3, -1
+ %var5 = icmp eq i64 %var4, 0
+ br i1 %var5, label %Label_1bc, label %Label_d0
+
+Label_1bc: ; preds = %Label_d0
+ ret void
+}
+
+!llvm.dbg.cu = !{!0}
+!llvm.module.flags = !{!3, !4}
+
+!0 = distinct !DICompileUnit(language: DW_LANG_C_plus_plus, file: !1, producer: "frontend", isOptimized: true, runtimeVersion: 0, emissionKind: FullDebug, enums: !2)
+!1 = !DIFile(filename: "source", directory: "")
+!2 = !{}
+!3 = !{i32 2, !"Debug Info Version", i32 3}
+!4 = !{i32 1, !"wchar_size", i32 4}
+!5 = distinct !DISubprogram(name: "reproducer", scope: !1, file: !1, line: 904320, type: !6, scopeLine: 904320, spFlags: DISPFlagDefinition, unit: !0, retainedNodes: !10)
+!6 = !DISubroutineType(types: !7)
+!7 = !{null, !8, !9, !9, !9, !9, !9, !9}
+!8 = !DIDerivedType(tag: DW_TAG_pointer_type, baseType: null, size: 64)
+!9 = !DIBasicType(name: "my_type", size: 64, encoding: DW_ATE_unsigned)
+!10 = !{!11}
+!11 = !DILocalVariable(name: "my_var", arg: 1, scope: !5, file: !1, line: 904320, type: !8)
+!12 = !DILocation(line: 904544, scope: !5)
More information about the llvm-branch-commits
mailing list