compiler_rt: work around LLVM optimizing __muloti4 to call itself
This is a workaround for https://github.com/llvm/llvm-project/issues/56403
This commit is contained in:
@@ -65,6 +65,15 @@ pub fn __mulodi4(a: i64, b: i64, overflow: *c_int) callconv(.C) i64 {
|
||||
}
|
||||
|
||||
pub fn __muloti4(a: i128, b: i128, overflow: *c_int) callconv(.C) i128 {
|
||||
switch (builtin.zig_backend) {
|
||||
.stage1, .stage2_llvm => {
|
||||
// Workaround for https://github.com/llvm/llvm-project/issues/56403
|
||||
// When we call the genericSmall implementation instead, LLVM optimizer
|
||||
// optimizes __muloti4 to a call to itself.
|
||||
return muloXi4_genericFast(i128, a, b, overflow);
|
||||
},
|
||||
else => {},
|
||||
}
|
||||
if (2 * @bitSizeOf(i128) <= @bitSizeOf(usize)) {
|
||||
return muloXi4_genericFast(i128, a, b, overflow);
|
||||
} else {
|
||||
|
||||
@@ -609,14 +609,6 @@ test "128-bit multiplication" {
|
||||
if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO
|
||||
if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO
|
||||
|
||||
if ((builtin.zig_backend == .stage1 or builtin.zig_backend == .stage2_llvm) and
|
||||
builtin.cpu.arch == .wasm32)
|
||||
{
|
||||
// TODO This regressed with LLVM 14 due to the __muloti4 compiler-rt symbol
|
||||
// being lowered to call itself despite having the "nobuiltin" attribute.
|
||||
return error.SkipZigTest;
|
||||
}
|
||||
|
||||
var a: i128 = 3;
|
||||
var b: i128 = 2;
|
||||
var c = a * b;
|
||||
|
||||
Reference in New Issue
Block a user