-
Notifications
You must be signed in to change notification settings - Fork 0
Add Inference non-det intrinsics #1
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Conversation
There was a problem hiding this 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_i32anduzumaki_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.
There was a problem hiding this 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
c6cca63 to
d799414
Compare
… 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)
No description provided.