1
0
mirror of https://github.com/RPCS3/llvm-mirror.git synced 2024-10-24 13:33:37 +02:00
llvm-mirror/test/Analysis/BasicAA/struct-geps.ll
Vedant Kumar 641c55ebd0 [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
2016-05-11 15:45:43 +00:00

174 lines
6.5 KiB
LLVM

; RUN: opt < %s -basicaa -aa-eval -print-all-alias-modref-info -disable-output 2>&1 | FileCheck %s
target datalayout = "e-m:e-i64:64-f80:128-n8:16:32:64-S128"
%struct = type { i32, i32, i32 }
; CHECK-LABEL: test_simple
; CHECK-DAG: PartialAlias: %struct* %st, i32* %x
; CHECK-DAG: PartialAlias: %struct* %st, i32* %y
; CHECK-DAG: PartialAlias: %struct* %st, i32* %z
; CHECK-DAG: NoAlias: i32* %x, i32* %y
; CHECK-DAG: NoAlias: i32* %x, i32* %z
; CHECK-DAG: NoAlias: i32* %y, i32* %z
; CHECK-DAG: PartialAlias: %struct* %st, %struct* %y_12
; CHECK-DAG: PartialAlias: %struct* %y_12, i32* %x
; CHECK-DAG: PartialAlias: i32* %x, i80* %y_10
; CHECK-DAG: PartialAlias: %struct* %st, i64* %y_8
; CHECK-DAG: PartialAlias: i32* %z, i64* %y_8
; CHECK-DAG: NoAlias: i32* %x, i64* %y_8
; CHECK-DAG: MustAlias: %struct* %y_12, i32* %y
; CHECK-DAG: MustAlias: i32* %y, i64* %y_8
; CHECK-DAG: MustAlias: i32* %y, i80* %y_10
define void @test_simple(%struct* %st, i64 %i, i64 %j, i64 %k) {
%x = getelementptr %struct, %struct* %st, i64 %i, i32 0
%y = getelementptr %struct, %struct* %st, i64 %j, i32 1
%z = getelementptr %struct, %struct* %st, i64 %k, i32 2
%y_12 = bitcast i32* %y to %struct*
%y_10 = bitcast i32* %y to i80*
%y_8 = bitcast i32* %y to i64*
ret void
}
; CHECK-LABEL: test_in_array
; CHECK-DAG: PartialAlias: [1 x %struct]* %st, i32* %x
; CHECK-DAG: PartialAlias: [1 x %struct]* %st, i32* %y
; CHECK-DAG: PartialAlias: [1 x %struct]* %st, i32* %z
; CHECK-DAG: NoAlias: i32* %x, i32* %y
; CHECK-DAG: NoAlias: i32* %x, i32* %z
; CHECK-DAG: NoAlias: i32* %y, i32* %z
; CHECK-DAG: PartialAlias: %struct* %y_12, [1 x %struct]* %st
; CHECK-DAG: PartialAlias: %struct* %y_12, i32* %x
; CHECK-DAG: PartialAlias: i32* %x, i80* %y_10
; CHECK-DAG: PartialAlias: [1 x %struct]* %st, i64* %y_8
; CHECK-DAG: PartialAlias: i32* %z, i64* %y_8
; CHECK-DAG: NoAlias: i32* %x, i64* %y_8
; CHECK-DAG: MustAlias: %struct* %y_12, i32* %y
; CHECK-DAG: MustAlias: i32* %y, i64* %y_8
; CHECK-DAG: MustAlias: i32* %y, i80* %y_10
define void @test_in_array([1 x %struct]* %st, i64 %i, i64 %j, i64 %k, i64 %i1, i64 %j1, i64 %k1) {
%x = getelementptr [1 x %struct], [1 x %struct]* %st, i64 %i, i64 %i1, i32 0
%y = getelementptr [1 x %struct], [1 x %struct]* %st, i64 %j, i64 %j1, i32 1
%z = getelementptr [1 x %struct], [1 x %struct]* %st, i64 %k, i64 %k1, i32 2
%y_12 = bitcast i32* %y to %struct*
%y_10 = bitcast i32* %y to i80*
%y_8 = bitcast i32* %y to i64*
ret void
}
; CHECK-LABEL: test_in_3d_array
; CHECK-DAG: PartialAlias: [1 x [1 x [1 x %struct]]]* %st, i32* %x
; CHECK-DAG: PartialAlias: [1 x [1 x [1 x %struct]]]* %st, i32* %y
; CHECK-DAG: PartialAlias: [1 x [1 x [1 x %struct]]]* %st, i32* %z
; CHECK-DAG: NoAlias: i32* %x, i32* %y
; CHECK-DAG: NoAlias: i32* %x, i32* %z
; CHECK-DAG: NoAlias: i32* %y, i32* %z
; CHECK-DAG: PartialAlias: %struct* %y_12, [1 x [1 x [1 x %struct]]]* %st
; CHECK-DAG: PartialAlias: %struct* %y_12, i32* %x
; CHECK-DAG: PartialAlias: i32* %x, i80* %y_10
; CHECK-DAG: PartialAlias: [1 x [1 x [1 x %struct]]]* %st, i64* %y_8
; CHECK-DAG: PartialAlias: i32* %z, i64* %y_8
; CHECK-DAG: NoAlias: i32* %x, i64* %y_8
; CHECK-DAG: MustAlias: %struct* %y_12, i32* %y
; CHECK-DAG: MustAlias: i32* %y, i64* %y_8
; CHECK-DAG: MustAlias: i32* %y, i80* %y_10
define void @test_in_3d_array([1 x [1 x [1 x %struct]]]* %st, i64 %i, i64 %j, i64 %k, i64 %i1, i64 %j1, i64 %k1, i64 %i2, i64 %j2, i64 %k2, i64 %i3, i64 %j3, i64 %k3) {
%x = getelementptr [1 x [1 x [1 x %struct]]], [1 x [1 x [1 x %struct]]]* %st, i64 %i, i64 %i1, i64 %i2, i64 %i3, i32 0
%y = getelementptr [1 x [1 x [1 x %struct]]], [1 x [1 x [1 x %struct]]]* %st, i64 %j, i64 %j1, i64 %j2, i64 %j3, i32 1
%z = getelementptr [1 x [1 x [1 x %struct]]], [1 x [1 x [1 x %struct]]]* %st, i64 %k, i64 %k1, i64 %k2, i64 %k3, i32 2
%y_12 = bitcast i32* %y to %struct*
%y_10 = bitcast i32* %y to i80*
%y_8 = bitcast i32* %y to i64*
ret void
}
; CHECK-LABEL: test_same_underlying_object_same_indices
; CHECK-DAG: NoAlias: i32* %x, i32* %x2
; CHECK-DAG: NoAlias: i32* %y, i32* %y2
; CHECK-DAG: NoAlias: i32* %z, i32* %z2
; CHECK-DAG: PartialAlias: i32* %x, i32* %y2
; CHECK-DAG: PartialAlias: i32* %x, i32* %z2
; CHECK-DAG: PartialAlias: i32* %x2, i32* %y
; CHECK-DAG: PartialAlias: i32* %y, i32* %z2
; CHECK-DAG: PartialAlias: i32* %x2, i32* %z
; CHECK-DAG: PartialAlias: i32* %y2, i32* %z
define void @test_same_underlying_object_same_indices(%struct* %st, i64 %i, i64 %j, i64 %k) {
%st2 = getelementptr %struct, %struct* %st, i32 10
%x2 = getelementptr %struct, %struct* %st2, i64 %i, i32 0
%y2 = getelementptr %struct, %struct* %st2, i64 %j, i32 1
%z2 = getelementptr %struct, %struct* %st2, i64 %k, i32 2
%x = getelementptr %struct, %struct* %st, i64 %i, i32 0
%y = getelementptr %struct, %struct* %st, i64 %j, i32 1
%z = getelementptr %struct, %struct* %st, i64 %k, i32 2
ret void
}
; CHECK-LABEL: test_same_underlying_object_different_indices
; CHECK-DAG: PartialAlias: i32* %x, i32* %x2
; CHECK-DAG: PartialAlias: i32* %y, i32* %y2
; CHECK-DAG: PartialAlias: i32* %z, i32* %z2
; CHECK-DAG: PartialAlias: i32* %x, i32* %y2
; CHECK-DAG: PartialAlias: i32* %x, i32* %z2
; CHECK-DAG: PartialAlias: i32* %x2, i32* %y
; CHECK-DAG: PartialAlias: i32* %y, i32* %z2
; CHECK-DAG: PartialAlias: i32* %x2, i32* %z
; CHECK-DAG: PartialAlias: i32* %y2, i32* %z
define void @test_same_underlying_object_different_indices(%struct* %st, i64 %i1, i64 %j1, i64 %k1, i64 %i2, i64 %k2, i64 %j2) {
%st2 = getelementptr %struct, %struct* %st, i32 10
%x2 = getelementptr %struct, %struct* %st2, i64 %i2, i32 0
%y2 = getelementptr %struct, %struct* %st2, i64 %j2, i32 1
%z2 = getelementptr %struct, %struct* %st2, i64 %k2, i32 2
%x = getelementptr %struct, %struct* %st, i64 %i1, i32 0
%y = getelementptr %struct, %struct* %st, i64 %j1, i32 1
%z = getelementptr %struct, %struct* %st, i64 %k1, i32 2
ret void
}
%struct2 = type { [1 x { i32, i32 }], [2 x { i32 }] }
; CHECK-LABEL: test_struct_in_array
; CHECK-DAG: MustAlias: i32* %x, i32* %y
define void @test_struct_in_array(%struct2* %st, i64 %i, i64 %j, i64 %k) {
%x = getelementptr %struct2, %struct2* %st, i32 0, i32 1, i32 1, i32 0
%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
}