declare i32 @printf(i8*, ...) @.str = private unnamed_addr constant [4 x i8] c"%ld\0A", align 1 define i64 @u32_power(i64 %0, i64 %1) { entry: %exponent_alloca = alloca i64, align 8 %base_alloca = alloca i64, align 8 store i64 %0, ptr %base_alloca, align 4 %base = load i64, ptr %base_alloca, align 4 store i64 %1, ptr %exponent_alloca, align 4 %exponent = load i64, ptr %exponent_alloca, align 4 br label %loop loop: ; preds = %loop, %entry %2 = phi i64 [ 0, %entry ], [ %inc, %loop ] %3 = phi i64 [ 1, %entry ], [ %multmp, %loop ] %inc = add i64 %2, 1 %multmp = mul i64 %3, %base %loopcond = icmp ule i64 %inc, %exponent br i1 %loopcond, label %loop, label %exit exit: ; preds = %loop ret i64 %3 } define i32 @main() { entry: %result = call i64 @u32_power(i64 10, i64 3) %formatStr = getelementptr inbounds [4 x i8], [4 x i8]* @.str, i64 0, i64 0 call i32 (i8*, ...) @printf(i8* %formatStr, i64 %result) ret i32 0 }