aboutsummaryrefslogtreecommitdiffstats
path: root/community/llvm8/GlobalOpt-prevent-crashing-on-wide-integer-types.patch
diff options
context:
space:
mode:
Diffstat (limited to 'community/llvm8/GlobalOpt-prevent-crashing-on-wide-integer-types.patch')
-rw-r--r--community/llvm8/GlobalOpt-prevent-crashing-on-wide-integer-types.patch47
1 files changed, 47 insertions, 0 deletions
diff --git a/community/llvm8/GlobalOpt-prevent-crashing-on-wide-integer-types.patch b/community/llvm8/GlobalOpt-prevent-crashing-on-wide-integer-types.patch
new file mode 100644
index 0000000000..3b450e23d1
--- /dev/null
+++ b/community/llvm8/GlobalOpt-prevent-crashing-on-wide-integer-types.patch
@@ -0,0 +1,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
++}