[llvm] r368437 - [GlobalOpt] prevent crashing on large integer types (PR42932)

Sanjay Patel via llvm-commits llvm-commits at lists.llvm.org
Fri Aug 9 05:43:25 PDT 2019


Author: spatel
Date: Fri Aug  9 05:43:25 2019
New Revision: 368437

URL: http://llvm.org/viewvc/llvm-project?rev=368437&view=rev
Log:
[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

Added:
    llvm/trunk/test/Transforms/GlobalOpt/large-int-crash.ll
Modified:
    llvm/trunk/lib/Transforms/IPO/GlobalOpt.cpp

Modified: llvm/trunk/lib/Transforms/IPO/GlobalOpt.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Transforms/IPO/GlobalOpt.cpp?rev=368437&r1=368436&r2=368437&view=diff
==============================================================================
--- llvm/trunk/lib/Transforms/IPO/GlobalOpt.cpp (original)
+++ llvm/trunk/lib/Transforms/IPO/GlobalOpt.cpp Fri Aug  9 05:43:25 2019
@@ -1643,10 +1643,12 @@ static bool TryToShrinkGlobalToBoolean(G
   // instead of a select to synthesize the desired value.
   bool IsOneZero = false;
   bool EmitOneOrZero = true;
-  if (ConstantInt *CI = dyn_cast<ConstantInt>(OtherVal)){
+  auto *CI = dyn_cast<ConstantInt>(OtherVal);
+  if (CI && CI->getValue().getActiveBits() <= 64) {
     IsOneZero = InitVal->isNullValue() && CI->isOne();
 
-    if (ConstantInt *CIInit = dyn_cast<ConstantInt>(GV->getInitializer())){
+    auto *CIInit = dyn_cast<ConstantInt>(GV->getInitializer());
+    if (CIInit && CIInit->getValue().getActiveBits() <= 64) {
       uint64_t ValInit = CIInit->getZExtValue();
       uint64_t ValOther = CI->getZExtValue();
       uint64_t ValMinus = ValOther - ValInit;

Added: llvm/trunk/test/Transforms/GlobalOpt/large-int-crash.ll
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/Transforms/GlobalOpt/large-int-crash.ll?rev=368437&view=auto
==============================================================================
--- llvm/trunk/test/Transforms/GlobalOpt/large-int-crash.ll (added)
+++ llvm/trunk/test/Transforms/GlobalOpt/large-int-crash.ll Fri Aug  9 05:43:25 2019
@@ -0,0 +1,23 @@
+; NOTE: Assertions have been autogenerated by utils/update_test_checks.py
+; RUN: opt < %s -globalopt -S | FileCheck %s
+
+ at 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
+}




More information about the llvm-commits mailing list