function: render_frame (entry: bb_0x2010)

loops: 1 (0 with a derived trip count; max nesting depth 1)
  iters = executions of a block per single call of render_frame (product of enclosing trip counts);
  ? = not derivable from the code — treat that block's cost as per-iteration, not per-call.
  A block with no iters annotation is in no loop and runs once per call.
  L1  loop  header bb_0x203a  latch bb_0x2024  depth 1  blocks 2  trips ?  (limit is not an immediate compare)

[render_frame_0x2010] 0x2010-0x2024  (entry)
source: blink.c:37:41;
  push {r7, lr}
  sub sp, #0x10
  add r7, sp, #0
  str r0, [r7, #4]
  str r1, [r7]
  movs r3, #0
  str r3, [r7, #8]
  movs r3, #0
  str r3, [r7, #0xc]
  b #0x203a
  -> bb_0x203a

[render_frame_0x2024] 0x2024-0x203a  (in L1, iters=?)
source: blink.c:41:42;
  ldr r3, [r7, #0xc]
  ldr r2, [r7, #4]
  adds r3, r2, r3
  ldrb r3, [r3]
  movs r2, r3
  ldr r3, [r7, #8]
  adds r3, r3, r2
  str r3, [r7, #8]
  ldr r3, [r7, #0xc]
  adds r3, #1
  str r3, [r7, #0xc]
  -> bb_0x203a (back-edge, loop L1)

[render_frame_0x203a] 0x203a-0x2042  (loop-header L1, trips=?, iters=?)
source: blink.c:41:41;
  ldr r2, [r7, #0xc]
  ldr r3, [r7]
  cmp r2, r3
  blt #0x2024
  -> bb_0x2024 (lt=taken), bb_0x2042 (ge=fallthrough)

[render_frame_0x2042] 0x2042-0x2050  (exit)
source: blink.c:43:44;
  ldr r3, [pc, #0xc]
  ldr r2, [r7, #8]
  str r2, [r3]
  mov r8, r8
  mov sp, r7
  add sp, #0x10
  pop {r7, pc}

------------------------------------------------------------

function: build_pattern (entry: bb_0x2054)

loops: 1 (0 with a derived trip count; max nesting depth 1)
  iters = executions of a block per single call of build_pattern (product of enclosing trip counts);
  ? = not derivable from the code — treat that block's cost as per-iteration, not per-call.
  A block with no iters annotation is in no loop and runs once per call.
  L1  loop  header bb_0x2096  latch bb_0x2066  depth 1  blocks 2  trips ?  (limit is not an immediate compare)

[build_pattern_0x2054] 0x2054-0x2066  (entry)
source: blink.c:48:52;
  push {r7, lr}
  ldr r7, [pc, #0x64]
  add sp, r7
  add r7, sp, #0
  movs r3, #0
  ldr r2, [pc, #0x60]
  adds r2, r7, r2
  str r3, [r2]
  b #0x2096
  -> bb_0x2096

[build_pattern_0x2066] 0x2066-0x2096  (in L1, iters=?)
source: blink.c:52:53;
  ldr r0, [pc, #0x58]
  adds r3, r7, r0
  ldr r3, [r3]
  uxtb r3, r3
  adds r2, r3, #0
  lsls r2, r2, #5
  subs r3, r2, r3
  uxtb r3, r3
  adds r3, #7
  uxtb r1, r3
  ldr r3, [pc, #0x48]
  ldr r2, [pc, #0x48]
  adds r3, r3, r2
  adds r2, r3, r7
  adds r3, r7, r0
  ldr r3, [r3]
  adds r3, r2, r3
  adds r2, r1, #0
  strb r2, [r3]
  adds r3, r7, r0
  ldr r3, [r3]
  adds r3, #1
  adds r2, r7, r0
  str r3, [r2]
  -> bb_0x2096 (back-edge, loop L1)

[build_pattern_0x2096] 0x2096-0x20a4  (loop-header L1, trips=?, iters=?)
source: blink.c:52:52;
  ldr r3, [pc, #0x28]
  adds r3, r7, r3
  ldr r2, [r3]
  movs r3, #0xc0
  lsls r3, r3, #4
  cmp r2, r3
  blt #0x2066
  -> bb_0x2066 (lt=taken), bb_0x20a4 (ge=fallthrough)

[build_pattern_0x20a4] 0x20a4-0x20b2
source: blink.c:54:54;
  movs r3, #0xc0
  lsls r2, r3, #4
  adds r3, r7, #4
  movs r1, r2
  movs r0, r3
  bl #0x2010
  -> bb_0x20b2

[build_pattern_0x20b2] 0x20b2-0x20bc  (exit)
source: blink.c:55:55;
  mov r8, r8
  mov sp, r7
  ldr r3, [pc, #0x10]
  add sp, r3
  pop {r7, pc}

------------------------------------------------------------

function: kernel_main (entry: bb_0x20cc)

loops: 3 (0 with a derived trip count; max nesting depth 2)
  iters = executions of a block per single call of kernel_main (product of enclosing trip counts);
  ? = not derivable from the code — treat that block's cost as per-iteration, not per-call.
  A block with no iters annotation is in no loop and runs once per call.
  L1  loop  header bb_0x20e8  latch bb_0x2134  depth 1  blocks 8  trips ?  (no exit test inside the loop — exit is unconditional or indirect)
  L2  loop  header bb_0x20fe  latch bb_0x20f4  depth 2  in L1  blocks 2  trips ?  (limit is not an immediate compare)
  L3  loop  header bb_0x212a  latch bb_0x2120  depth 2  in L1  blocks 2  trips ?  (limit is not an immediate compare)

[kernel_main_0x20cc] 0x20cc-0x20e8  (entry)
source: blink.c:58:60;
  push {r7, lr}
  add r7, sp, #0
  ldr r3, [pc, #0x74]
  ldr r2, [pc, #0x78]
  str r2, [r3]
  ldr r3, [pc, #0x70]
  ldr r3, [r3]
  ldr r2, [r3]
  ldr r3, [pc, #0x68]
  ldr r3, [r3]
  movs r1, #0x80
  lsls r1, r1, #3
  orrs r2, r1
  str r2, [r3]
  -> bb_0x20e8

[kernel_main_0x20e8] 0x20e8-0x20ec  (loop-header L1, trips=?, iters=?)
source: blink.c:63:63;
  bl #0x2054
  -> bb_0x20ec

[kernel_main_0x20ec] 0x20ec-0x20f4  (in L1, iters=?)
source: blink.c:65:65;
  ldr r3, [pc, #0x60]
  movs r2, #0
  str r2, [r3]
  b #0x20fe
  -> bb_0x20fe

[kernel_main_0x20f4] 0x20f4-0x20fe  (in L2, iters=?)
source: blink.c:65:65;
  ldr r3, [pc, #0x58]
  ldr r3, [r3]
  adds r2, r3, #1
  ldr r3, [pc, #0x54]
  str r2, [r3]
  -> bb_0x20fe (back-edge, loop L2)

[kernel_main_0x20fe] 0x20fe-0x2108  (loop-header L2, trips=?, in L1, iters=?)
source: blink.c:65:65;
  ldr r3, [pc, #0x50]
  ldr r3, [r3]
  ldr r2, [pc, #0x50]
  cmp r3, r2
  bls #0x20f4
  -> bb_0x20f4 (ls=taken), bb_0x2108 (hi=fallthrough)

[kernel_main_0x2108] 0x2108-0x2120  (in L1, iters=?)
source: blink.c:68:71;
  ldr r3, [pc, #0x3c]
  ldr r2, [pc, #0x4c]
  str r2, [r3]
  ldr r3, [pc, #0x38]
  ldr r3, [r3]
  movs r2, #0x80
  lsls r2, r2, #3
  str r2, [r3]
  ldr r3, [pc, #0x34]
  movs r2, #0
  str r2, [r3]
  b #0x212a
  -> bb_0x212a

[kernel_main_0x2120] 0x2120-0x212a  (in L3, iters=?)
source: blink.c:71:71;
  ldr r3, [pc, #0x2c]
  ldr r3, [r3]
  adds r2, r3, #1
  ldr r3, [pc, #0x28]
  str r2, [r3]
  -> bb_0x212a (back-edge, loop L3)

[kernel_main_0x212a] 0x212a-0x2134  (loop-header L3, trips=?, in L1, iters=?)
source: blink.c:71:71;
  ldr r3, [pc, #0x24]
  ldr r3, [r3]
  ldr r2, [pc, #0x24]
  cmp r3, r2
  bls #0x2120
  -> bb_0x2120 (ls=taken), bb_0x2134 (hi=fallthrough)

[kernel_main_0x2134] 0x2134-0x2146  (in L1, iters=?)
source: blink.c:63:75;
  ldr r3, [pc, #0x10]
  ldr r2, [pc, #0x24]
  str r2, [r3]
  ldr r3, [pc, #0xc]
  ldr r3, [r3]
  movs r2, #0x80
  lsls r2, r2, #3
  str r2, [r3]
  b #0x20e8
  -> bb_0x20e8 (back-edge, loop L1)

[kernel_main_0x2146] 0x2146-0x2148  (exit)
source: blink.c:63:63;
  mov r8, r8
