summaryrefslogtreecommitdiff
path: root/test/Transforms/SimplifyCFG/2005-12-03-IncorrectPHIFold.ll
blob: 18cbc17652675d0593cf54b163d0079117d904a4 (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
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
134
135
136
137
138
; Make sure this doesn't turn into an infinite loop

; RUN: llvm-as < %s | opt -simplifycfg -constprop -simplifycfg | llvm-dis | grep bb86

	%struct.anon = type { uint, int, int, int, [1024 x sbyte] }
%_zero_ = external global %struct.anon*		; <%struct.anon**> [#uses=2]
%_one_ = external global %struct.anon*		; <%struct.anon**> [#uses=4]
%str = internal constant [4 x sbyte] c"%d\0A\00"		; <[4 x sbyte]*> [#uses=1]

implementation   ; Functions:


declare int %bc_compare(%struct.anon*, %struct.anon*)

declare void %free_num(%struct.anon**)

declare %struct.anon* %copy_num(%struct.anon*)

declare void %init_num(%struct.anon**)

declare %struct.anon* %new_num(int, int)

declare void %int2num(%struct.anon**, int)

declare void %bc_multiply(%struct.anon*, %struct.anon*, %struct.anon**, int)

declare void %bc_raise(%struct.anon*, %struct.anon*, %struct.anon**, int)

declare int %bc_divide(%struct.anon*, %struct.anon*, %struct.anon**, int)

declare void %bc_add(%struct.anon*, %struct.anon*, %struct.anon**)

declare int %_do_compare(%struct.anon*, %struct.anon*, int, int)

declare int %printf(sbyte*, ...)

int %bc_sqrt(%struct.anon** %num, int %scale) {
entry:
	%guess = alloca %struct.anon*		; <%struct.anon**> [#uses=15]
	%guess1 = alloca %struct.anon*		; <%struct.anon**> [#uses=12]
	%point5 = alloca %struct.anon*		; <%struct.anon**> [#uses=4]
	%tmp = load %struct.anon** %num		; <%struct.anon*> [#uses=1]
	%tmp1 = load %struct.anon** %_zero_		; <%struct.anon*> [#uses=1]
	%tmp = call int %bc_compare( %struct.anon* %tmp, %struct.anon* %tmp1 )		; <int> [#uses=2]
	%tmp = setlt int %tmp, 0		; <bool> [#uses=1]
	br bool %tmp, label %cond_true, label %cond_false

cond_true:		; preds = %entry
	ret int 0

cond_false:		; preds = %entry
	%tmp5 = seteq int %tmp, 0		; <bool> [#uses=1]
	br bool %tmp5, label %cond_true6, label %cond_next13

cond_true6:		; preds = %cond_false
	call void %free_num( %struct.anon** %num )
	%tmp8 = load %struct.anon** %_zero_		; <%struct.anon*> [#uses=1]
	%tmp9 = call %struct.anon* %copy_num( %struct.anon* %tmp8 )		; <%struct.anon*> [#uses=1]
	store %struct.anon* %tmp9, %struct.anon** %num
	ret int 1

cond_next13:		; preds = %cond_false
	%tmp15 = load %struct.anon** %num		; <%struct.anon*> [#uses=1]
	%tmp16 = load %struct.anon** %_one_		; <%struct.anon*> [#uses=1]
	%tmp17 = call int %bc_compare( %struct.anon* %tmp15, %struct.anon* %tmp16 )		; <int> [#uses=2]
	%tmp19 = seteq int %tmp17, 0		; <bool> [#uses=1]
	br bool %tmp19, label %cond_true20, label %cond_next27

cond_true20:		; preds = %cond_next13
	call void %free_num( %struct.anon** %num )
	%tmp22 = load %struct.anon** %_one_		; <%struct.anon*> [#uses=1]
	%tmp23 = call %struct.anon* %copy_num( %struct.anon* %tmp22 )		; <%struct.anon*> [#uses=1]
	store %struct.anon* %tmp23, %struct.anon** %num
	ret int 1

cond_next27:		; preds = %cond_next13
	%tmp29 = load %struct.anon** %num		; <%struct.anon*> [#uses=1]
	%tmp30 = getelementptr %struct.anon* %tmp29, int 0, uint 2		; <int*> [#uses=1]
	%tmp31 = load int* %tmp30		; <int> [#uses=2]
	%tmp33 = setge int %tmp31, %scale		; <bool> [#uses=1]
	%max = select bool %tmp33, int %tmp31, int %scale		; <int> [#uses=4]
	%tmp35 = add int %max, 2		; <int> [#uses=2]
	call void %init_num( %struct.anon** %guess )
	call void %init_num( %struct.anon** %guess1 )
	%tmp36 = call %struct.anon* %new_num( int 1, int 1 )		; <%struct.anon*> [#uses=2]
	store %struct.anon* %tmp36, %struct.anon** %point5
	%tmp = getelementptr %struct.anon* %tmp36, int 0, uint 4, int 1		; <sbyte*> [#uses=1]
	store sbyte 5, sbyte* %tmp
	%tmp39 = setlt int %tmp17, 0		; <bool> [#uses=1]
	br bool %tmp39, label %cond_true40, label %cond_false43

cond_true40:		; preds = %cond_next27
	%tmp41 = load %struct.anon** %_one_		; <%struct.anon*> [#uses=1]
	%tmp42 = call %struct.anon* %copy_num( %struct.anon* %tmp41 )		; <%struct.anon*> [#uses=1]
	store %struct.anon* %tmp42, %struct.anon** %guess
	br label %bb80.outer

cond_false43:		; preds = %cond_next27
	call void %int2num( %struct.anon** %guess, int 10 )
	%tmp45 = load %struct.anon** %num		; <%struct.anon*> [#uses=1]
	%tmp46 = getelementptr %struct.anon* %tmp45, int 0, uint 1		; <int*> [#uses=1]
	%tmp47 = load int* %tmp46		; <int> [#uses=1]
	call void %int2num( %struct.anon** %guess1, int %tmp47 )
	%tmp48 = load %struct.anon** %guess1		; <%struct.anon*> [#uses=1]
	%tmp49 = load %struct.anon** %point5		; <%struct.anon*> [#uses=1]
	call void %bc_multiply( %struct.anon* %tmp48, %struct.anon* %tmp49, %struct.anon** %guess1, int %max )
	%tmp51 = load %struct.anon** %guess1		; <%struct.anon*> [#uses=1]
	%tmp52 = getelementptr %struct.anon* %tmp51, int 0, uint 2		; <int*> [#uses=1]
	store int 0, int* %tmp52
	%tmp53 = load %struct.anon** %guess		; <%struct.anon*> [#uses=1]
	%tmp54 = load %struct.anon** %guess1		; <%struct.anon*> [#uses=1]
	call void %bc_raise( %struct.anon* %tmp53, %struct.anon* %tmp54, %struct.anon** %guess, int %max )
	br label %bb80.outer

bb80.outer:		; preds = %cond_true77, %cond_next56
	%done.1.ph = phi int [ 1, %cond_true83 ], [0, %cond_true40], [0, %cond_false43]		; <int> [#uses=1]
	br label %bb80

bb80:		; preds = %bb80.outer, %cond_true83
	%tmp82 = seteq int %done.1.ph, 0		; <bool> [#uses=1]
	br bool %tmp82, label %cond_true83, label %bb86

cond_true83:		; preds = %bb80
	%tmp71 = call int %_do_compare( %struct.anon* null, %struct.anon* null, int 0, int 1 )		; <int> [#uses=2]
	%tmp76 = seteq int %tmp71, 0		; <bool> [#uses=1]
	br bool %tmp76, label %bb80.outer, label %bb80

bb86:		; preds = %bb80
	call void %free_num( %struct.anon** %num )
	%tmp88 = load %struct.anon** %guess		; <%struct.anon*> [#uses=1]
	%tmp89 = load %struct.anon** %_one_		; <%struct.anon*> [#uses=1]
	%tmp92 = call int %bc_divide( %struct.anon* %tmp88, %struct.anon* %tmp89, %struct.anon** %num, int %max )		; <int> [#uses=0]
	call void %free_num( %struct.anon** %guess )
	call void %free_num( %struct.anon** %guess1 )
	call void %free_num( %struct.anon** %point5 )
	ret int 1
}