diff options
| author | bors <bors@rust-lang.org> | 2025-02-04 17:46:06 +0000 |
|---|---|---|
| committer | bors <bors@rust-lang.org> | 2025-02-04 17:46:06 +0000 |
| commit | 3f33b30e19b7597a3acbca19e46d9e308865a0fe (patch) | |
| tree | 49a7b8cd49557e130d3fde67fbc5b95b96c129d0 /compiler/rustc_codegen_ssa/src/traits/builder.rs | |
| parent | 01e4f19cc8027925ffe0885a86388b700e46bfab (diff) | |
| parent | f46e6be1908c7ed729655c8f601548f732ef49f4 (diff) | |
| download | rust-3f33b30e19b7597a3acbca19e46d9e308865a0fe.tar.gz rust-3f33b30e19b7597a3acbca19e46d9e308865a0fe.zip | |
Auto merge of #135760 - scottmcm:disjoint-bitor, r=WaffleLapkin
Add `unchecked_disjoint_bitor` per ACP373 Following the names from libs-api in https://github.com/rust-lang/libs-team/issues/373#issuecomment-2085686057 Includes a fallback implementation so this doesn't have to update cg_clif or cg_gcc, and overrides it in cg_llvm to use `or disjoint`, which [is available in LLVM 18](https://releases.llvm.org/18.1.0/docs/LangRef.html#or-instruction) so hopefully we don't need any version checks.
Diffstat (limited to 'compiler/rustc_codegen_ssa/src/traits/builder.rs')
| -rw-r--r-- | compiler/rustc_codegen_ssa/src/traits/builder.rs | 5 |
1 files changed, 5 insertions, 0 deletions
diff --git a/compiler/rustc_codegen_ssa/src/traits/builder.rs b/compiler/rustc_codegen_ssa/src/traits/builder.rs index bbf87a59942..b7dcf16fa2b 100644 --- a/compiler/rustc_codegen_ssa/src/traits/builder.rs +++ b/compiler/rustc_codegen_ssa/src/traits/builder.rs @@ -167,6 +167,11 @@ pub trait BuilderMethods<'a, 'tcx>: fn unchecked_umul(&mut self, lhs: Self::Value, rhs: Self::Value) -> Self::Value; fn and(&mut self, lhs: Self::Value, rhs: Self::Value) -> Self::Value; fn or(&mut self, lhs: Self::Value, rhs: Self::Value) -> Self::Value; + /// Defaults to [`Self::or`], but guarantees `(lhs & rhs) == 0` so some backends + /// can emit something more helpful for optimizations. + fn or_disjoint(&mut self, lhs: Self::Value, rhs: Self::Value) -> Self::Value { + self.or(lhs, rhs) + } fn xor(&mut self, lhs: Self::Value, rhs: Self::Value) -> Self::Value; fn neg(&mut self, v: Self::Value) -> Self::Value; fn fneg(&mut self, v: Self::Value) -> Self::Value; |
