module test; import std::io; fn void main() { ichar x = 23; ichar y = 121; ichar z1; ichar z2; ichar z3; ichar z4; ichar z5; bool success1 = $$overflow_mul(x, y, &z1); bool success2 = $$overflow_add(x, y, &z2); bool success3 = $$overflow_add(x, x, &z3); bool success4 = $$overflow_sub($$neg(y), y, &z4); bool success5 = $$overflow_sub(x, y, &z5); io::printfn("%s %s", success1, z1); io::printfn("%s %s", success2, z2); io::printfn("%s %s", success3, z3); io::printfn("%s %s", success4, z4); io::printfn("%s %s", success5, z5); } /* #expect: test.ll %0 = load i8, ptr %x, align 1 %1 = load i8, ptr %y, align 1 %2 = call { i8, i1 } @llvm.smul.with.overflow.i8(i8 %0, i8 %1) %3 = extractvalue { i8, i1 } %2, 1 %4 = extractvalue { i8, i1 } %2, 0 store i8 %4, ptr %z1, align 1 %5 = zext i1 %3 to i8 store i8 %5, ptr %success1, align 1 %6 = load i8, ptr %x, align 1 %7 = load i8, ptr %y, align 1 %8 = call { i8, i1 } @llvm.sadd.with.overflow.i8(i8 %6, i8 %7) %9 = extractvalue { i8, i1 } %8, 1 %10 = extractvalue { i8, i1 } %8, 0 store i8 %10, ptr %z2, align 1 %11 = zext i1 %9 to i8 store i8 %11, ptr %success2, align 1 %12 = load i8, ptr %x, align 1 %13 = load i8, ptr %x, align 1 %14 = call { i8, i1 } @llvm.sadd.with.overflow.i8(i8 %12, i8 %13) %15 = extractvalue { i8, i1 } %14, 1 %16 = extractvalue { i8, i1 } %14, 0 store i8 %16, ptr %z3, align 1 %17 = zext i1 %15 to i8 store i8 %17, ptr %success3, align 1 %18 = load i8, ptr %y, align 1 %eneg = sub i8 0, %18 %19 = load i8, ptr %y, align 1 %20 = call { i8, i1 } @llvm.ssub.with.overflow.i8(i8 %eneg, i8 %19) %21 = extractvalue { i8, i1 } %20, 1 %22 = extractvalue { i8, i1 } %20, 0 store i8 %22, ptr %z4, align 1 %23 = zext i1 %21 to i8 store i8 %23, ptr %success4, align 1 %24 = load i8, ptr %x, align 1 %25 = load i8, ptr %y, align 1 %26 = call { i8, i1 } @llvm.ssub.with.overflow.i8(i8 %24, i8 %25) %27 = extractvalue { i8, i1 } %26, 1 %28 = extractvalue { i8, i1 } %26, 0 store i8 %28, ptr %z5, align 1 %29 = zext i1 %27 to i8 store i8 %29, ptr %success5, align 1