Commit d8fc8d0118

Andrew Kelley <andrew@ziglang.org>
2022-07-06 06:28:39
compiler_rt: work around LLVM optimizing __muloti4 to call itself
This is a workaround for https://github.com/llvm/llvm-project/issues/56403
1 parent 558ad19
Changed files (2)
lib
compiler_rt
test
behavior
lib/compiler_rt/mulo.zig
@@ -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 {
test/behavior/math.zig
@@ -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;