blob: ac02c850d72e335945e7ae462ca60e6d0921f5d4 (
plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
|
; RUN: llvm-as < %s | pnacl-freeze | pnacl-bcanalyzer -dump-records \
; RUN: | FileCheck %s
; Test that FORWARDTYPEREF declarations are emitted in the correct
; places. These are emitted for forward value references inside
; functions.
define external void @_start(i32 %arg) {
; CHECK: <FUNCTION_BLOCK
br label %bb1
; CHECK: <INST_BR
bb2:
; This instruction contains two forward references, because %x and
; %y are defined later in the function.
add i32 %forward1, %forward2
; CHECK-NEXT: <FORWARDTYPEREF
; CHECK-NEXT: <FORWARDTYPEREF
; CHECK-NEXT: <INST_BINOP
; The FORWARDTYPEREF declaration should only be emitted once per
; value, so the following references will not emit more of them.
add i32 %forward1, %forward2
; CHECK-NEXT: <INST_BINOP
; Test another case of a forward reference.
call void @_start(i32 %forward3)
; CHECK-NEXT: <FORWARDTYPEREF
; CHECK-NEXT: <INST_CALL
; Test that FORWARDTYPEREF is generated for phi nodes (since phi
; node operands are a special case in the writer).
br label %bb3
bb3:
phi i32 [ %forward4, %bb2 ]
; CHECK-NEXT: <INST_BR
; CHECK-NEXT: <FORWARDTYPEREF
; CHECK-NEXT: <INST_PHI
; Test that FORWARDTYPEREF is generated for switch instructions
; (since switch condition operands are a special case in the
; writer).
switch i32 %forward5, label %bb4 [i32 0, label %bb4]
bb4:
; CHECK-NEXT: <FORWARDTYPEREF
; CHECK-NEXT: <INST_SWITCH
ret void
; CHECK-NEXT: <INST_RET/>
bb1:
%forward1 = add i32 %arg, 100
%forward2 = add i32 %arg, 200
%forward3 = add i32 %arg, 300
%forward4 = add i32 %arg, 400
%forward5 = add i32 %arg, 500
br label %bb2
}
|