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
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
|
; RUN: llvm-as < %s | opt -std-compile-opts | llc -enable-eh
;; Formerly crashed, see PR 1508
; ModuleID = '5550437.c'
target datalayout = "E-p:64:64:64-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:32:64-f32:32:32-f64:32:64-v64:64:64-v128:128:128-a0:0:64-f128:64:128"
target triple = "powerpc64-apple-darwin8"
%struct.Range = type { i64, i64 }
define void @Bork(i64 %range.0.0, i64 %range.0.1, i64 %size) {
entry:
%range_addr = alloca %struct.Range ; <%struct.Range*> [#uses=5]
%size_addr = alloca i64 ; <i64*> [#uses=2]
%size.0 = alloca i64, align 8 ; <i64*> [#uses=6]
%additionalKeys.5 = alloca i8** ; <i8***> [#uses=2]
%saved_stack.7 = alloca i8* ; <i8**> [#uses=3]
%eh_exception = alloca i8* ; <i8**> [#uses=3]
%eh_selector = alloca i64 ; <i64*> [#uses=1]
%effectiveRange = alloca %struct.Range, align 8 ; <%struct.Range*> [#uses=2]
%"alloca point" = bitcast i32 0 to i32 ; <i32> [#uses=0]
%tmp = bitcast %struct.Range* %range_addr to { [2 x i64] }* ; <{ [2 x i64] }*> [#uses=1]
%tmp1 = getelementptr { [2 x i64] }* %tmp, i32 0, i32 0 ; <[2 x i64]*> [#uses=2]
%tmp2 = getelementptr [2 x i64]* %tmp1, i32 0, i32 0 ; <i64*> [#uses=1]
store i64 %range.0.0, i64* %tmp2
%tmp3 = getelementptr [2 x i64]* %tmp1, i32 0, i32 1 ; <i64*> [#uses=1]
store i64 %range.0.1, i64* %tmp3
store i64 %size, i64* %size_addr
%tmp4 = call i8* @llvm.stacksave( ) ; <i8*> [#uses=1]
store i8* %tmp4, i8** %saved_stack.7, align 8
%tmp5 = load i64* %size_addr, align 8 ; <i64> [#uses=1]
store i64 %tmp5, i64* %size.0, align 8
%tmp6 = load i64* %size.0, align 8 ; <i64> [#uses=1]
%tmp7 = sub i64 %tmp6, 1 ; <i64> [#uses=0]
%tmp8 = load i64* %size.0, align 8 ; <i64> [#uses=1]
%tmp9 = mul i64 %tmp8, 64 ; <i64> [#uses=0]
%tmp10 = load i64* %size.0, align 8 ; <i64> [#uses=1]
%tmp11 = mul i64 %tmp10, 8 ; <i64> [#uses=0]
%tmp12 = load i64* %size.0, align 8 ; <i64> [#uses=1]
%tmp13 = mul i64 %tmp12, 64 ; <i64> [#uses=0]
%tmp14 = load i64* %size.0, align 8 ; <i64> [#uses=1]
%tmp15 = mul i64 %tmp14, 8 ; <i64> [#uses=1]
%tmp1516 = trunc i64 %tmp15 to i32 ; <i32> [#uses=1]
%tmp17 = alloca i8, i32 %tmp1516 ; <i8*> [#uses=1]
%tmp1718 = bitcast i8* %tmp17 to i8** ; <i8**> [#uses=1]
store i8** %tmp1718, i8*** %additionalKeys.5, align 8
%tmp19 = load i8*** %additionalKeys.5, align 8 ; <i8**> [#uses=1]
invoke void @Foo( i8** %tmp19 )
to label %invcont unwind label %unwind
unwind: ; preds = %bb, %entry
%eh_ptr = call i8* @llvm.eh.exception( ) ; <i8*> [#uses=1]
store i8* %eh_ptr, i8** %eh_exception
%eh_ptr20 = load i8** %eh_exception ; <i8*> [#uses=1]
%eh_select = call i64 (i8*, i8*, ...)* @llvm.eh.selector.i64( i8* %eh_ptr20, i8* bitcast (void ()* @__gxx_personality_v0 to i8*), i8* null ) ; <i64> [#uses=1]
store i64 %eh_select, i64* %eh_selector
br label %cleanup37
invcont: ; preds = %entry
br label %bb30
bb: ; preds = %cond_true
%tmp21 = getelementptr %struct.Range* %range_addr, i32 0, i32 0 ; <i64*> [#uses=1]
%tmp22 = load i64* %tmp21, align 8 ; <i64> [#uses=1]
invoke void @Bar( i64 %tmp22, %struct.Range* %effectiveRange )
to label %invcont23 unwind label %unwind
invcont23: ; preds = %bb
%tmp24 = getelementptr %struct.Range* %range_addr, i32 0, i32 1 ; <i64*> [#uses=1]
%tmp25 = load i64* %tmp24, align 8 ; <i64> [#uses=1]
%tmp26 = getelementptr %struct.Range* %effectiveRange, i32 0, i32 1 ; <i64*> [#uses=1]
%tmp27 = load i64* %tmp26, align 8 ; <i64> [#uses=1]
%tmp28 = sub i64 %tmp25, %tmp27 ; <i64> [#uses=1]
%tmp29 = getelementptr %struct.Range* %range_addr, i32 0, i32 1 ; <i64*> [#uses=1]
store i64 %tmp28, i64* %tmp29, align 8
br label %bb30
bb30: ; preds = %invcont23, %invcont
%tmp31 = getelementptr %struct.Range* %range_addr, i32 0, i32 1 ; <i64*> [#uses=1]
%tmp32 = load i64* %tmp31, align 8 ; <i64> [#uses=1]
%tmp33 = icmp ne i64 %tmp32, 0 ; <i1> [#uses=1]
%tmp3334 = zext i1 %tmp33 to i8 ; <i8> [#uses=1]
%toBool = icmp ne i8 %tmp3334, 0 ; <i1> [#uses=1]
br i1 %toBool, label %cond_true, label %cond_false
cond_true: ; preds = %bb30
br label %bb
cond_false: ; preds = %bb30
br label %bb35
cond_next: ; No predecessors!
br label %bb35
bb35: ; preds = %cond_next, %cond_false
br label %cleanup
cleanup: ; preds = %bb35
%tmp36 = load i8** %saved_stack.7, align 8 ; <i8*> [#uses=1]
call void @llvm.stackrestore( i8* %tmp36 )
br label %finally
cleanup37: ; preds = %unwind
%tmp38 = load i8** %saved_stack.7, align 8 ; <i8*> [#uses=1]
call void @llvm.stackrestore( i8* %tmp38 )
br label %Unwind
finally: ; preds = %cleanup
br label %return
return: ; preds = %finally
ret void
Unwind: ; preds = %cleanup37
%eh_ptr39 = load i8** %eh_exception ; <i8*> [#uses=1]
call void @_Unwind_Resume( i8* %eh_ptr39 )
unreachable
}
declare i8* @llvm.stacksave()
declare void @Foo(i8**)
declare i8* @llvm.eh.exception()
declare i64 @llvm.eh.selector.i64(i8*, i8*, ...)
declare i64 @llvm.eh.typeid.for.i64(i8*)
declare void @__gxx_personality_v0()
declare void @_Unwind_Resume(i8*)
declare void @Bar(i64, %struct.Range*)
declare void @llvm.stackrestore(i8*)
|