module { func.func @reduce(%buffer: memref, %lb: index, %ub: index, %step: index) -> f32 { ; Initial sum set to 0. %sum.0 = arith.constant 0.0 : f32 ; iter_args binds initial values to the loop's region arguments. ;%sum = "scf.for"(%lb, %ub, %step) -> (f32) { cf.br ^for.entry(%lb: index, %sum.0: f32) ^for.entry(%iv: index, %sum.iter: f32): %t = memref.load %buffer[%iv] : memref %sum.next = arith.addf %sum.iter, %t : f32 cf.br ^for.cond(%iv: index, %sum.next: f32) ^for.cond(%iv2: index, %sum.next2: f32): ; Yield current iteration sum to next iteration %sum.iter or to %sum ; if final iteration. %iv.next = arith.addi %iv, %step : index %stop = arith.cmpi uge %iv.next, %ub : index cf.br-cond %stop, ^for.end, ^for.entry(%iv.next: index, %sum.next: f32) ^for.end(%sum: f32): func.return %sum : f32 } }