xref: /llvm-project/llvm/test/Transforms/GVN/crash.ll (revision 88ad44ec43bdaba5185a0227ec81eb15bd0f7c5a)
1; RUN: opt -passes=gvn -disable-output < %s
2
3; PR5631
4
5target datalayout = "e-p:64:64:64-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:64:64-f32:32:32-f64:64:64-v64:64:64-v128:128:128-a0:0:64-s0:64:64-f80:128:128-n8:16:32:64"
6target triple = "x86_64-apple-darwin10.0"
7
8define ptr @test1(ptr %name, i32 %namelen, ptr %o, i32 %expected_type, i1 %arg) nounwind ssp {
9entry:
10  br i1 %arg, label %if.end13, label %while.body.preheader
11
12
13if.end13:                                         ; preds = %if.then6
14  br label %while.body.preheader
15
16while.body.preheader:                             ; preds = %if.end13, %if.end
17  br label %while.body
18
19while.body:                                       ; preds = %while.body.backedge, %while.body.preheader
20  %o.addr.0 = phi ptr [ undef, %while.body.preheader ], [ %o.addr.0.be, %while.body.backedge ] ; <ptr> [#uses=2]
21  br i1 false, label %return.loopexit, label %lor.lhs.false
22
23lor.lhs.false:                                    ; preds = %while.body
24  %tmp22 = load i32, ptr %o.addr.0                       ; <i32> [#uses=0]
25  br i1 %arg, label %land.lhs.true24, label %if.end31
26
27land.lhs.true24:                                  ; preds = %lor.lhs.false
28  %call28 = call ptr @parse_object(ptr undef) nounwind ; <ptr> [#uses=0]
29  br i1 %arg, label %return.loopexit, label %if.end31
30
31if.end31:                                         ; preds = %land.lhs.true24, %lor.lhs.false
32  br i1 %arg, label %return.loopexit, label %if.end41
33
34if.end41:                                         ; preds = %if.end31
35  %tmp45 = load i32, ptr %o.addr.0                       ; <i32> [#uses=0]
36  br i1 %arg, label %if.then50, label %if.else
37
38if.then50:                                        ; preds = %if.end41
39  %tmp53 = load ptr, ptr undef                       ; <ptr> [#uses=1]
40  br label %while.body.backedge
41
42if.else:                                          ; preds = %if.end41
43  br i1 %arg, label %if.then62, label %if.else67
44
45if.then62:                                        ; preds = %if.else
46  br label %while.body.backedge
47
48while.body.backedge:                              ; preds = %if.then62, %if.then50
49  %o.addr.0.be = phi ptr [ %tmp53, %if.then50 ], [ undef, %if.then62 ] ; <ptr> [#uses=1]
50  br label %while.body
51
52if.else67:                                        ; preds = %if.else
53  ret ptr null
54
55return.loopexit:                                  ; preds = %if.end31, %land.lhs.true24, %while.body
56  ret ptr undef
57}
58
59declare ptr @parse_object(ptr)
60
61
62
63
64
65
66%struct.attribute_spec = type { ptr, i32, i32, i8, i8, i8 }
67
68@attribute_tables = external global [4 x ptr] ; <ptr> [#uses=2]
69
70define void @test2() nounwind {
71entry:
72  br label %bb69.i
73
74bb69.i:                                           ; preds = %bb57.i.preheader
75  %tmp4 = getelementptr inbounds [4 x ptr], ptr @attribute_tables, i32 0, i32 undef ; <ptr> [#uses=1]
76  %tmp3 = load ptr, ptr %tmp4, align 4 ; <ptr> [#uses=1]
77  br label %bb65.i
78
79bb65.i:                                           ; preds = %bb65.i.preheader, %bb64.i
80  %storemerge6.i = phi i32 [ 1, %bb64.i ], [ 0, %bb69.i ] ; <i32> [#uses=3]
81  %scevgep14 = getelementptr inbounds %struct.attribute_spec, ptr %tmp3, i32 %storemerge6.i, i32 0 ; <ptr> [#uses=1]
82  %tmp2 = load ptr, ptr %scevgep14, align 4           ; <ptr> [#uses=0]
83  %tmp = load ptr, ptr %tmp4, align 4 ; <ptr> [#uses=1]
84  %scevgep1516 = getelementptr inbounds %struct.attribute_spec, ptr %tmp, i32 %storemerge6.i, i32 0 ; <ptr> [#uses=0]
85  unreachable
86
87bb64.i:                                           ; Unreachable
88  br label %bb65.i
89
90bb66.i:                                           ; Unreachable
91  br label %bb69.i
92}
93
94
95
96; rdar://7438974
97
98@g = external global i64, align 8
99
100define ptr @test3(i1 %arg) {
101do.end17.i:
102  %tmp18.i = load ptr, ptr undef
103  br i1 %arg, label %do.body36.i, label %if.then21.i
104
105if.then21.i:
106  ret ptr undef
107
108do.body36.i:
109  %ivar38.i = load i64, ptr @g
110  %add.ptr39.sum.i = add i64 %ivar38.i, 8
111  %tmp40.i = getelementptr inbounds i8, ptr %tmp18.i, i64 %add.ptr39.sum.i
112  %tmp41.i = load i64, ptr %tmp40.i
113  br i1 %arg, label %if.then48.i, label %do.body57.i
114
115if.then48.i:
116  %call54.i = call i32 @foo2()
117  br label %do.body57.i
118
119do.body57.i:
120  %tmp58.i = load ptr, ptr undef
121  %ivar59.i = load i64, ptr @g
122  %add.ptr65.sum.i = add i64 %ivar59.i, 8
123  %tmp66.i = getelementptr inbounds i8, ptr %tmp58.i, i64 %add.ptr65.sum.i
124  %tmp67.i = load i64, ptr %tmp66.i
125  ret ptr undef
126}
127
128declare i32 @foo2()
129
130
131
132define i32 @test4() {
133entry:
134  ret i32 0
135
136dead:
137  %P2 = getelementptr i32, ptr %P2, i32 52
138  %Q2 = getelementptr i32, ptr %Q2, i32 52
139  store i32 4, ptr %P2
140  %A = load i32, ptr %Q2
141  br i1 true, label %dead, label %dead2
142
143dead2:
144  ret i32 %A
145}
146
147
148; PR9841
149define fastcc i8 @test5(ptr %P) nounwind {
150entry:
151  %0 = load i8, ptr %P, align 2
152
153  %Q = getelementptr i8, ptr %P, i32 1
154  %1 = load i8, ptr %Q, align 1
155  ret i8 %1
156}
157
158
159; Test that a GEP in an unreachable block with the following form doesn't crash
160; GVN:
161;
162;    %x = gep %some.type %x, ...
163
164%struct.type = type { i64, i32, i32 }
165
166define fastcc void @func(i1 %arg) nounwind uwtable ssp align 2 {
167entry:
168  br label %reachable.bb
169
170;; Unreachable code.
171
172unreachable.bb:
173  %gep.val = getelementptr inbounds %struct.type, ptr %gep.val, i64 1
174  br i1 %arg, label %u2.bb, label %u1.bb
175
176u1.bb:
177  store i64 -1, ptr %gep.val, align 8
178  br label %unreachable.bb
179
180u2.bb:
181  %0 = load i32, ptr undef, align 4
182  %conv.i.i.i.i.i = zext i32 %0 to i64
183  br label %u2.bb
184
185;; Reachable code.
186
187reachable.bb:
188  br label %r1.bb
189
190r1.bb:
191  br label %u2.bb
192}
193