Renderingen-US

LLVM IR

MIR staging text for external LLVM tools. Also the route CUDA device programs take, via NVVM → PTX.

Part of the MIR lane. Every panel below is compiler output.

How to read it#

The widest ratio on the site, and the least surprising one: SSA form names every intermediate. Read it for what the compiler knows about your program, not as something to maintain.

Typed tensors#

Builds two shaped matrices, multiplies them, and reduces the product to a scalar. Exercises shape-bearing types and a reduction.

Faber source

reader locale
faber format --locale en — English reader surface
main {
    const list<f32> flat_a  [1.0, 2.0, 3.0, 4.0, 5.0, 6.0]
    const list<f32> flat_b  [1.0, 2.0, 3.0, 4.0, 5.0, 6.0, 7.0, 8.0, 9.0, 10.0, 11.0, 12.0]
    const tensor<f32, []> seed  vacua
    const tensor<f32, [2, 3]> a  seed.strue(flat_a, [2, 3])
    const tensor<f32, [3, 4]> b  seed.strue(flat_b, [3, 4])
    const tensor<f32, [2, 4]> product  a.matmul(b)
    const f32 mean  product.media()
    print mean
}
faber format --locale la — canonical Faber
incipit {
    fixum lista<f32> flat_a  [1.0, 2.0, 3.0, 4.0, 5.0, 6.0]
    fixum lista<f32> flat_b  [1.0, 2.0, 3.0, 4.0, 5.0, 6.0, 7.0, 8.0, 9.0, 10.0, 11.0, 12.0]
    fixum tensor<f32, []> seed  vacua
    fixum tensor<f32, [2, 3]> a  seed.strue(flat_a, [2, 3])
    fixum tensor<f32, [3, 4]> b  seed.strue(flat_b, [3, 4])
    fixum tensor<f32, [2, 4]> product  a.matmul(b)
    fixum f32 mean  product.media()
    nota mean
}
faber format --locale th-TH — Thai
เริ่ม {
    คงที่ รายการ<f32> flat_a  [1.0, 2.0, 3.0, 4.0, 5.0, 6.0]
    คงที่ รายการ<f32> flat_b  [1.0, 2.0, 3.0, 4.0, 5.0, 6.0, 7.0, 8.0, 9.0, 10.0, 11.0, 12.0]
    คงที่ เทนเซอร์<f32, []> seed  เซตว่าง
    คงที่ เทนเซอร์<f32, [2, 3]> a  seed.strue(flat_a, [2, 3])
    คงที่ เทนเซอร์<f32, [3, 4]> b  seed.strue(flat_b, [3, 4])
    คงที่ เทนเซอร์<f32, [2, 4]> product  a.matmul(b)
    คงที่ f32 mean  product.media()
    บันทึก mean
}
faber format --locale zh-Hans — Simplified Chinese
入口 {
    常量 列表<f32> flat_a  [1.0, 2.0, 3.0, 4.0, 5.0, 6.0]
    常量 列表<f32> flat_b  [1.0, 2.0, 3.0, 4.0, 5.0, 6.0, 7.0, 8.0, 9.0, 10.0, 11.0, 12.0]
    常量 张量<f32, []> seed  空集
    常量 张量<f32, [2, 3]> a  seed.strue(flat_a, [2, 3])
    常量 张量<f32, [3, 4]> b  seed.strue(flat_b, [3, 4])
    常量 张量<f32, [2, 4]> product  a.matmul(b)
    常量 f32 mean  product.media()
    显示 mean
}
faber format --locale zh-Hant — Traditional Chinese
入口 {
    定值 列表<f32> flat_a  [1.0, 2.0, 3.0, 4.0, 5.0, 6.0]
    定值 列表<f32> flat_b  [1.0, 2.0, 3.0, 4.0, 5.0, 6.0, 7.0, 8.0, 9.0, 10.0, 11.0, 12.0]
    定值 張量<f32, []> seed  空集
    定值 張量<f32, [2, 3]> a  seed.strue(flat_a, [2, 3])
    定值 張量<f32, [3, 4]> b  seed.strue(flat_b, [3, 4])
    定值 張量<f32, [2, 4]> product  a.matmul(b)
    定值 f32 mean  product.media()
    註記 mean
}
faber format --locale vi — Vietnamese
bắt_đầu {
    hằng danh_sách<f32> flat_a  [1.0, 2.0, 3.0, 4.0, 5.0, 6.0]
    hằng danh_sách<f32> flat_b  [1.0, 2.0, 3.0, 4.0, 5.0, 6.0, 7.0, 8.0, 9.0, 10.0, 11.0, 12.0]
    hằng ten_xo<f32, []> seed  tập_rỗng
    hằng ten_xo<f32, [2, 3]> a  seed.strue(flat_a, [2, 3])
    hằng ten_xo<f32, [3, 4]> b  seed.strue(flat_b, [3, 4])
    hằng ten_xo<f32, [2, 4]> product  a.matmul(b)
    hằng f32 mean  product.media()
    ghi_chú mean
}
faber format --locale ar — Arabic
بداية {
    ثابت قائمة<f32> flat_a  [1.0, 2.0, 3.0, 4.0, 5.0, 6.0]
    ثابت قائمة<f32> flat_b  [1.0, 2.0, 3.0, 4.0, 5.0, 6.0, 7.0, 8.0, 9.0, 10.0, 11.0, 12.0]
    ثابت موتر<f32, []> seed  فارغ
    ثابت موتر<f32, [2, 3]> a  seed.strue(flat_a, [2, 3])
    ثابت موتر<f32, [3, 4]> b  seed.strue(flat_b, [3, 4])
    ثابت موتر<f32, [2, 4]> product  a.matmul(b)
    ثابت f32 mean  product.media()
    اعرض mean
}
faber format --locale hi — Hindi
आरंभ {
    स्थिर सूची<f32> flat_a  [1.0, 2.0, 3.0, 4.0, 5.0, 6.0]
    स्थिर सूची<f32> flat_b  [1.0, 2.0, 3.0, 4.0, 5.0, 6.0, 7.0, 8.0, 9.0, 10.0, 11.0, 12.0]
    स्थिर टेंसर<f32, []> seed  खाली
    स्थिर टेंसर<f32, [2, 3]> a  seed.strue(flat_a, [2, 3])
    स्थिर टेंसर<f32, [3, 4]> b  seed.strue(flat_b, [3, 4])
    स्थिर टेंसर<f32, [2, 4]> product  a.matmul(b)
    स्थिर f32 mean  product.media()
    दिखाओ mean
}

LLVM IR — 10 lines in, 397 out (39.7×)

; Generated by radix MIR LLVM IR probe - experimental artifact.
%FaberRtSliceV1 = type { ptr, i64 }
%FaberRtExitV1 = type i64
%FaberRtPtrResultV1 = type { i32, ptr }
%FaberRtStatusV1 = type { i32 }
@__faber_rt_v1_context = linkonce_odr global ptr null
@__faber_rt_v1_status = linkonce_odr global i32 0
declare void @__faber_rt_v1_fatal(ptr, %FaberRtSliceV1) noreturn
declare void @__faber_rt_v1_numerus_overflow(ptr) noreturn


; @runtime __faber_rt_v1_array_new category=core-semantics
declare %FaberRtPtrResultV1 @__faber_rt_v1_array_new(ptr, i32)
; @runtime __faber_rt_v1_array_push category=core-semantics
declare i32 @__faber_rt_v1_array_push(ptr, ptr, i32, ptr)
; @runtime __faber_rt_v1_diagnostic_nota_f32 category=host-integration
declare i32 @__faber_rt_v1_diagnostic_nota_f32(ptr, float)
; @runtime __faber_rt_v1_tensor_from_flat category=core-semantics
declare %FaberRtPtrResultV1 @__faber_rt_v1_tensor_from_flat(ptr, i32, ptr, ptr)
; @runtime __faber_rt_v1_tensor_matmul category=core-semantics
declare %FaberRtPtrResultV1 @__faber_rt_v1_tensor_matmul(ptr, ptr, ptr)
; @runtime __faber_rt_v1_tensor_mean category=core-semantics
declare i32 @__faber_rt_v1_tensor_mean(ptr, ptr, i32, ptr)
; @runtime __faber_rt_v1_tensor_new category=core-semantics
declare %FaberRtPtrResultV1 @__faber_rt_v1_tensor_new(ptr, i32)

define void @incipit() {
    entry:
      %l0.addr = alloca ptr
      %l1.addr = alloca ptr
      %l2.addr = alloca ptr
      %l3.addr = alloca ptr
      %l4.addr = alloca ptr
      %l5.addr = alloca ptr
      %l6.addr = alloca float
      %t0.addr = alloca float
      %t1.addr = alloca float
      %t2.addr = alloca float
      %t3.addr = alloca float
      %t4.addr = alloca float
      %t5.addr = alloca float
      %t6.addr = alloca ptr
      %t7.addr = alloca float
      %t8.addr = alloca float
      %t9.addr = alloca float
      %t10.addr = alloca float
      %t11.addr = alloca float
      %t12.addr = alloca float
      %t13.addr = alloca float
      %t14.addr = alloca float
      %t15.addr = alloca float
      %t16.addr = alloca float
      %t17.addr = alloca float
      %t18.addr = alloca float
      %t19.addr = alloca ptr
      %t20.addr = alloca ptr
      %t21.addr = alloca ptr
      %t22.addr = alloca ptr
      %t23.addr = alloca ptr
      %t24.addr = alloca ptr
      %t25.addr = alloca ptr
      %t26.addr = alloca float
      br label %b0
    b0:
      %cast0 = fptrunc double 1.0 to float
      store float %cast0, ptr %t0.addr
      %cast1 = fptrunc double 2.0 to float
      store float %cast1, ptr %t1.addr
      %cast2 = fptrunc double 3.0 to float
      store float %cast2, ptr %t2.addr
      %cast3 = fptrunc double 4.0 to float
      store float %cast3, ptr %t3.addr
      %cast4 = fptrunc double 5.0 to float
      store float %cast4, ptr %t4.addr
      %cast5 = fptrunc double 6.0 to float
      store float %cast5, ptr %t5.addr
      %faber.context6 = load ptr, ptr @__faber_rt_v1_context
      %faber.array.result6 = call %FaberRtPtrResultV1 @__faber_rt_v1_array_new(ptr %faber.context6, i32 5)
      %faber.array.status6 = extractvalue %FaberRtPtrResultV1 %faber.array.result6, 0
      %faber.array.handle6 = extractvalue %FaberRtPtrResultV1 %faber.array.result6, 1
      %faber.old.status6 = load i32, ptr @__faber_rt_v1_status
      %faber.has.error6 = icmp ne i32 %faber.old.status6, 0
      %faber.latched.status6 = select i1 %faber.has.error6, i32 %faber.old.status6, i32 %faber.array.status6
      store i32 %faber.latched.status6, ptr @__faber_rt_v1_status
      %load8 = load float, ptr %t0.addr
      %faber.array.value7 = alloca float
      store float %load8, ptr %faber.array.value7
      %faber.array.status7 = call i32 @__faber_rt_v1_array_push(ptr %faber.context6, ptr %faber.array.handle6, i32 5, ptr %faber.array.value7)
      %faber.old.status7 = load i32, ptr @__faber_rt_v1_status
      %faber.has.error7 = icmp ne i32 %faber.old.status7, 0
      %faber.latched.status7 = select i1 %faber.has.error7, i32 %faber.old.status7, i32 %faber.array.status7
      store i32 %faber.latched.status7, ptr @__faber_rt_v1_status
      %load10 = load float, ptr %t1.addr
      %faber.array.value9 = alloca float
      store float %load10, ptr %faber.array.value9
      %faber.array.status9 = call i32 @__faber_rt_v1_array_push(ptr %faber.context6, ptr %faber.array.handle6, i32 5, ptr %faber.array.value9)
      %faber.old.status9 = load i32, ptr @__faber_rt_v1_status
      %faber.has.error9 = icmp ne i32 %faber.old.status9, 0
      %faber.latched.status9 = select i1 %faber.has.error9, i32 %faber.old.status9, i32 %faber.array.status9
      store i32 %faber.latched.status9, ptr @__faber_rt_v1_status
      %load12 = load float, ptr %t2.addr
      %faber.array.value11 = alloca float
      store float %load12, ptr %faber.array.value11
      %faber.array.status11 = call i32 @__faber_rt_v1_array_push(ptr %faber.context6, ptr %faber.array.handle6, i32 5, ptr %faber.array.value11)
      %faber.old.status11 = load i32, ptr @__faber_rt_v1_status
      %faber.has.error11 = icmp ne i32 %faber.old.status11, 0
      %faber.latched.status11 = select i1 %faber.has.error11, i32 %faber.old.status11, i32 %faber.array.status11
      store i32 %faber.latched.status11, ptr @__faber_rt_v1_status
      %load14 = load float, ptr %t3.addr
      %faber.array.value13 = alloca float
      store float %load14, ptr %faber.array.value13
      %faber.array.status13 = call i32 @__faber_rt_v1_array_push(ptr %faber.context6, ptr %faber.array.handle6, i32 5, ptr %faber.array.value13)
      %faber.old.status13 = load i32, ptr @__faber_rt_v1_status
      %faber.has.error13 = icmp ne i32 %faber.old.status13, 0
      %faber.latched.status13 = select i1 %faber.has.error13, i32 %faber.old.status13, i32 %faber.array.status13
      store i32 %faber.latched.status13, ptr @__faber_rt_v1_status
      %load16 = load float, ptr %t4.addr
      %faber.array.value15 = alloca float
      store float %load16, ptr %faber.array.value15
      %faber.array.status15 = call i32 @__faber_rt_v1_array_push(ptr %faber.context6, ptr %faber.array.handle6, i32 5, ptr %faber.array.value15)
      %faber.old.status15 = load i32, ptr @__faber_rt_v1_status
      %faber.has.error15 = icmp ne i32 %faber.old.status15, 0
      %faber.latched.status15 = select i1 %faber.has.error15, i32 %faber.old.status15, i32 %faber.array.status15
      store i32 %faber.latched.status15, ptr @__faber_rt_v1_status
      %load18 = load float, ptr %t5.addr
      %faber.array.value17 = alloca float
      store float %load18, ptr %faber.array.value17
      %faber.array.status17 = call i32 @__faber_rt_v1_array_push(ptr %faber.context6, ptr %faber.array.handle6, i32 5, ptr %faber.array.value17)
      %faber.old.status17 = load i32, ptr @__faber_rt_v1_status
      %faber.has.error17 = icmp ne i32 %faber.old.status17, 0
      %faber.latched.status17 = select i1 %faber.has.error17, i32 %faber.old.status17, i32 %faber.array.status17
      store i32 %faber.latched.status17, ptr @__faber_rt_v1_status
      store ptr %faber.array.handle6, ptr %t6.addr
      %load19 = load ptr, ptr %t6.addr
      store ptr %load19, ptr %l0.addr
      %cast20 = fptrunc double 1.0 to float
      store float %cast20, ptr %t7.addr
      %cast21 = fptrunc double 2.0 to float
      store float %cast21, ptr %t8.addr
      %cast22 = fptrunc double 3.0 to float
      store float %cast22, ptr %t9.addr
      %cast23 = fptrunc double 4.0 to float
      store float %cast23, ptr %t10.addr
      %cast24 = fptrunc double 5.0 to float
      store float %cast24, ptr %t11.addr
      %cast25 = fptrunc double 6.0 to float
      store float %cast25, ptr %t12.addr
      %cast26 = fptrunc double 7.0 to float
      store float %cast26, ptr %t13.addr
      %cast27 = fptrunc double 8.0 to float
      store float %cast27, ptr %t14.addr
      %cast28 = fptrunc double 9.0 to float
      store float %cast28, ptr %t15.addr
      %cast29 = fptrunc double 10.0 to float
      store float %cast29, ptr %t16.addr
      %cast30 = fptrunc double 11.0 to float
      store float %cast30, ptr %t17.addr
      %cast31 = fptrunc double 12.0 to float
      store float %cast31, ptr %t18.addr
      %faber.context32 = load ptr, ptr @__faber_rt_v1_context
      %faber.array.result32 = call %FaberRtPtrResultV1 @__faber_rt_v1_array_new(ptr %faber.context32, i32 5)
      %faber.array.status32 = extractvalue %FaberRtPtrResultV1 %faber.array.result32, 0
      %faber.array.handle32 = extractvalue %FaberRtPtrResultV1 %faber.array.result32, 1
      %faber.old.status32 = load i32, ptr @__faber_rt_v1_status
      %faber.has.error32 = icmp ne i32 %faber.old.status32, 0
      %faber.latched.status32 = select i1 %faber.has.error32, i32 %faber.old.status32, i32 %faber.array.status32
      store i32 %faber.latched.status32, ptr @__faber_rt_v1_status
      %load34 = load float, ptr %t7.addr
      %faber.array.value33 = alloca float
      store float %load34, ptr %faber.array.value33
      %faber.array.status33 = call i32 @__faber_rt_v1_array_push(ptr %faber.context32, ptr %faber.array.handle32, i32 5, ptr %faber.array.value33)
      %faber.old.status33 = load i32, ptr @__faber_rt_v1_status
      %faber.has.error33 = icmp ne i32 %faber.old.status33, 0
      %faber.latched.status33 = select i1 %faber.has.error33, i32 %faber.old.status33, i32 %faber.array.status33
      store i32 %faber.latched.status33, ptr @__faber_rt_v1_status
      %load36 = load float, ptr %t8.addr
      %faber.array.value35 = alloca float
      store float %load36, ptr %faber.array.value35
      %faber.array.status35 = call i32 @__faber_rt_v1_array_push(ptr %faber.context32, ptr %faber.array.handle32, i32 5, ptr %faber.array.value35)
      %faber.old.status35 = load i32, ptr @__faber_rt_v1_status
      %faber.has.error35 = icmp ne i32 %faber.old.status35, 0
      %faber.latched.status35 = select i1 %faber.has.error35, i32 %faber.old.status35, i32 %faber.array.status35
      store i32 %faber.latched.status35, ptr @__faber_rt_v1_status
      %load38 = load float, ptr %t9.addr
      %faber.array.value37 = alloca float
      store float %load38, ptr %faber.array.value37
      %faber.array.status37 = call i32 @__faber_rt_v1_array_push(ptr %faber.context32, ptr %faber.array.handle32, i32 5, ptr %faber.array.value37)
      %faber.old.status37 = load i32, ptr @__faber_rt_v1_status
      %faber.has.error37 = icmp ne i32 %faber.old.status37, 0
      %faber.latched.status37 = select i1 %faber.has.error37, i32 %faber.old.status37, i32 %faber.array.status37
      store i32 %faber.latched.status37, ptr @__faber_rt_v1_status
      %load40 = load float, ptr %t10.addr
      %faber.array.value39 = alloca float
      store float %load40, ptr %faber.array.value39
      %faber.array.status39 = call i32 @__faber_rt_v1_array_push(ptr %faber.context32, ptr %faber.array.handle32, i32 5, ptr %faber.array.value39)
      %faber.old.status39 = load i32, ptr @__faber_rt_v1_status
      %faber.has.error39 = icmp ne i32 %faber.old.status39, 0
      %faber.latched.status39 = select i1 %faber.has.error39, i32 %faber.old.status39, i32 %faber.array.status39
      store i32 %faber.latched.status39, ptr @__faber_rt_v1_status
      %load42 = load float, ptr %t11.addr
      %faber.array.value41 = alloca float
      store float %load42, ptr %faber.array.value41
      %faber.array.status41 = call i32 @__faber_rt_v1_array_push(ptr %faber.context32, ptr %faber.array.handle32, i32 5, ptr %faber.array.value41)
      %faber.old.status41 = load i32, ptr @__faber_rt_v1_status
      %faber.has.error41 = icmp ne i32 %faber.old.status41, 0
      %faber.latched.status41 = select i1 %faber.has.error41, i32 %faber.old.status41, i32 %faber.array.status41
      store i32 %faber.latched.status41, ptr @__faber_rt_v1_status
      %load44 = load float, ptr %t12.addr
      %faber.array.value43 = alloca float
      store float %load44, ptr %faber.array.value43
      %faber.array.status43 = call i32 @__faber_rt_v1_array_push(ptr %faber.context32, ptr %faber.array.handle32, i32 5, ptr %faber.array.value43)
      %faber.old.status43 = load i32, ptr @__faber_rt_v1_status
      %faber.has.error43 = icmp ne i32 %faber.old.status43, 0
      %faber.latched.status43 = select i1 %faber.has.error43, i32 %faber.old.status43, i32 %faber.array.status43
      store i32 %faber.latched.status43, ptr @__faber_rt_v1_status
      %load46 = load float, ptr %t13.addr
      %faber.array.value45 = alloca float
      store float %load46, ptr %faber.array.value45
      %faber.array.status45 = call i32 @__faber_rt_v1_array_push(ptr %faber.context32, ptr %faber.array.handle32, i32 5, ptr %faber.array.value45)
      %faber.old.status45 = load i32, ptr @__faber_rt_v1_status
      %faber.has.error45 = icmp ne i32 %faber.old.status45, 0
      %faber.latched.status45 = select i1 %faber.has.error45, i32 %faber.old.status45, i32 %faber.array.status45
      store i32 %faber.latched.status45, ptr @__faber_rt_v1_status
      %load48 = load float, ptr %t14.addr
      %faber.array.value47 = alloca float
      store float %load48, ptr %faber.array.value47
      %faber.array.status47 = call i32 @__faber_rt_v1_array_push(ptr %faber.context32, ptr %faber.array.handle32, i32 5, ptr %faber.array.value47)
      %faber.old.status47 = load i32, ptr @__faber_rt_v1_status
      %faber.has.error47 = icmp ne i32 %faber.old.status47, 0
      %faber.latched.status47 = select i1 %faber.has.error47, i32 %faber.old.status47, i32 %faber.array.status47
      store i32 %faber.latched.status47, ptr @__faber_rt_v1_status
      %load50 = load float, ptr %t15.addr
      %faber.array.value49 = alloca float
      store float %load50, ptr %faber.array.value49
      %faber.array.status49 = call i32 @__faber_rt_v1_array_push(ptr %faber.context32, ptr %faber.array.handle32, i32 5, ptr %faber.array.value49)
      %faber.old.status49 = load i32, ptr @__faber_rt_v1_status
      %faber.has.error49 = icmp ne i32 %faber.old.status49, 0
      %faber.latched.status49 = select i1 %faber.has.error49, i32 %faber.old.status49, i32 %faber.array.status49
      store i32 %faber.latched.status49, ptr @__faber_rt_v1_status
      %load52 = load float, ptr %t16.addr
      %faber.array.value51 = alloca float
      store float %load52, ptr %faber.array.value51
      %faber.array.status51 = call i32 @__faber_rt_v1_array_push(ptr %faber.context32, ptr %faber.array.handle32, i32 5, ptr %faber.array.value51)
      %faber.old.status51 = load i32, ptr @__faber_rt_v1_status
      %faber.has.error51 = icmp ne i32 %faber.old.status51, 0
      %faber.latched.status51 = select i1 %faber.has.error51, i32 %faber.old.status51, i32 %faber.array.status51
      store i32 %faber.latched.status51, ptr @__faber_rt_v1_status
      %load54 = load float, ptr %t17.addr
      %faber.array.value53 = alloca float
      store float %load54, ptr %faber.array.value53
      %faber.array.status53 = call i32 @__faber_rt_v1_array_push(ptr %faber.context32, ptr %faber.array.handle32, i32 5, ptr %faber.array.value53)
      %faber.old.status53 = load i32, ptr @__faber_rt_v1_status
      %faber.has.error53 = icmp ne i32 %faber.old.status53, 0
      %faber.latched.status53 = select i1 %faber.has.error53, i32 %faber.old.status53, i32 %faber.array.status53
      store i32 %faber.latched.status53, ptr @__faber_rt_v1_status
      %load56 = load float, ptr %t18.addr
      %faber.array.value55 = alloca float
      store float %load56, ptr %faber.array.value55
      %faber.array.status55 = call i32 @__faber_rt_v1_array_push(ptr %faber.context32, ptr %faber.array.handle32, i32 5, ptr %faber.array.value55)
      %faber.old.status55 = load i32, ptr @__faber_rt_v1_status
      %faber.has.error55 = icmp ne i32 %faber.old.status55, 0
      %faber.latched.status55 = select i1 %faber.has.error55, i32 %faber.old.status55, i32 %faber.array.status55
      store i32 %faber.latched.status55, ptr @__faber_rt_v1_status
      store ptr %faber.array.handle32, ptr %t19.addr
      %load57 = load ptr, ptr %t19.addr
      store ptr %load57, ptr %l1.addr
      %faber.context58 = load ptr, ptr @__faber_rt_v1_context
      %faber.tensor.result58 = call %FaberRtPtrResultV1 @__faber_rt_v1_tensor_new(ptr %faber.context58, i32 5)
      %faber.tensor.status58 = extractvalue %FaberRtPtrResultV1 %faber.tensor.result58, 0
      %faber.tensor.value58 = extractvalue %FaberRtPtrResultV1 %faber.tensor.result58, 1
      %faber.old.status58 = load i32, ptr @__faber_rt_v1_status
      %faber.has.error58 = icmp ne i32 %faber.old.status58, 0
      %faber.latched.status58 = select i1 %faber.has.error58, i32 %faber.old.status58, i32 %faber.tensor.status58
      store i32 %faber.latched.status58, ptr @__faber_rt_v1_status
      store ptr %faber.tensor.value58, ptr %t20.addr
      %load59 = load ptr, ptr %t20.addr
      store ptr %load59, ptr %l2.addr
      %faber.context60 = load ptr, ptr @__faber_rt_v1_context
      %faber.array.result60 = call %FaberRtPtrResultV1 @__faber_rt_v1_array_new(ptr %faber.context60, i32 4)
      %faber.array.status60 = extractvalue %FaberRtPtrResultV1 %faber.array.result60, 0
      %faber.array.handle60 = extractvalue %FaberRtPtrResultV1 %faber.array.result60, 1
      %faber.old.status60 = load i32, ptr @__faber_rt_v1_status
      %faber.has.error60 = icmp ne i32 %faber.old.status60, 0
      %faber.latched.status60 = select i1 %faber.has.error60, i32 %faber.old.status60, i32 %faber.array.status60
      store i32 %faber.latched.status60, ptr @__faber_rt_v1_status
      %faber.array.value61 = alloca i64
      store i64 2, ptr %faber.array.value61
      %faber.array.status61 = call i32 @__faber_rt_v1_array_push(ptr %faber.context60, ptr %faber.array.handle60, i32 4, ptr %faber.array.value61)
      %faber.old.status61 = load i32, ptr @__faber_rt_v1_status
      %faber.has.error61 = icmp ne i32 %faber.old.status61, 0
      %faber.latched.status61 = select i1 %faber.has.error61, i32 %faber.old.status61, i32 %faber.array.status61
      store i32 %faber.latched.status61, ptr @__faber_rt_v1_status
      %faber.array.value62 = alloca i64
      store i64 3, ptr %faber.array.value62
      %faber.array.status62 = call i32 @__faber_rt_v1_array_push(ptr %faber.context60, ptr %faber.array.handle60, i32 4, ptr %faber.array.value62)
      %faber.old.status62 = load i32, ptr @__faber_rt_v1_status
      %faber.has.error62 = icmp ne i32 %faber.old.status62, 0
      %faber.latched.status62 = select i1 %faber.has.error62, i32 %faber.old.status62, i32 %faber.array.status62
      store i32 %faber.latched.status62, ptr @__faber_rt_v1_status
      store ptr %faber.array.handle60, ptr %t21.addr
      %load64 = load ptr, ptr %l2.addr
      %faber.context63 = load ptr, ptr @__faber_rt_v1_context
      %load65 = load ptr, ptr %l0.addr
      %load66 = load ptr, ptr %t21.addr
      %faber.tensor.result63 = call %FaberRtPtrResultV1 @__faber_rt_v1_tensor_from_flat(ptr %faber.context63, i32 5, ptr %load65, ptr %load66)
      %faber.tensor.status63 = extractvalue %FaberRtPtrResultV1 %faber.tensor.result63, 0
      %faber.tensor.value63 = extractvalue %FaberRtPtrResultV1 %faber.tensor.result63, 1
      %faber.old.status63 = load i32, ptr @__faber_rt_v1_status
      %faber.has.error63 = icmp ne i32 %faber.old.status63, 0
      %faber.latched.status63 = select i1 %faber.has.error63, i32 %faber.old.status63, i32 %faber.tensor.status63
      store i32 %faber.latched.status63, ptr @__faber_rt_v1_status
      store ptr %faber.tensor.value63, ptr %t22.addr
      %load67 = load ptr, ptr %t22.addr
      store ptr %load67, ptr %l3.addr
      %faber.context68 = load ptr, ptr @__faber_rt_v1_context
      %faber.array.result68 = call %FaberRtPtrResultV1 @__faber_rt_v1_array_new(ptr %faber.context68, i32 4)
      %faber.array.status68 = extractvalue %FaberRtPtrResultV1 %faber.array.result68, 0
      %faber.array.handle68 = extractvalue %FaberRtPtrResultV1 %faber.array.result68, 1
      %faber.old.status68 = load i32, ptr @__faber_rt_v1_status
      %faber.has.error68 = icmp ne i32 %faber.old.status68, 0
      %faber.latched.status68 = select i1 %faber.has.error68, i32 %faber.old.status68, i32 %faber.array.status68
      store i32 %faber.latched.status68, ptr @__faber_rt_v1_status
      %faber.array.value69 = alloca i64
      store i64 3, ptr %faber.array.value69
      %faber.array.status69 = call i32 @__faber_rt_v1_array_push(ptr %faber.context68, ptr %faber.array.handle68, i32 4, ptr %faber.array.value69)
      %faber.old.status69 = load i32, ptr @__faber_rt_v1_status
      %faber.has.error69 = icmp ne i32 %faber.old.status69, 0
      %faber.latched.status69 = select i1 %faber.has.error69, i32 %faber.old.status69, i32 %faber.array.status69
      store i32 %faber.latched.status69, ptr @__faber_rt_v1_status
      %faber.array.value70 = alloca i64
      store i64 4, ptr %faber.array.value70
      %faber.array.status70 = call i32 @__faber_rt_v1_array_push(ptr %faber.context68, ptr %faber.array.handle68, i32 4, ptr %faber.array.value70)
      %faber.old.status70 = load i32, ptr @__faber_rt_v1_status
      %faber.has.error70 = icmp ne i32 %faber.old.status70, 0
      %faber.latched.status70 = select i1 %faber.has.error70, i32 %faber.old.status70, i32 %faber.array.status70
      store i32 %faber.latched.status70, ptr @__faber_rt_v1_status
      store ptr %faber.array.handle68, ptr %t23.addr
      %load72 = load ptr, ptr %l2.addr
      %faber.context71 = load ptr, ptr @__faber_rt_v1_context
      %load73 = load ptr, ptr %l1.addr
      %load74 = load ptr, ptr %t23.addr
      %faber.tensor.result71 = call %FaberRtPtrResultV1 @__faber_rt_v1_tensor_from_flat(ptr %faber.context71, i32 5, ptr %load73, ptr %load74)
      %faber.tensor.status71 = extractvalue %FaberRtPtrResultV1 %faber.tensor.result71, 0
      %faber.tensor.value71 = extractvalue %FaberRtPtrResultV1 %faber.tensor.result71, 1
      %faber.old.status71 = load i32, ptr @__faber_rt_v1_status
      %faber.has.error71 = icmp ne i32 %faber.old.status71, 0
      %faber.latched.status71 = select i1 %faber.has.error71, i32 %faber.old.status71, i32 %faber.tensor.status71
      store i32 %faber.latched.status71, ptr @__faber_rt_v1_status
      store ptr %faber.tensor.value71, ptr %t24.addr
      %load75 = load ptr, ptr %t24.addr
      store ptr %load75, ptr %l4.addr
      %load77 = load ptr, ptr %l3.addr
      %faber.context76 = load ptr, ptr @__faber_rt_v1_context
      %load78 = load ptr, ptr %l4.addr
      %faber.tensor.result76 = call %FaberRtPtrResultV1 @__faber_rt_v1_tensor_matmul(ptr %faber.context76, ptr %load77, ptr %load78)
      %faber.tensor.status76 = extractvalue %FaberRtPtrResultV1 %faber.tensor.result76, 0
      %faber.tensor.value76 = extractvalue %FaberRtPtrResultV1 %faber.tensor.result76, 1
      %faber.old.status76 = load i32, ptr @__faber_rt_v1_status
      %faber.has.error76 = icmp ne i32 %faber.old.status76, 0
      %faber.latched.status76 = select i1 %faber.has.error76, i32 %faber.old.status76, i32 %faber.tensor.status76
      store i32 %faber.latched.status76, ptr @__faber_rt_v1_status
      store ptr %faber.tensor.value76, ptr %t25.addr
      %load79 = load ptr, ptr %t25.addr
      store ptr %load79, ptr %l5.addr
      %load81 = load ptr, ptr %l5.addr
      %faber.context80 = load ptr, ptr @__faber_rt_v1_context
      %faber.tensor.reduce.out80 = alloca float
      store float 0.0, ptr %faber.tensor.reduce.out80
      %faber.tensor.status80 = call i32 @__faber_rt_v1_tensor_mean(ptr %faber.context80, ptr %load81, i32 5, ptr %faber.tensor.reduce.out80)
      %faber.tensor.reduce80 = load float, ptr %faber.tensor.reduce.out80
      %faber.old.status80 = load i32, ptr @__faber_rt_v1_status
      %faber.has.error80 = icmp ne i32 %faber.old.status80, 0
      %faber.latched.status80 = select i1 %faber.has.error80, i32 %faber.old.status80, i32 %faber.tensor.status80
      store i32 %faber.latched.status80, ptr @__faber_rt_v1_status
      store float %faber.tensor.reduce80, ptr %t26.addr
      %load82 = load float, ptr %t26.addr
      store float %load82, ptr %l6.addr
      %load83 = load float, ptr %l6.addr
      %faber.context84 = load ptr, ptr @__faber_rt_v1_context
      %faber.diag.status84 = call i32 @__faber_rt_v1_diagnostic_nota_f32(ptr %faber.context84, float %load83)
      %faber.old.status84 = load i32, ptr @__faber_rt_v1_status
      %faber.has.error84 = icmp ne i32 %faber.old.status84, 0
      %faber.latched.status84 = select i1 %faber.has.error84, i32 %faber.old.status84, i32 %faber.diag.status84
      store i32 %faber.latched.status84, ptr @__faber_rt_v1_status
      ret void
}

define %FaberRtExitV1 @__faber_program_entry_v1(ptr %context) {
    entry:
      store ptr %context, ptr @__faber_rt_v1_context
      call void @incipit()
      %faber.entry.status = load i32, ptr @__faber_rt_v1_status
      %faber.entry.status.ext = zext i32 %faber.entry.status to i64
      %faber.entry.shifted = shl i64 %faber.entry.status.ext, 32
      %faber.entry.packed = or i64 0, %faber.entry.shifted
      ret %FaberRtExitV1 %faber.entry.packed
}

The error channel#

A function that may fail, and a caller that catches. Shows how the channel becomes each target's own error idiom.

Faber source

reader locale
faber format --locale en — English reader surface
fn divide(int a, int b)  intstring {
    if b  0 {
        throw "division by zero"
    }
    return a / b
}

main {
    do {
        print divide(10, 2)
    }
    catch err {
        warn err
    }
}
faber format --locale la — canonical Faber
functio divide(numerus a, numerus b)  numerustextus {
    si b  0 {
        iace "division by zero"
    }
    redde a / b
}

incipit {
    fac {
        nota divide(10, 2)
    }
    cape err {
        mone err
    }
}
faber format --locale th-TH — Thai
ฟังก์ชัน divide(จำนวน a, จำนวน b)  จำนวนข้อความ {
    ถ้า b  0 {
        โยน "division by zero"
    }
    คืน a / b
}

เริ่ม {
    ทำ {
        บันทึก divide(10, 2)
    }
    จับ err {
        เตือน err
    }
}
faber format --locale zh-Hans — Simplified Chinese
函数 divide(整数 a, 整数 b)  整数文本 {
    如果 b  0 {
        抛错 "division by zero"
    }
    返回 a / b
}

入口 {
    执行 {
        显示 divide(10, 2)
    }
    捕获 err {
        警告 err
    }
}
faber format --locale zh-Hant — Traditional Chinese
函式 divide(整數 a, 整數 b)  整數文字 {
     b  0 {
        拋出 "division by zero"
    }
    傳回 a / b
}

入口 {
    執行 {
        註記 divide(10, 2)
    }
    捕捉 err {
        警告 err
    }
}
faber format --locale vi — Vietnamese
hàm divide(số a, số b)  sốvăn_bản {
    nếu b  0 {
        ném "division by zero"
    }
    trả a / b
}

bắt_đầu {
    làm {
        ghi_chú divide(10, 2)
    }
    bắt err {
        cảnh_báo err
    }
}
faber format --locale ar — Arabic
دالة divide(عدد a, عدد b)  عددنص {
    إذا b  0 {
        ارم "division by zero"
    }
    أعد a / b
}

بداية {
    افعل {
        اعرض divide(10, 2)
    }
    التقط err {
        نبه err
    }
}
faber format --locale hi — Hindi
फलन divide(संख्या a, संख्या b)  संख्यापाठ {
    यदि b  0 {
        इधरफेंको "division by zero"
    }
    लौटाओ a / b
}

आरंभ {
    करो {
        दिखाओ divide(10, 2)
    }
    पकड़ो err {
        चेताओ err
    }
}

LLVM IR — 13 lines in, 106 out (8.2×)

; Generated by radix MIR LLVM IR probe - experimental artifact.
%FaberRtSliceV1 = type { ptr, i64 }
%FaberRtExitV1 = type i64
%FaberRtPtrResultV1 = type { i32, ptr }
%FaberRtStatusV1 = type { i32 }
@__faber_rt_v1_context = linkonce_odr global ptr null
@__faber_rt_v1_status = linkonce_odr global i32 0
declare void @__faber_rt_v1_fatal(ptr, %FaberRtSliceV1) noreturn
declare void @__faber_rt_v1_numerus_overflow(ptr) noreturn
; @literal-data __faber_text_literal_text_16_64_69_76_69_73_69_6f_6e_20_62_79_20_7a_65_72_6f family=text family_index=0 family_index_count=1 family_count=1 representation=static-byte-data representation_index=0 representation_index_count=1 representation_count=1 byte_data_schema_version=1 encoding=utf8 byte_data_schema_version_index=0 byte_data_schema_version_index_count=1 encoding_index=0 encoding_index_count=1 byte_data_schema_version_count=1 encoding_count=1 layout="[17 x i8]" bytes=17 payload_bytes=16 layout_index=0 layout_index_count=1 payload_byte_index=0 payload_byte_index_count=1 payload_byte_count=1 layout_count=1 byte_length_count=1 terminator_bytes=1 terminator_byte_index=0 terminator_byte_index_count=1 terminator_byte_count=1 terminator_policy_index=0 terminator_policy_index_count=1 terminator_policy_count=1 null_terminated_index=0 null_terminated_index_count=1 null_terminated=true null_terminated_count=1 mutability_index=0 mutability_index_count=1 mutability="constant" mutability_count=1 pointer_policy_index=0 pointer_policy_index_count=1 pointer_policy="gep-nonempty-direct-empty" pointer_policy_count=1 linkage_index=0 linkage_index_count=1 linkage="linkonce_odr unnamed_addr constant" linkage_count=1 alignment_index=0 alignment_index_count=1 alignment="align 1" alignment_count=1
@__faber_text_literal_text_16_64_69_76_69_73_69_6f_6e_20_62_79_20_7a_65_72_6f = linkonce_odr unnamed_addr constant [17 x i8] c"division by zero\00", align 1
; @literal-object __faber_text_literal_text_16_64_69_76_69_73_69_6f_6e_20_62_79_20_7a_65_72_6f_object family=text family_index=0 family_index_count=1 family_count=1 representation=static-descriptor representation_count=1 descriptor_schema_version=1 descriptor_schema_version_count=1 layout="{ ptr, i64 }" layout_count=1 byte_len=16 byte_len_count=1 abi_align=8 abi_align_count=1 field_types=ptr,i64 field_type_count=2 field_sizes=8,8 field_size_count=2 field_alignments=8,8 field_alignment_count=2 field_offsets=0,8 field_offset_count=2 field_end_offsets=8,16 field_end_offset_count=2 pointer_fields=data pointer_field_indexes=data:0 pointer_field_index_count=1 pointer_field_count=1 pointer_address_spaces=data:0 pointer_address_space_count=1 pointer_target_families=data:unknown pointer_target_family_indexes=data:0:unknown pointer_target_family_index_count=1 pointer_target_family_count=1 pointer_target_terminators=none pointer_target_terminator_indexes=none pointer_target_terminator_index_count=0 pointer_target_terminator_count=0 pointer_target_byte_lens=none pointer_target_byte_len_indexes=none pointer_target_byte_len_index_count=0 pointer_target_byte_len_count=0 length_fields=none length_field_indexes=none length_field_index_count=0 length_field_count=0 pointer_length_fields=none pointer_length_field_indexes=none pointer_length_field_index_count=0 pointer_length_field_count=0 fields=data,len field_indexes=data:0,len:1 field_index_count=2 field_count=2 nullable_fields=none nullable_field_indexes=none nullable_field_index_count=0 nullable_field_count=0 null_sentinels=none null_sentinel_indexes=none null_sentinel_index_count=0 null_sentinel_count=0 pointer_policy="direct-global-symbol" pointer_policy_count=1 storage_policy="static-descriptor-global" storage_policy_count=1 mutability="constant" mutability_count=1 linkage="linkonce_odr unnamed_addr constant" linkage_count=1 alignment="align 8" alignment_count=1
@__faber_text_literal_text_16_64_69_76_69_73_69_6f_6e_20_62_79_20_7a_65_72_6f_object = linkonce_odr unnamed_addr constant { ptr, i64 } { ptr getelementptr inbounds ([17 x i8], ptr @__faber_text_literal_text_16_64_69_76_69_73_69_6f_6e_20_62_79_20_7a_65_72_6f, i64 0, i64 0), i64 16 }, align 8


; @runtime __faber_rt_v1_diagnostic_mone_text category=host-integration
declare i32 @__faber_rt_v1_diagnostic_mone_text(ptr, ptr)
; @runtime __faber_rt_v1_diagnostic_nota_i64 category=host-integration
declare i32 @__faber_rt_v1_diagnostic_nota_i64(ptr, i64)

define { i1, i64, ptr } @divide(i64 %l0, i64 %l1) {
    entry:
      %l0.addr = alloca i64
      %l1.addr = alloca i64
      %t0.addr = alloca i1
      %t1.addr = alloca ptr
      %t2.addr = alloca i64
      store i64 %l0, ptr %l0.addr
      store i64 %l1, ptr %l1.addr
      br label %b0
    b0:
      %load0 = load i64, ptr %l1.addr
      %v0 = icmp eq i64 %load0, 0
      store i1 %v0, ptr %t0.addr
      %load1 = load i1, ptr %t0.addr
      br i1 %load1, label %b1, label %b2
    b1:
      store ptr @__faber_text_literal_text_16_64_69_76_69_73_69_6f_6e_20_62_79_20_7a_65_72_6f_object, ptr %t1.addr
      %load2 = load ptr, ptr %t1.addr
      %ret3 = insertvalue { i1, i64, ptr } undef, i1 false, 0
      %ret4 = insertvalue { i1, i64, ptr } %ret3, i64 0, 1
      %ret5 = insertvalue { i1, i64, ptr } %ret4, ptr %load2, 2
      ret { i1, i64, ptr } %ret5
    b2:
      %load6 = load i64, ptr %l0.addr
      %load7 = load i64, ptr %l1.addr
      %v2 = sdiv i64 %load6, %load7
      store i64 %v2, ptr %t2.addr
      %ret8 = insertvalue { i1, i64, ptr } undef, i1 true, 0
      %load9 = load i64, ptr %t2.addr
      %ret10 = insertvalue { i1, i64, ptr } %ret8, i64 %load9, 1
      %ret11 = insertvalue { i1, i64, ptr } %ret10, ptr null, 2
      ret { i1, i64, ptr } %ret11
}

define void @incipit() {
    entry:
      %l0.addr = alloca ptr
      %t0.addr = alloca i64
      br label %b0
    b0:
      %try0 = call { i1, i64, ptr } @divide(i64 10, i64 2)
      %try_tag1 = extractvalue { i1, i64, ptr } %try0, 0
      br i1 %try_tag1, label %try_ok2, label %try_error3
    try_ok2:
      %try_success4 = extractvalue { i1, i64, ptr } %try0, 1
      store i64 %try_success4, ptr %t0.addr
      br label %b4
    try_error3:
      %try_error_value5 = extractvalue { i1, i64, ptr } %try0, 2
      store ptr %try_error_value5, ptr %l0.addr
      br label %b1
    b1:
      %load6 = load ptr, ptr %l0.addr
      %faber.context7 = load ptr, ptr @__faber_rt_v1_context
      %faber.diag.status7 = call i32 @__faber_rt_v1_diagnostic_mone_text(ptr %faber.context7, ptr %load6)
      %faber.old.status7 = load i32, ptr @__faber_rt_v1_status
      %faber.has.error7 = icmp ne i32 %faber.old.status7, 0
      %faber.latched.status7 = select i1 %faber.has.error7, i32 %faber.old.status7, i32 %faber.diag.status7
      store i32 %faber.latched.status7, ptr @__faber_rt_v1_status
      br label %b2
    b2:
      ret void
    b3:
      br label %b2
    b4:
      %load8 = load i64, ptr %t0.addr
      %faber.context9 = load ptr, ptr @__faber_rt_v1_context
      %faber.diag.status9 = call i32 @__faber_rt_v1_diagnostic_nota_i64(ptr %faber.context9, i64 %load8)
      %faber.old.status9 = load i32, ptr @__faber_rt_v1_status
      %faber.has.error9 = icmp ne i32 %faber.old.status9, 0
      %faber.latched.status9 = select i1 %faber.has.error9, i32 %faber.old.status9, i32 %faber.diag.status9
      store i32 %faber.latched.status9, ptr @__faber_rt_v1_status
      br label %b3
}

define %FaberRtExitV1 @__faber_program_entry_v1(ptr %context) {
    entry:
      store ptr %context, ptr @__faber_rt_v1_context
      call void @incipit()
      %faber.entry.status = load i32, ptr @__faber_rt_v1_status
      %faber.entry.status.ext = zext i32 %faber.entry.status to i64
      %faber.entry.shifted = shl i64 %faber.entry.status.ext, 32
      %faber.entry.packed = or i64 0, %faber.entry.shifted
      ret %FaberRtExitV1 %faber.entry.packed
}

Collections and iteration#

A list folded to a total with itera ex. The plainest possible read on how loops lower.

Faber source

reader locale
faber format --locale en — English reader surface
fn summa(list<int> numeri)  int {
    var int total  0
    for from numeri const n {
        total  total + n
    }
    return total
}

main {
    const list<int> valores  [1, 2, 3, 4, 5]
    print summa(valores)
}
faber format --locale la — canonical Faber
functio summa(lista<numerus> numeri)  numerus {
    varia numerus total  0
    itera ex numeri fixum n {
        total  total + n
    }
    redde total
}

incipit {
    fixum lista<numerus> valores  [1, 2, 3, 4, 5]
    nota summa(valores)
}
faber format --locale th-TH — Thai
ฟังก์ชัน summa(รายการ<จำนวน> numeri)  จำนวน {
    แปร จำนวน total  0
    วน ออก numeri คงที่ n {
        total  total + n
    }
    คืน total
}

เริ่ม {
    คงที่ รายการ<จำนวน> valores  [1, 2, 3, 4, 5]
    บันทึก summa(valores)
}
faber format --locale zh-Hans — Simplified Chinese
函数 summa(列表<整数> numeri)  整数 {
    变量 整数 total  0
    遍历 取自 numeri 常量 n {
        total  total + n
    }
    返回 total
}

入口 {
    常量 列表<整数> valores  [1, 2, 3, 4, 5]
    显示 summa(valores)
}
faber format --locale zh-Hant — Traditional Chinese
函式 summa(列表<整數> numeri)  整數 {
    變值 整數 total  0
    遍歷 取自 numeri 定值 n {
        total  total + n
    }
    傳回 total
}

入口 {
    定值 列表<整數> valores  [1, 2, 3, 4, 5]
    註記 summa(valores)
}
faber format --locale vi — Vietnamese
hàm summa(danh_sách<số> numeri)  số {
    biến số total  0
    lặp từ numeri hằng n {
        total  total + n
    }
    trả total
}

bắt_đầu {
    hằng danh_sách<số> valores  [1, 2, 3, 4, 5]
    ghi_chú summa(valores)
}
faber format --locale ar — Arabic
دالة summa(قائمة<عدد> numeri)  عدد {
    متغير عدد total  0
    كرر من numeri ثابت n {
        total  total + n
    }
    أعد total
}

بداية {
    ثابت قائمة<عدد> valores  [1, 2, 3, 4, 5]
    اعرض summa(valores)
}
faber format --locale hi — Hindi
फलन summa(सूची<संख्या> numeri)  संख्या {
    चर संख्या total  0
    दोहराओ सेवन numeri स्थिर n {
        total  total + n
    }
    लौटाओ total
}

आरंभ {
    स्थिर सूची<संख्या> valores  [1, 2, 3, 4, 5]
    दिखाओ summa(valores)
}

LLVM IR — 12 lines in, 180 out (15.0×)

; Generated by radix MIR LLVM IR probe - experimental artifact.
%FaberRtSliceV1 = type { ptr, i64 }
%FaberRtExitV1 = type i64
%FaberRtPtrResultV1 = type { i32, ptr }
%FaberRtStatusV1 = type { i32 }
@__faber_rt_v1_context = linkonce_odr global ptr null
@__faber_rt_v1_status = linkonce_odr global i32 0
declare void @__faber_rt_v1_fatal(ptr, %FaberRtSliceV1) noreturn
declare void @__faber_rt_v1_numerus_overflow(ptr) noreturn


; @runtime __faber_rt_v1_array_get category=core-semantics
declare i32 @__faber_rt_v1_array_get(ptr, ptr, i64, i32, ptr)
; @runtime __faber_rt_v1_array_length category=core-semantics
declare i32 @__faber_rt_v1_array_length(ptr, ptr, ptr)
; @runtime __faber_rt_v1_array_new category=core-semantics
declare %FaberRtPtrResultV1 @__faber_rt_v1_array_new(ptr, i32)
; @runtime __faber_rt_v1_array_push category=core-semantics
declare i32 @__faber_rt_v1_array_push(ptr, ptr, i32, ptr)
; @runtime __faber_rt_v1_diagnostic_nota_i64 category=host-integration
declare i32 @__faber_rt_v1_diagnostic_nota_i64(ptr, i64)

define i64 @summa(ptr %l0) {
    entry:
      %l0.addr = alloca ptr
      %l1.addr = alloca i64
      %l2.addr = alloca i64
      %l3.addr = alloca i64
      %t0.addr = alloca i64
      %t1.addr = alloca i1
      %t2.addr = alloca i64
      %t3.addr = alloca i64
      store ptr %l0, ptr %l0.addr
      br label %b0
    b0:
      store i64 0, ptr %l1.addr
      store i64 0, ptr %l2.addr
      %load0 = load ptr, ptr %l0.addr
      %faber.array.length.out1 = alloca i64
      store i64 0, ptr %faber.array.length.out1
      %faber.context1 = load ptr, ptr @__faber_rt_v1_context
      %faber.array.length.status1 = call i32 @__faber_rt_v1_array_length(ptr %faber.context1, ptr %load0, ptr %faber.array.length.out1)
      %faber.array.length1 = load i64, ptr %faber.array.length.out1
      %faber.old.status1 = load i32, ptr @__faber_rt_v1_status
      %faber.has.error1 = icmp ne i32 %faber.old.status1, 0
      %faber.latched.status1 = select i1 %faber.has.error1, i32 %faber.old.status1, i32 %faber.array.length.status1
      store i32 %faber.latched.status1, ptr @__faber_rt_v1_status
      store i64 %faber.array.length1, ptr %t0.addr
      br label %b1
    b1:
      %load2 = load i64, ptr %l2.addr
      %load3 = load i64, ptr %t0.addr
      %v2 = icmp slt i64 %load2, %load3
      store i1 %v2, ptr %t1.addr
      %load4 = load i1, ptr %t1.addr
      br i1 %load4, label %b2, label %b4
    b2:
      %load5 = load ptr, ptr %l0.addr
      %load6 = load i64, ptr %l2.addr
      %faber.array.get.out7 = alloca i64
      store i64 0, ptr %faber.array.get.out7
      %faber.context7 = load ptr, ptr @__faber_rt_v1_context
      %faber.array.get.status7 = call i32 @__faber_rt_v1_array_get(ptr %faber.context7, ptr %load5, i64 %load6, i32 4, ptr %faber.array.get.out7)
      %faber.array.get.value7 = load i64, ptr %faber.array.get.out7
      %faber.old.status7 = load i32, ptr @__faber_rt_v1_status
      %faber.has.error7 = icmp ne i32 %faber.old.status7, 0
      %faber.latched.status7 = select i1 %faber.has.error7, i32 %faber.old.status7, i32 %faber.array.get.status7
      store i32 %faber.latched.status7, ptr @__faber_rt_v1_status
      store i64 %faber.array.get.value7, ptr %l3.addr
      %load8 = load i64, ptr %l1.addr
      %load9 = load i64, ptr %l3.addr
      %overflow.result4 = call { i64, i1 } @llvm.sadd.with.overflow.i64(i64 %load8, i64 %load9)
      %v4 = extractvalue { i64, i1 } %overflow.result4, 0
      %overflow.flag4 = extractvalue { i64, i1 } %overflow.result4, 1
      br i1 %overflow.flag4, label %overflow4, label %checked.ok4
    overflow4:
      %overflow.context4 = load ptr, ptr @__faber_rt_v1_context
      call void @__faber_rt_v1_numerus_overflow(ptr %overflow.context4)
      unreachable
    checked.ok4:
      store i64 %v4, ptr %t2.addr
      %load10 = load i64, ptr %t2.addr
      store i64 %load10, ptr %l1.addr
      br label %b3
    b3:
      %load11 = load i64, ptr %l2.addr
      %overflow.result6 = call { i64, i1 } @llvm.sadd.with.overflow.i64(i64 %load11, i64 1)
      %v6 = extractvalue { i64, i1 } %overflow.result6, 0
      %overflow.flag6 = extractvalue { i64, i1 } %overflow.result6, 1
      br i1 %overflow.flag6, label %overflow6, label %checked.ok6
    overflow6:
      %overflow.context6 = load ptr, ptr @__faber_rt_v1_context
      call void @__faber_rt_v1_numerus_overflow(ptr %overflow.context6)
      unreachable
    checked.ok6:
      store i64 %v6, ptr %t3.addr
      %load12 = load i64, ptr %t3.addr
      store i64 %load12, ptr %l2.addr
      br label %b1
    b4:
      %load13 = load i64, ptr %l1.addr
      ret i64 %load13
}

define void @incipit() {
    entry:
      %l0.addr = alloca ptr
      %t0.addr = alloca ptr
      %t1.addr = alloca i64
      br label %b0
    b0:
      %faber.context0 = load ptr, ptr @__faber_rt_v1_context
      %faber.array.result0 = call %FaberRtPtrResultV1 @__faber_rt_v1_array_new(ptr %faber.context0, i32 4)
      %faber.array.status0 = extractvalue %FaberRtPtrResultV1 %faber.array.result0, 0
      %faber.array.handle0 = extractvalue %FaberRtPtrResultV1 %faber.array.result0, 1
      %faber.old.status0 = load i32, ptr @__faber_rt_v1_status
      %faber.has.error0 = icmp ne i32 %faber.old.status0, 0
      %faber.latched.status0 = select i1 %faber.has.error0, i32 %faber.old.status0, i32 %faber.array.status0
      store i32 %faber.latched.status0, ptr @__faber_rt_v1_status
      %faber.array.value1 = alloca i64
      store i64 1, ptr %faber.array.value1
      %faber.array.status1 = call i32 @__faber_rt_v1_array_push(ptr %faber.context0, ptr %faber.array.handle0, i32 4, ptr %faber.array.value1)
      %faber.old.status1 = load i32, ptr @__faber_rt_v1_status
      %faber.has.error1 = icmp ne i32 %faber.old.status1, 0
      %faber.latched.status1 = select i1 %faber.has.error1, i32 %faber.old.status1, i32 %faber.array.status1
      store i32 %faber.latched.status1, ptr @__faber_rt_v1_status
      %faber.array.value2 = alloca i64
      store i64 2, ptr %faber.array.value2
      %faber.array.status2 = call i32 @__faber_rt_v1_array_push(ptr %faber.context0, ptr %faber.array.handle0, i32 4, ptr %faber.array.value2)
      %faber.old.status2 = load i32, ptr @__faber_rt_v1_status
      %faber.has.error2 = icmp ne i32 %faber.old.status2, 0
      %faber.latched.status2 = select i1 %faber.has.error2, i32 %faber.old.status2, i32 %faber.array.status2
      store i32 %faber.latched.status2, ptr @__faber_rt_v1_status
      %faber.array.value3 = alloca i64
      store i64 3, ptr %faber.array.value3
      %faber.array.status3 = call i32 @__faber_rt_v1_array_push(ptr %faber.context0, ptr %faber.array.handle0, i32 4, ptr %faber.array.value3)
      %faber.old.status3 = load i32, ptr @__faber_rt_v1_status
      %faber.has.error3 = icmp ne i32 %faber.old.status3, 0
      %faber.latched.status3 = select i1 %faber.has.error3, i32 %faber.old.status3, i32 %faber.array.status3
      store i32 %faber.latched.status3, ptr @__faber_rt_v1_status
      %faber.array.value4 = alloca i64
      store i64 4, ptr %faber.array.value4
      %faber.array.status4 = call i32 @__faber_rt_v1_array_push(ptr %faber.context0, ptr %faber.array.handle0, i32 4, ptr %faber.array.value4)
      %faber.old.status4 = load i32, ptr @__faber_rt_v1_status
      %faber.has.error4 = icmp ne i32 %faber.old.status4, 0
      %faber.latched.status4 = select i1 %faber.has.error4, i32 %faber.old.status4, i32 %faber.array.status4
      store i32 %faber.latched.status4, ptr @__faber_rt_v1_status
      %faber.array.value5 = alloca i64
      store i64 5, ptr %faber.array.value5
      %faber.array.status5 = call i32 @__faber_rt_v1_array_push(ptr %faber.context0, ptr %faber.array.handle0, i32 4, ptr %faber.array.value5)
      %faber.old.status5 = load i32, ptr @__faber_rt_v1_status
      %faber.has.error5 = icmp ne i32 %faber.old.status5, 0
      %faber.latched.status5 = select i1 %faber.has.error5, i32 %faber.old.status5, i32 %faber.array.status5
      store i32 %faber.latched.status5, ptr @__faber_rt_v1_status
      store ptr %faber.array.handle0, ptr %t0.addr
      %load6 = load ptr, ptr %t0.addr
      store ptr %load6, ptr %l0.addr
      %load7 = load ptr, ptr %l0.addr
      %call8 = call i64 @summa(ptr %load7)
      store i64 %call8, ptr %t1.addr
      %load9 = load i64, ptr %t1.addr
      %faber.context10 = load ptr, ptr @__faber_rt_v1_context
      %faber.diag.status10 = call i32 @__faber_rt_v1_diagnostic_nota_i64(ptr %faber.context10, i64 %load9)
      %faber.old.status10 = load i32, ptr @__faber_rt_v1_status
      %faber.has.error10 = icmp ne i32 %faber.old.status10, 0
      %faber.latched.status10 = select i1 %faber.has.error10, i32 %faber.old.status10, i32 %faber.diag.status10
      store i32 %faber.latched.status10, ptr @__faber_rt_v1_status
      ret void
}

define %FaberRtExitV1 @__faber_program_entry_v1(ptr %context) {
    entry:
      store ptr %context, ptr @__faber_rt_v1_context
      call void @incipit()
      %faber.entry.status = load i32, ptr @__faber_rt_v1_status
      %faber.entry.status.ext = zext i32 %faber.entry.status to i64
      %faber.entry.shifted = shl i64 %faber.entry.status.ext, 32
      %faber.entry.packed = or i64 0, %faber.entry.shifted
      ret %FaberRtExitV1 %faber.entry.packed
}

---

All lanes · Measured support per term