Skip to content

Commit ed7ae1a

Browse files
committed
Add coverage of GlobalsModRef's indirect global case
1 parent 371779f commit ed7ae1a

File tree

1 file changed

+85
-14
lines changed

1 file changed

+85
-14
lines changed
Lines changed: 85 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
; NOTE: Assertions have been autogenerated by utils/update_test_checks.py
12
; RUN: opt < %s -basic-aa -globals-aa -gvn -instcombine -S -enable-unsafe-globalsmodref-alias-results | FileCheck %s
23
; RUN: opt < %s -aa-pipeline=basic-aa,globals-aa -passes="require<globals-aa>,function(gvn,instcombine)" -S -enable-unsafe-globalsmodref-alias-results | FileCheck %s
34
;
@@ -7,20 +8,90 @@
78
@G = internal global i32* null ; <i32**> [#uses=3]
89

910
declare i8* @malloc(i32)
10-
define void @test() {
11-
%a = call i8* @malloc(i32 4)
12-
%A = bitcast i8* %a to i32*
13-
store i32* %A, i32** @G
14-
ret void
11+
define void @malloc_init() {
12+
; CHECK-LABEL: @malloc_init(
13+
; CHECK-NEXT: [[A:%.*]] = call dereferenceable_or_null(4) i8* @malloc(i32 4)
14+
; CHECK-NEXT: store i8* [[A]], i8** bitcast (i32** @G to i8**), align 8
15+
; CHECK-NEXT: ret void
16+
;
17+
%a = call i8* @malloc(i32 4)
18+
%A = bitcast i8* %a to i32*
19+
store i32* %A, i32** @G
20+
ret void
21+
}
22+
23+
define i32 @malloc_test(i32* %P) {
24+
; CHECK-LABEL: @malloc_test(
25+
; CHECK-NEXT: store i32 123, i32* [[P:%.*]], align 4
26+
; CHECK-NEXT: ret i32 0
27+
;
28+
%g1 = load i32*, i32** @G ; <i32*> [#uses=2]
29+
%h1 = load i32, i32* %g1 ; <i32> [#uses=1]
30+
store i32 123, i32* %P
31+
%g2 = load i32*, i32** @G ; <i32*> [#uses=0]
32+
%h2 = load i32, i32* %g1 ; <i32> [#uses=1]
33+
%X = sub i32 %h1, %h2 ; <i32> [#uses=1]
34+
ret i32 %X
35+
}
36+
37+
@G2 = internal global i32* null ; <i32**> [#uses=3]
38+
39+
declare i8* @calloc(i32, i32)
40+
define void @calloc_init() {
41+
; CHECK-LABEL: @calloc_init(
42+
; CHECK-NEXT: [[A:%.*]] = call dereferenceable_or_null(4) i8* @calloc(i32 4, i32 1)
43+
; CHECK-NEXT: store i8* [[A]], i8** bitcast (i32** @G2 to i8**), align 8
44+
; CHECK-NEXT: ret void
45+
;
46+
%a = call i8* @calloc(i32 4, i32 1)
47+
%A = bitcast i8* %a to i32*
48+
store i32* %A, i32** @G2
49+
ret void
1550
}
1651

17-
define i32 @test1(i32* %P) {
18-
; CHECK: ret i32 0
19-
%g1 = load i32*, i32** @G ; <i32*> [#uses=2]
20-
%h1 = load i32, i32* %g1 ; <i32> [#uses=1]
21-
store i32 123, i32* %P
22-
%g2 = load i32*, i32** @G ; <i32*> [#uses=0]
23-
%h2 = load i32, i32* %g1 ; <i32> [#uses=1]
24-
%X = sub i32 %h1, %h2 ; <i32> [#uses=1]
25-
ret i32 %X
52+
define i32 @calloc_test(i32* %P) {
53+
; CHECK-LABEL: @calloc_test(
54+
; CHECK-NEXT: store i32 123, i32* [[P:%.*]], align 4
55+
; CHECK-NEXT: ret i32 0
56+
;
57+
%g1 = load i32*, i32** @G2 ; <i32*> [#uses=2]
58+
%h1 = load i32, i32* %g1 ; <i32> [#uses=1]
59+
store i32 123, i32* %P
60+
%g2 = load i32*, i32** @G2 ; <i32*> [#uses=0]
61+
%h2 = load i32, i32* %g1 ; <i32> [#uses=1]
62+
%X = sub i32 %h1, %h2 ; <i32> [#uses=1]
63+
ret i32 %X
64+
}
65+
66+
@G3 = internal global i32* null ; <i32**> [#uses=3]
67+
68+
declare noalias i8* @my_alloc(i32)
69+
define void @my_alloc_init() {
70+
; CHECK-LABEL: @my_alloc_init(
71+
; CHECK-NEXT: [[A:%.*]] = call i8* @my_alloc(i32 4)
72+
; CHECK-NEXT: store i8* [[A]], i8** bitcast (i32** @G3 to i8**), align 8
73+
; CHECK-NEXT: ret void
74+
;
75+
%a = call i8* @my_alloc(i32 4)
76+
%A = bitcast i8* %a to i32*
77+
store i32* %A, i32** @G3
78+
ret void
79+
}
80+
81+
define i32 @my_alloc_test(i32* %P) {
82+
; CHECK-LABEL: @my_alloc_test(
83+
; CHECK-NEXT: [[G1:%.*]] = load i32*, i32** @G3, align 8
84+
; CHECK-NEXT: [[H1:%.*]] = load i32, i32* [[G1]], align 4
85+
; CHECK-NEXT: store i32 123, i32* [[P:%.*]], align 4
86+
; CHECK-NEXT: [[H2:%.*]] = load i32, i32* [[G1]], align 4
87+
; CHECK-NEXT: [[X:%.*]] = sub i32 [[H1]], [[H2]]
88+
; CHECK-NEXT: ret i32 [[X]]
89+
;
90+
%g1 = load i32*, i32** @G3 ; <i32*> [#uses=2]
91+
%h1 = load i32, i32* %g1 ; <i32> [#uses=1]
92+
store i32 123, i32* %P
93+
%g2 = load i32*, i32** @G3 ; <i32*> [#uses=0]
94+
%h2 = load i32, i32* %g1 ; <i32> [#uses=1]
95+
%X = sub i32 %h1, %h2 ; <i32> [#uses=1]
96+
ret i32 %X
2697
}

0 commit comments

Comments
 (0)