aboutsummaryrefslogtreecommitdiffstats
path: root/main/llvm8/GlobalOpt-prevent-crashing-on-wide-integer-types.patch
blob: 3b450e23d17f8cc7eeb2496253aeacb87b8b2119 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
diff --git a/lib/Transforms/IPO/GlobalOpt.cpp b/lib/Transforms/IPO/GlobalOpt.cpp
index 3005aaf..fa3f3a7 100644
--- a/lib/Transforms/IPO/GlobalOpt.cpp
+++ b/lib/Transforms/IPO/GlobalOpt.cpp
@@ -1639,10 +1639,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<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;
diff --git a/test/Transforms/GlobalOpt/large-int-crash.ll b/test/Transforms/GlobalOpt/large-int-crash.ll
index e69de29..7584554 100644
--- a/test/Transforms/GlobalOpt/large-int-crash.ll
+++ 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
+}