1 year ago
#371187
ang0110
Algorithm that was supposed to go into recurse does not go into recurse
I am pretty new to LLVM IR and I am trying to convert the following into LLVM IR
double sum(double *input, int n) {
double result = input[0] + ... + input[n-1]
return result
}
and this is what I have done:
%free_func = type void (double*)*
%list = type { %list*, double*, %free_func }
define double @sum(double* %ptr, i32 %n) {
entry:
%var1 = alloca i32
store i32 %n, i32* %var1
%var2 = alloca double*
store double* %ptr, double** %var2
%conv1.1 = load i32, i32* %var1
%tmp1 = icmp sle i32 %conv1.1, 0
br i1 %tmp1, label %recurse, label %done
recurse:
%0 = bitcast double** %var2 to %list* ; base field
%1 = bitcast double** %var2 to %list** ; next field
%2 = bitcast double** %var2 to %list*** ; next next field
%3 = bitcast %list* %0 to i16*
%conv2.1 = load i16, i16* %3
%4 = bitcast %list** %1 to i16*
%conv2.2 = load i16, i16* %4
%tmp2 = add nsw i16 %conv2.2, %conv2.1 ; add base value & next value
%tmp3 = alloca i16
store i16 %tmp2, i16* %tmp3
%5 = bitcast i16* %tmp3 to %list* ; convert vector back to list
store %list* %5, %list** %1 ; replace next value with sum
%conv3.1 = load %list*, %list** %1 ; replace base with next
%conv3.2 = load %list**, %list*** %2 ; replace next with next next
%6 = bitcast %list* %conv3.1 to double* ; convert list back to double
%tmp5 = sub nsw i32 %conv1.1, 1
%tmp6 = call double @sum(double* %6, i32 %tmp5)
ret double %tmp6
done:
%conv6.1 = load double, double* %ptr
ret double %conv6.1
}
It seems to go straight to done
without going through recurse
and I am not sure what is wrong. May I ask for tips on how to make this work? Thank you and I am sorry if the code looks messy because I've only just started learning and am practising.
llvm
llvm-ir
0 Answers
Your Answer