Skip to content

Conversation

@0xGeorgii
Copy link

No description provided.

@0xGeorgii 0xGeorgii requested a review from Copilot December 8, 2025 06:49
Copy link

Copilot AI left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

This PR adds support for Uzumaki inference non-deterministic intrinsics to the WebAssembly LLVM target, enabling formal verification constructs in WebAssembly bytecode.

  • Introduces two non-deterministic value intrinsics (uzumaki_i32 and uzumaki_i64) that produce arbitrary values
  • Adds four inference block types (forall, exists, assume, unique) with corresponding start/end markers for reasoning about execution paths
  • Includes a GitHub Actions workflow to build and distribute static LLVM artifacts with these custom extensions

Reviewed changes

Copilot reviewed 10 out of 11 changed files in this pull request and generated 5 comments.

Show a summary per file
File Description
llvm/lib/Target/WebAssembly/WebAssemblyInstrInteger.td Defines instruction patterns for Uzumaki i32/i64 value operations
llvm/lib/Target/WebAssembly/WebAssemblyInstrInfo.td Declares SDNode type profiles and SDNodes for Uzumaki and inference block operations
llvm/lib/Target/WebAssembly/WebAssemblyInstrControl.td Adds TableGen definitions for inference block instructions (FORALL, EXISTS, ASSUME, UNIQUE)
llvm/lib/Target/WebAssembly/WebAssemblyISelLowering.cpp Implements intrinsic lowering to custom WebAssembly ISD nodes
llvm/lib/Target/WebAssembly/WebAssemblyISelDAGToDAG.cpp Handles instruction selection for inference intrinsics, converting them to machine instructions
llvm/lib/Target/WebAssembly/WebAssemblyISD.def Registers new ISD node types in the WebAssembly backend
llvm/lib/Target/WebAssembly/WebAssemblyAsmPrinter.cpp Emits custom opcodes for Uzumaki and inference block instructions
llvm/lib/CodeGen/SelectionDAG/SelectionDAGBuilder.cpp Adds special handling for inference intrinsics in invoke instruction processing
llvm/include/llvm/IR/IntrinsicsWebAssembly.td Declares LLVM IR intrinsic definitions for Uzumaki and inference blocks
.github/workflows/build-inference-llvm-artifacts.yml Provides CI/CD pipeline for building and packaging static LLVM libraries with custom intrinsics
Files not reviewed (1)
  • mlir/utils/vscode/package-lock.json: Language not supported

💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.

@0xGeorgii 0xGeorgii requested a review from Copilot December 8, 2025 07:24
Copy link

Copilot AI left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

Copilot reviewed 10 out of 12 changed files in this pull request and generated 1 comment.

Files not reviewed (2)
  • lldb/tools/lldb-dap/package-lock.json: Language not supported
  • mlir/utils/vscode/package-lock.json: Language not supported

💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.

…kflow

- Add uzumaki.i32 and uzumaki.i64 intrinsics for WebAssembly
- Add inference block intrinsics: forall, exists, assume, unique
- Implement instruction definitions and lowering in WebAssembly backend
- Add GitHub Actions workflow for building LLVM static artifacts (Linux/Windows)
- Configure static linking with WebAssembly and X86 targets
@0xGeorgii 0xGeorgii self-assigned this Dec 8, 2025
@0xGeorgii 0xGeorgii closed this Dec 9, 2025
@0xGeorgii 0xGeorgii deleted the uzumaki-intrinsics branch December 9, 2025 00:00
0xGeorgii pushed a commit that referenced this pull request Dec 10, 2025
… errors (llvm#169989)

We can see the following while running clang-repl in C mode 
```
anutosh491@vv-nuc:/build/anutosh491/llvm-project/build/bin$ ./clang-repl --Xcc=-x --Xcc=c --Xcc=-std=c23
clang-repl> printf("hi\n");
In file included from <<< inputs >>>:1:
input_line_1:1:1: error: call to undeclared library function 'printf' with type 'int (const char *, ...)'; ISO C99 and
      later do not support implicit function declarations [-Wimplicit-function-declaration]
    1 | printf("hi\n");
      | ^
input_line_1:1:1: note: include the header <stdio.h> or explicitly provide a declaration for 'printf'
error: Parsing failed.
clang-repl> #include <stdio.h>
hi
```

In debug mode while dumping the generated Module, i see this 
```
clang-repl> printf("hi\n");
In file included from <<< inputs >>>:1:
input_line_1:1:1: error: call to undeclared library function 'printf' with type 'int (const char *, ...)'; ISO C99 and
      later do not support implicit function declarations [-Wimplicit-function-declaration]
    1 | printf("hi\n");
      | ^
input_line_1:1:1: note: include the header <stdio.h> or explicitly provide a declaration for 'printf'
error: Parsing failed.
clang-repl> #include <stdio.h>

=== compile-ptu 1 ===
[TU=0x55556cfbf830, M=0x55556cfc13a0 (incr_module_1)]
[LLVM IR]
; ModuleID = 'incr_module_1'
source_filename = "incr_module_1"
target datalayout = "e-m:e-p270:32:32-p271:32:32-p272:64:64-i64:64-i128:128-f80:128-n8:16:32:64-S128"
target triple = "x86_64-unknown-linux-gnu"

@.str = private unnamed_addr constant [4 x i8] c"hi\0A\00", align 1
@llvm.global_ctors = appending global [1 x { i32, ptr, ptr }] [{ i32, ptr, ptr } { i32 65535, ptr @_GLOBAL__sub_I_incr_module_1, ptr null }]

define internal void @__stmts__0() #0 {
entry:
  %call = call i32 (ptr, ...) @printf(ptr noundef @.str)
  ret void
}

declare i32 @printf(ptr noundef, ...) #1

; Function Attrs: noinline nounwind uwtable
define internal void @_GLOBAL__sub_I_incr_module_1() #2 section ".text.startup" {
entry:
  call void @__stmts__0()
  ret void
}

attributes #0 = { "min-legal-vector-width"="0" }
attributes #1 = { "frame-pointer"="all" "no-trapping-math"="true" "stack-protector-buffer-size"="8" "target-cpu"="x86-64" "target-features"="+cmov,+cx8,+fxsr,+mmx,+sse,+sse2,+x87" "tune-cpu"="generic" }
attributes #2 = { noinline nounwind uwtable "frame-pointer"="all" "min-legal-vector-width"="0" "no-trapping-math"="true" "stack-protector-buffer-size"="8" "target-cpu"="x86-64" "target-features"="+cmov,+cx8,+fxsr,+mmx,+sse,+sse2,+x87" "tune-cpu"="generic" }

!llvm.module.flags = !{!0, !1, !2, !3, !4}
!llvm.ident = !{!5}

!0 = !{i32 1, !"wchar_size", i32 4}
!1 = !{i32 8, !"PIC Level", i32 2}
!2 = !{i32 7, !"PIE Level", i32 2}
!3 = !{i32 7, !"uwtable", i32 2}
!4 = !{i32 7, !"frame-pointer", i32 2}
!5 = !{!"clang version 22.0.0git (https://github.com/anutosh491/llvm-project.git 81ad8fb)"}
=== end compile-ptu ===

execute-ptu 1: [TU=0x55556cfbf830, M=0x55556cfc13a0 (incr_module_1)]
hi
```

Basically I see that CodeGen emits IR for a cell before we know whether
DiagnosticsEngine has an error. For C code like `printf("hi\n");`
without <stdio.h>, Sema emits a diagnostic but still produces a
"codegen-able" `TopLevelStmt`, so the `printf` call is IR-generated into
the current module.

Previously, when `Diags.hasErrorOccurred()` was true, we only cleaned up
the PTU AST and left the CodeGen module untouched. The next successful
cell then called `GenModule()`, which returned that same module (now
also containing the next cell’s IR), causing side effects from the
failed cell (e.g. printf)
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants