[InstCombine] Make sure that LHS and RHS have the same type in

transformToIndexedCompare

If they don't have the same type, the size of the constant
index would need to be adjusted (and this wouldn't be always
possible).

Alternatively we could try the analysis with the initial
RHS value, which would guarantee that the two sides have
the same type. However it is unlikely that in practice this
would pass our transformation requirements.

Fixes PR31808 (https://llvm.org/bugs/show_bug.cgi?id=31808).



git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@293629 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
Silviu Baranga 2017-01-31 14:04:15 +00:00
parent 438897d8de
commit 150da15398
2 changed files with 21 additions and 0 deletions

View File

@ -884,6 +884,10 @@ static Instruction *transformToIndexedCompare(GEPOperator *GEPLHS, Value *RHS,
if (!GEPLHS->hasAllConstantIndices())
return nullptr;
// Make sure the pointers have the same type.
if (GEPLHS->getType() != RHS->getType())
return nullptr;
Value *PtrBase, *Index;
std::tie(PtrBase, Index) = getAsConstantIndexedAddress(GEPLHS, DL);

View File

@ -188,3 +188,20 @@ bb10:
declare i32 @__gxx_personality_v0(...)
define i1 @test8(i64* %in, i64 %offset) {
entry:
%ld = load i64, i64* %in, align 8
%casti8 = inttoptr i64 %ld to i8*
%gepi8 = getelementptr inbounds i8, i8* %casti8, i64 %offset
%cast = bitcast i8* %gepi8 to i32**
%ptrcast = inttoptr i64 %ld to i32**
%gepi32 = getelementptr inbounds i32*, i32** %ptrcast, i64 1
%cmp = icmp eq i32** %gepi32, %cast
ret i1 %cmp
; CHECK-LABEL: @test8(
; CHECK-NOT: icmp eq i32 %{{[0-9A-Za-z.]+}}, 1
}