Advertisement
Guest User

Untitled

a guest
Aug 22nd, 2019
188
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
LLVM 3.40 KB | None | 0 0
  1. square_sum a, b -> {
  2.  a * a + b * b
  3. }
  4.  
  5. max a, b -> {
  6.   imm x = if a > b {
  7.     a
  8.   } else {
  9.     b
  10.   }
  11.   x
  12. }
  13.  
  14. fib n i32 -> i32 {
  15.   if n == 1 || n == 2 {
  16.     1
  17.   }
  18.   else {
  19.     fib n - 1 + fib n - 2
  20.   }
  21. }
  22.  
  23. main {
  24.   square_sum 1 2
  25.   fib 12
  26.   max 5 6
  27. }
  28.  
  29. define internal i32 @fib(i32 %n) {
  30.   %n1 = alloca i32
  31.   store i32 %n, i32* %n1
  32.   %1 = load i32, i32* %n1
  33.   %eqtmp = icmp eq i32 %1, 1
  34.   %2 = load i32, i32* %n1
  35.   %eqtmp2 = icmp eq i32 %2, 2
  36.   %3 = or i1 %eqtmp, %eqtmp2
  37.   br i1 %3, label %then, label %else
  38.  
  39. then:                                             ; preds = %0
  40.   br label %cont
  41.  
  42. else:                                             ; preds = %0
  43.   %4 = load i32, i32* %n1
  44.   %subtmp = sub i32 %4, 1
  45.   %calltmp = call i32 @fib(i32 %subtmp)
  46.   %5 = load i32, i32* %n1
  47.   %subtmp3 = sub i32 %5, 2
  48.   %calltmp4 = call i32 @fib(i32 %subtmp3)
  49.   %addtmp = add i32 %calltmp, %calltmp4
  50.   br label %cont
  51.  
  52. cont:                                             ; preds = %else, %then
  53.   %iftmp = phi i32 [ 1, %then ], [ %addtmp, %else ]
  54.   ret i32 %iftmp
  55. }
  56.  
  57. define internal void @main() {
  58.   %calltmp = call i32 @square_sum(i32 1, i32 2)
  59.   %calltmp1 = call i32 @fib(i32 12)
  60.   %calltmp2 = call i32 @max(i32 5, i32 6)
  61.   ret void
  62. }
  63.  
  64. define internal i32 @square_sum(i32 %a, i32 %b) {
  65.   %b2 = alloca i32
  66.   %a1 = alloca i32
  67.   store i32 %a, i32* %a1
  68.   store i32 %b, i32* %b2
  69.   %1 = load i32, i32* %a1
  70.   %2 = load i32, i32* %a1
  71.   %multmp = mul i32 %1, %2
  72.   %3 = load i32, i32* %b2
  73.   %4 = load i32, i32* %b2
  74.   %multmp3 = mul i32 %3, %4
  75.   %addtmp = add i32 %multmp, %multmp3
  76.   ret i32 %addtmp
  77. }
  78.  
  79. define internal i32 @max(i32 %a, i32 %b) {
  80.   %x = alloca i32
  81.   %b2 = alloca i32
  82.   %a1 = alloca i32
  83.   store i32 %a, i32* %a1
  84.   store i32 %b, i32* %b2
  85.   %1 = load i32, i32* %a1
  86.   %2 = load i32, i32* %b2
  87.   %sgttmp = icmp sgt i32 %1, %2
  88.   br i1 %sgttmp, label %then, label %else
  89.  
  90. then:                                             ; preds = %0
  91.   %3 = load i32, i32* %a1
  92.   br label %cont
  93.  
  94. else:                                             ; preds = %0
  95.   %4 = load i32, i32* %b2
  96.   br label %cont
  97.  
  98. cont:                                             ; preds = %else, %then
  99.   %iftmp = phi i32 [ %3, %then ], [ %4, %else ]
  100.   store i32 %iftmp, i32* %x
  101.   %5 = load i32, i32* %x
  102.   ret i32 %5
  103. }
  104.  
  105. OPTIMIZED:
  106.  
  107. define internal i32 @fib(i32 %n) {
  108.   br label %tailrecurse
  109.  
  110. tailrecurse:                                      ; preds = %else, %0
  111.   %accumulator.tr = phi i32 [ 1, %0 ], [ %addtmp, %else ]
  112.   %n.tr = phi i32 [ %n, %0 ], [ %subtmp3, %else ]
  113.   %n.off = add i32 %n.tr, -1
  114.   %switch = icmp ult i32 %n.off, 2
  115.   br i1 %switch, label %cont, label %else
  116.  
  117. else:                                             ; preds = %tailrecurse
  118.   %subtmp = sub i32 %n.tr, 1
  119.   %calltmp = tail call i32 @fib(i32 %subtmp)
  120.   %subtmp3 = sub i32 %n.tr, 2
  121.   %addtmp = add i32 %calltmp, %accumulator.tr
  122.   br label %tailrecurse
  123.  
  124. cont:                                             ; preds = %tailrecurse
  125.   %accumulator.tr.lcssa = phi i32 [ %accumulator.tr, %tailrecurse ]
  126.   ret i32 %accumulator.tr.lcssa
  127. }
  128.  
  129. define internal void @main() {
  130.   %calltmp = tail call i32 @square_sum(i32 1, i32 2)
  131.   %calltmp1 = tail call i32 @fib(i32 12)
  132.   %calltmp2 = tail call i32 @max(i32 5, i32 6)
  133.   ret void
  134. }
  135.  
  136. define internal i32 @square_sum(i32 %a, i32 %b) {
  137.   ret i32 5
  138. }
  139.  
  140. define internal i32 @max(i32 %a, i32 %b) {
  141. else:
  142.   ret i32 6
  143. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement