blob: 14a07bf87b035c475a33f25de752f3d07a98669b [file] [log] [blame]
Chris Lattner0eef9b32003-02-03 21:31:43 +00001; Test that GCSE uses ds-aa to do alias analysis, which is capable of
2; disambiguating some cases.
3
4; RUN: if as < %s | opt -ds-aa -load-vn -gcse -instcombine -dce | dis | grep ELIM
5; RUN: then exit 1
6; RUN: else exit 0
7; RUN: fi
8
9%intpair = type {int*, int*}
10implementation
11
12%intpair *%alloc_pair() {
13 %Ap = malloc int
14 %Bp = malloc int
15 %C = malloc {int*, int*}
16 %C1p = getelementptr {int*, int*}* %C, long 0, ubyte 0
17 store int* %Ap, int** %C1p
18 %C2p = getelementptr {int*, int*}* %C, long 0, ubyte 1
19 store int* %Bp, int** %C2p
20 ret %intpair* %C
21}
22
Chris Lattner1cdfd832003-02-03 21:40:14 +000023int* %getp(%intpair* %P) {
24 %pp = getelementptr %intpair* %P, long 0, ubyte 0
25 %V = load int** %pp
26 ret int *%V
27}
28
29int* %getq(%intpair* %P) {
30 %pp = getelementptr %intpair* %P, long 0, ubyte 1
31 %V = load int** %pp
32 ret int *%V
33}
34
Chris Lattner0eef9b32003-02-03 21:31:43 +000035int %test() {
36 %C = call %intpair* %alloc_pair()
Chris Lattner1cdfd832003-02-03 21:40:14 +000037 %A = call int* %getp(%intpair* %C)
38 %B = call int* %getp(%intpair* %C)
Chris Lattner0eef9b32003-02-03 21:31:43 +000039 %A1 = load int* %A
40
Chris Lattner4944d8d2003-02-24 20:30:14 +000041 store int 123, int* %B ; Store does alias %A
Chris Lattner0eef9b32003-02-03 21:31:43 +000042
43 %A2 = load int* %A
Chris Lattner4944d8d2003-02-24 20:30:14 +000044 %x = sub int %A1, %A2
45 ret int %x
Chris Lattner0eef9b32003-02-03 21:31:43 +000046}
47
Chris Lattner0eef9b32003-02-03 21:31:43 +000048int %test2() { ; Test context sensitivity
49 %C1 = call %intpair* %alloc_pair()
50 %C2 = call %intpair* %alloc_pair()
51 %P1 = call int* %getp(%intpair* %C1)
52 %P2 = call int* %getp(%intpair* %C2)
53 %X = load int* %P1
54 store int 7, int* %P2
55 %Y = load int* %P1
56 %ELIM_x = sub int %X, %Y
57 ret int %ELIM_x
58}
59
Chris Lattner1cdfd832003-02-03 21:40:14 +000060int %test3() {
61 %C = call %intpair* %alloc_pair()
62 %P1 = call int* %getp(%intpair* %C)
63 %P2 = call int* %getq(%intpair* %C)
64 %X = load int* %P1
65 store int 7, int* %P2
66 %Y = load int* %P1
67 %ELIM_x = sub int %X, %Y ; Check field sensitivity
68 ret int %ELIM_x
69}