1
0
mirror of https://github.com/RPCS3/llvm-mirror.git synced 2025-01-31 12:41:49 +01:00

[BasicAA] Stop crashing when dealing with pointers > 64 bits.

An alternative (and probably better) fix would be that of
making `Scale` an APInt, and there's a patch floating around
to do this. As we're still discussing it, at least stop crashing
in the meanwhile (added bonus, we now have a regression test for
this situation).

Fixes PR35843.

Thanks to Eli for suggesting the fix and Simon for reporting and
reducing the bug.

llvm-svn: 322467
This commit is contained in:
Davide Italiano 2018-01-15 01:40:18 +00:00
parent e611130658
commit 1e4933df39
2 changed files with 19 additions and 0 deletions

View File

@ -503,6 +503,13 @@ bool BasicAAResult::DecomposeGEPExpression(const Value *V,
Index = GetLinearExpression(Index, IndexScale, IndexOffset, ZExtBits,
SExtBits, DL, 0, AC, DT, NSW, NUW);
// All GEP math happens in the width of the pointer type,
// so we can truncate the value to 64-bits as we don't handle
// currently pointers larger than 64 bits and we would crash
// later. TODO: Make `Scale` an APInt to avoid this problem.
if (IndexScale.getBitWidth() > 64)
IndexScale = IndexScale.sextOrTrunc(64);
// The GEP index scale ("Scale") scales C1*V+C2, yielding (C1*V+C2)*Scale.
// This gives us an aggregate computation of (C1*Scale)*V + C2*Scale.
Decomposed.OtherOffset += IndexOffset.getSExtValue() * Scale;

View File

@ -0,0 +1,12 @@
; RUN: opt %s -aa-eval -disable-output 2>&1 | FileCheck %s
; CHECK: 6 Total Alias Queries Performed
; CHECK-NEXT: 6 no alias responses
define void @patatino() {
BB:
%G22 = getelementptr i1*, i1** undef, i8 -1
%B1 = mul i66 undef, 9223372036854775808
%G45 = getelementptr i1**, i1*** undef, i66 %B1
ret void
}