From 2ba7697899433e5980a7d298eda0e7d897d9e13c Mon Sep 17 00:00:00 2001 From: Sanjay Patel Date: Fri, 9 Aug 2019 12:43:25 +0000 Subject: [PATCH] [GlobalOpt] prevent crashing on large integer types (PR42932) This is a minimal fix (copy the predicate for the assert) to prevent the crashing seen in: https://bugs.llvm.org/show_bug.cgi?id=42932 ...when converting a constant integer of arbitrary width to uint64_t. Differential Revision: https://reviews.llvm.org/D65970 git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@368437 91177308-0d34-0410-b5e6-96231b3b80d8 --- lib/Transforms/IPO/GlobalOpt.cpp | 6 +++-- test/Transforms/GlobalOpt/large-int-crash.ll | 23 ++++++++++++++++++++ 2 files changed, 27 insertions(+), 2 deletions(-) create mode 100644 test/Transforms/GlobalOpt/large-int-crash.ll diff --git a/lib/Transforms/IPO/GlobalOpt.cpp b/lib/Transforms/IPO/GlobalOpt.cpp index c4fb3ce77f6..471cdb66570 100644 --- a/lib/Transforms/IPO/GlobalOpt.cpp +++ b/lib/Transforms/IPO/GlobalOpt.cpp @@ -1643,10 +1643,12 @@ static bool TryToShrinkGlobalToBoolean(GlobalVariable *GV, Constant *OtherVal) { // instead of a select to synthesize the desired value. bool IsOneZero = false; bool EmitOneOrZero = true; - if (ConstantInt *CI = dyn_cast(OtherVal)){ + auto *CI = dyn_cast(OtherVal); + if (CI && CI->getValue().getActiveBits() <= 64) { IsOneZero = InitVal->isNullValue() && CI->isOne(); - if (ConstantInt *CIInit = dyn_cast(GV->getInitializer())){ + auto *CIInit = dyn_cast(GV->getInitializer()); + if (CIInit && CIInit->getValue().getActiveBits() <= 64) { uint64_t ValInit = CIInit->getZExtValue(); uint64_t ValOther = CI->getZExtValue(); uint64_t ValMinus = ValOther - ValInit; diff --git a/test/Transforms/GlobalOpt/large-int-crash.ll b/test/Transforms/GlobalOpt/large-int-crash.ll new file mode 100644 index 00000000000..7584554b978 --- /dev/null +++ b/test/Transforms/GlobalOpt/large-int-crash.ll @@ -0,0 +1,23 @@ +; NOTE: Assertions have been autogenerated by utils/update_test_checks.py +; RUN: opt < %s -globalopt -S | FileCheck %s + +@X = internal global i128 0 + +define void @foo() { +; CHECK-LABEL: @foo( +; CHECK-NEXT: [[T0_B:%.*]] = load i1, i1* @X +; CHECK-NEXT: [[T0:%.*]] = select i1 [[T0_B]], i128 18446744073709551616, i128 0 +; CHECK-NEXT: ret void +; + %t0 = load i128, i128* @X, align 8 + ret void +} + +define void @store() { +; CHECK-LABEL: @store( +; CHECK-NEXT: store i1 true, i1* @X +; CHECK-NEXT: ret void +; + store i128 18446744073709551616, i128* @X, align 8 + ret void +} -- 2.40.0