mirror of
https://github.com/RPCS3/llvm-mirror.git
synced 2025-01-31 12:41:49 +01:00
[BasicAA] Compare GEP indices based on value (Fix PR27418)
Equivalent GEP indices with different types are treated as different indices altogether, leading to an incorrect AA result. Fix the issue by comparing indices based on their values. Thanks to Mikael Holmén for reporting the issue! Differential Revision: http://reviews.llvm.org/D19935 llvm-svn: 269197
This commit is contained in:
parent
b13f3435de
commit
641c55ebd0
@ -847,7 +847,7 @@ static AliasResult aliasSameBasePointerGEPs(const GEPOperator *GEP1,
|
||||
|
||||
// If the last (struct) indices are constants and are equal, the other indices
|
||||
// might be also be dynamically equal, so the GEPs can alias.
|
||||
if (C1 && C2 && C1 == C2)
|
||||
if (C1 && C2 && C1->getSExtValue() == C2->getSExtValue())
|
||||
return MayAlias;
|
||||
|
||||
// Find the last-indexed type of the GEP, i.e., the type you'd get if
|
||||
|
@ -162,3 +162,12 @@ define void @test_struct_in_array(%struct2* %st, i64 %i, i64 %j, i64 %k) {
|
||||
%y = getelementptr %struct2, %struct2* %st, i32 0, i32 0, i32 1, i32 1
|
||||
ret void
|
||||
}
|
||||
|
||||
; PR27418 - Treat GEP indices with the same value but different types the same
|
||||
; CHECK-LABEL: test_different_index_types
|
||||
; CHECK: MustAlias: i16* %tmp1, i16* %tmp2
|
||||
define void @test_different_index_types([2 x i16]* %arr) {
|
||||
%tmp1 = getelementptr [2 x i16], [2 x i16]* %arr, i16 0, i32 1
|
||||
%tmp2 = getelementptr [2 x i16], [2 x i16]* %arr, i16 0, i16 1
|
||||
ret void
|
||||
}
|
||||
|
Loading…
x
Reference in New Issue
Block a user