(module
 (type $0 (func (param i32) (result i32)))
 (memory $0 1 100)
 (export "sieve" (func $sieve))
 (func $sieve (param $0 i32) (result i32)
  (local $1 i32)
  (if
   (i32.lt_u
    (i32.mul
     (memory.size)
     (i32.const 65536)
    )
    (local.get $0)
   )
   (then
    (drop
     (memory.grow
      (i32.sub
       (i32.div_u
        (i32.add
         (local.get $0)
         (i32.const 65535)
        )
        (i32.const 65536)
       )
       (memory.size)
      )
     )
    )
   )
  )
  (local.set $1
   (i32.const 0)
  )
  (loop $clear
   (i32.store8
    (local.get $1)
    (i32.const 0)
   )
   (local.set $1
    (i32.add
     (local.get $1)
     (i32.const 1)
    )
   )
   (br_if $clear
    (i32.eq
     (local.get $1)
     (local.get $0)
    )
   )
  )
  (return
   (local.get $0)
  )
 )
)

optimized:

(module
 (type $0 (func (param i32) (result i32)))
 (memory $0 1 100)
 (export "sieve" (func $sieve))
 (func $sieve (param $0 i32) (result i32)
  (local $1 i32)
  (if
   (i32.lt_u
    (i32.shl
     (memory.size)
     (i32.const 16)
    )
    (local.get $0)
   )
   (then
    (drop
     (memory.grow
      (i32.sub
       (i32.shr_u
        (i32.add
         (local.get $0)
         (i32.const 65535)
        )
        (i32.const 16)
       )
       (memory.size)
      )
     )
    )
   )
  )
  (loop $clear
   (i32.store8
    (local.get $1)
    (i32.const 0)
   )
   (br_if $clear
    (i32.eq
     (local.tee $1
      (i32.add
       (local.get $1)
       (i32.const 1)
      )
     )
     (local.get $0)
    )
   )
  )
  (local.get $0)
 )
)

