rust/tests/codegen
bors dfa88b328f Auto merge of #120500 - oli-obk:intrinsics2.0, r=WaffleLapkin
Implement intrinsics with fallback bodies

fixes #93145 (though we can port many more intrinsics)
cc #63585

The way this works is that the backend logic for generating custom code for intrinsics has been made fallible. The only failure path is "this intrinsic is unknown". The `Instance` (that was `InstanceDef::Intrinsic`) then gets converted to `InstanceDef::Item`, which represents the fallback body. A regular function call to that body is then codegenned. This is currently implemented for

* codegen_ssa (so llvm and gcc)
* codegen_cranelift

other backends will need to adjust, but they can just keep doing what they were doing if they prefer (though adding new intrinsics to the compiler will then require them to implement them, instead of getting the fallback body).

cc `@scottmcm` `@WaffleLapkin`

### todo

* [ ] miri support
* [x] default intrinsic name to name of function instead of requiring it to be specified in attribute
* [x] make sure that the bodies are always available (must be collected for metadata)
2024-02-16 09:53:01 +00:00
..
auxiliary
avr
cffi Remove ffi_returns_twice feature 2024-01-30 22:09:09 +00:00
cross-crate-inlining
debug-accessibility Adapt debug-accessibility tests for msvc-style enums 2023-12-15 11:45:03 +00:00
dllimports
enum
instrument-xray
intrinsics Separate immediate and in-memory ScalarPair representation 2023-12-15 17:42:05 +01:00
issues Remove uses of no-system-llvm 2024-01-23 10:31:07 +01:00
lib-optimizations
loongarch-abi
macos
naked-fn
non-terminate
remap_path_prefix
repr
riscv-abi
sanitizer CFI: Add char to CFI integer normalization 2023-12-07 11:28:16 -08:00
simd Update std::simd usage and test outputs 2023-11-26 09:02:25 -05:00
simd-intrinsic Fix alignment passed down to LLVM for simd_masked_load 2023-12-12 13:11:59 +01:00
src-hash-algorithm
unwind-abis
aarch64-struct-align-128.rs
abi-efiapi.rs
abi-main-signature-16bit-c-int.rs
abi-main-signature-32bit-c-int.rs llvm: Allow noundef in codegen tests 2024-01-02 18:02:17 +00:00
abi-repr-ext.rs
abi-sysv64.rs
abi-x86_64_sysv.rs
abi-x86-interrupt.rs
addr-of-mutate.rs
adjustments.rs
align-byval-vector.rs
align-byval.rs Separate immediate and in-memory ScalarPair representation 2023-12-15 17:42:05 +01:00
align-enum.rs
align-fn.rs
align-offset.rs
align-struct.rs Separate immediate and in-memory ScalarPair representation 2023-12-15 17:42:05 +01:00
alloc-optimisation.rs Remove uses of no-system-llvm 2024-01-23 10:31:07 +01:00
array-clone.rs
array-codegen.rs
array-equality.rs
array-map.rs Remove uses of no-system-llvm 2024-01-23 10:31:07 +01:00
array-optimized.rs
ascii-char.rs update test for new LLVM 18 codegen 2023-11-28 12:10:59 +00:00
asm-clobber_abi.rs
asm-clobbers.rs
asm-may_unwind.rs
asm-maybe-uninit.rs
asm-multiple-options.rs
asm-options.rs
asm-powerpc-clobbers.rs
asm-sanitize-llvm.rs
asm-target-clobbers.rs
async-closure-debug.rs Build DebugInfo for coroutine-closure 2024-02-09 16:01:29 +00:00
async-fn-debug-awaitee-field.rs
async-fn-debug-msvc.rs
async-fn-debug.rs
atomic-operations.rs
autovectorize-f32x4.rs
binary-search-index-no-bound-check.rs
bool-cmp.rs
box-uninit-bytes.rs
bpf-alu32.rs
branch-protection.rs
call-llvm-intrinsics.rs
call-metadata.rs
catch-unwind.rs
cdylib-external-inline-fns.rs
cf-protection.rs
cfguard-checks.rs
cfguard-disabled.rs
cfguard-nochecks.rs
cfguard-non-msvc.rs
char-ascii-branchless.rs
codemodels.rs
coercions.rs
cold-call-declare-and-call.rs
comparison-operators-2-tuple.rs Remove an unneeded helper from the tuple library code 2023-11-25 22:25:00 -08:00
comparison-operators-newtype.rs
const_scalar_pair.rs
consts.rs
coroutine-debug-msvc.rs
coroutine-debug.rs
dealloc-no-unwind.rs Remove uses of no-system-llvm 2024-01-23 10:31:07 +01:00
debug-alignment.rs
debug-column-msvc.rs
debug-column.rs
debug-compile-unit-path.rs
debug-fndef-size.rs
debug-limited.rs
debug-line-directives-only.rs
debug-line-tables-only.rs
debug-linkage-name.rs
debug-vtable.rs
debuginfo-constant-locals.rs
debuginfo-generic-closure-env-names.rs
debuginfo-inline-callsite-location.rs Split out option::unwrap_failed like we have result::unwrap_failed 2024-01-14 12:45:01 -08:00
deduced-param-attrs.rs
default-hidden-visibility.rs Add unstable -Zdefault-hidden-visibility cmdline flag for rustc. 2023-12-13 21:14:23 +00:00
default-requires-uwtable.rs
direct-access-external-data.rs Add unstable -Z direct-access-external-data cmdline flag for rustc 2024-01-16 19:15:06 +08:00
drop-in-place-noalias.rs
drop.rs
dst-vtable-align-nonzero.rs
dst-vtable-size-range.rs
ehcontguard_disabled.rs
ehcontguard_enabled.rs convert ehcont-guard to an unstable option 2023-11-21 14:24:23 -08:00
enable-lto-unit-splitting.rs
export-no-mangle.rs
external-no-mangle-fns.rs
external-no-mangle-statics.rs
fastcall-inreg.rs
fatptr.rs
fewer-names.rs Remove uses of no-system-llvm 2024-01-23 10:31:07 +01:00
float_math.rs
fn-impl-trait-self.rs
foo.s
force-frame-pointers.rs
force-no-unwind-tables.rs
force-unwind-tables.rs
frame-pointer.rs
function-arguments-noopt.rs Separate immediate and in-memory ScalarPair representation 2023-12-15 17:42:05 +01:00
function-arguments.rs Separate immediate and in-memory ScalarPair representation 2023-12-15 17:42:05 +01:00
function-return.rs Add -Zfunction-return={keep,thunk-extern} option 2023-11-30 20:21:31 +01:00
gdb_debug_script_load.rs
generic-debug.rs
global_asm_include.rs
global_asm_x2.rs
global_asm.rs
i128-x86-align.rs Directly use volatile_load intrinsic 2024-01-19 10:52:01 +01:00
infallible-unwrap-in-opt-z.rs adapt test for v0 symbol mangling 2024-01-24 14:57:21 +00:00
inherit_overflow.rs Replace legacy ConstProp by GVN. 2023-12-24 20:08:57 +00:00
inline-always-works-always.rs
inline-debuginfo.rs
inline-function-args-debug-info.rs
inline-hint.rs
instrument-coverage-off.rs
instrument-coverage.rs
instrument-mcount.rs
integer-cmp.rs
integer-overflow.rs Remove uses of no-system-llvm 2024-01-23 10:31:07 +01:00
internalize-closures.rs
intrinsic-no-unnamed-attr.rs
is_val_statically_known.rs Support safe intrinsics with fallback bodies 2024-02-12 17:55:36 +00:00
issue-97217.rs
iter-repeat-n-trivial-drop.rs tests: LLVM 18 infers an extra noalias here 2024-02-13 10:33:40 +01:00
layout-size-checks.rs
lifetime_start_end.rs
link_section.rs
link-dead-code.rs
llvm_module_flags.rs
llvm-ident.rs
loads.rs
local-generics-in-exe-internalized.rs
lto-removes-invokes.rs
mainsubprogram.rs
mainsubprogramstart.rs
match-optimized.rs
match-optimizes-away.rs Remove uses of no-system-llvm 2024-01-23 10:31:07 +01:00
match-unoptimized.rs
maybeuninit-rvo.rs Add codegen test for RVO on MaybeUninit 2024-01-03 21:18:07 +01:00
mem-replace-big-type.rs
mem-replace-simple-type.rs
merge-functions.rs
method-declaration.rs
mir_zst_stores.rs
mir-inlined-line-numbers.rs
move-before-nocapture-ref-arg.rs
move-operands.rs
no_builtins-at-crate.rs
no-assumes-on-casts.rs
no-dllimport-w-cross-lang-lto.rs
no-jump-tables.rs
no-plt.rs
noalias-box-off.rs
noalias-box.rs
noalias-flag.rs
noalias-refcell.rs
noalias-rwlockreadguard.rs
noalias-unpin.rs
noreturn-uninhabited.rs
noreturnflag.rs
nounwind.rs
nrvo.rs
optimize-attr-1.rs
option-as-slice.rs
option-nonzero-eq.rs
overaligned-constant.rs tests: fix overaligned-constant to not over-specify getelementptr instr 2023-12-21 15:53:28 -05:00
packed.rs
panic-abort-windows.rs
panic-in-drop-abort.rs
panic-unwind-default-uwtable.rs
personality_lifetimes.rs Make test compatible with 32-bit as well 2024-01-05 11:45:57 +01:00
pgo-counter-bias.rs
pgo-instrumentation.rs
pic-relocation-model.rs
pie-relocation-model.rs
ptr-arithmetic.rs
ptr-read-metadata.rs Remove uses of no-system-llvm 2024-01-23 10:31:07 +01:00
README.md
refs.rs Separate immediate and in-memory ScalarPair representation 2023-12-15 17:42:05 +01:00
repeat-trusted-len.rs
scalar-pair-bool.rs Separate immediate and in-memory ScalarPair representation 2023-12-15 17:42:05 +01:00
set-discriminant-invalid.rs
slice_as_from_ptr_range.rs
slice-as_chunks.rs Remove uses of no-system-llvm 2024-01-23 10:31:07 +01:00
slice-indexing.rs
slice-init.rs
slice-iter-fold.rs
slice-iter-len-eq-zero.rs Remove uses of no-system-llvm 2024-01-23 10:31:07 +01:00
slice-iter-nonnull.rs Remove uses of no-system-llvm 2024-01-23 10:31:07 +01:00
slice-position-bounds-check.rs Remove uses of no-system-llvm 2024-01-23 10:31:07 +01:00
slice-ref-equality.rs
slice-reverse.rs
slice-windows-no-bounds-check.rs
some-abis-do-extend-params-to-32-bits.rs
some-global-nonnull.rs
sparc-struct-abi.rs llvm: Allow noundef in codegen tests 2024-01-02 18:02:17 +00:00
split-lto-unit.rs
sroa-fragment-debuginfo.rs
sse42-implies-crc32.rs
stack-probes-inline.rs Enable stack probes on aarch64 for LLVM 18 2023-12-07 17:17:00 -08:00
stack-protector.rs
static-relocation-model-msvc.rs
staticlib-external-inline-fns.rs
stores.rs
swap-large-types.rs
swap-small-types.rs Tweak the threshold for chunked swapping 2024-01-19 23:00:34 -08:00
target-cpu-on-functions.rs
target-feature-inline-closure.rs
target-feature-overrides.rs
thin-lto.rs Add thinlto support to codegen, assembly and coverage tests 2023-11-30 18:48:03 +08:00
thread-local.rs
tied-features-strength.rs
to_vec.rs
trailing_zeros.rs
transmute-optimized.rs
transmute-scalar.rs
try_identity.rs
try_question_mark_nop.rs
tune-cpu-on-functions.rs
tuple-layout-opt.rs
unchecked_shifts.rs
unchecked-float-casts.rs
uninit-consts.rs
union-abi.rs
unwind-and-panic-abort.rs
unwind-extern-exports.rs
unwind-extern-imports.rs
unwind-landingpad-cold.rs
unwind-landingpad-inline.rs
used_with_arg.rs
var-names.rs
vec_pop_push_noop.rs update codegen tests 2024-01-22 15:46:32 +01:00
vec-as-ptr.rs
vec-calloc.rs
vec-in-place.rs
vec-iter-collect-len.rs Remove uses of no-system-llvm 2024-01-23 10:31:07 +01:00
vec-iter.rs mark vec::IntoIter pointers as !nonnull 2024-01-07 03:44:04 +01:00
vec-optimizes-away.rs Remove uses of no-system-llvm 2024-01-23 10:31:07 +01:00
vec-reserve-extend.rs update codegen tests 2024-01-22 15:46:32 +01:00
vec-shrink-panik.rs
vecdeque_no_panic.rs
vecdeque-nonempty-get-no-panic.rs
virtual-function-elimination-32bit.rs
virtual-function-elimination.rs
wasm_casts_trapping.rs
wasm_exceptions.rs
zip.rs
zst-offset.rs Address review comments 2024-01-02 15:03:14 +01:00

The files here use the LLVM FileCheck framework, documented at https://llvm.org/docs/CommandGuide/FileCheck.html.

One extension worth noting is the use of revisions as custom prefixes for FileCheck. If your codegen test has different behavior based on the chosen target or different compiler flags that you want to exercise, you can use a revisions annotation, like so:

// revisions: aaa bbb
// [bbb] compile-flags: --flags-for-bbb

After specifying those variations, you can write different expected, or explicitly unexpected output by using <prefix>-SAME: and <prefix>-NOT:, like so:

// CHECK: expected code
// aaa-SAME: emitted-only-for-aaa
// aaa-NOT:                        emitted-only-for-bbb
// bbb-NOT:  emitted-only-for-aaa
// bbb-SAME:                       emitted-only-for-bbb