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 139 140
|
; Make sure this doesn't turn into an infinite loop
; RUN: llvm-upgrade < %s | llvm-as | opt -simplifycfg -constprop -simplifycfg |\
; RUN: llvm-dis | grep bb86
; END.
%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
}
|