rust/tests/codegen
bors 432fffa8af Auto merge of #118991 - nikic:scalar-pair, r=nagisa
Separate immediate and in-memory ScalarPair representation

Currently, we assume that ScalarPair is always represented using a two-element struct, both as an immediate value and when stored in memory.

This currently works fairly well, but runs into problems with https://github.com/rust-lang/rust/pull/116672, where a ScalarPair involving an i128 type can no longer be represented as a two-element struct in memory. For example, the tuple `(i32, i128)` needs to be represented in-memory as `{ i32, [3 x i32], i128 }` to satisfy alignment requirements. Using `{ i32, i128 }` instead will result in the second element being stored at the wrong offset (prior to LLVM 18).

Resolve this issue by no longer requiring that the immediate and in-memory type for ScalarPair are the same. The in-memory type will now look the same as for normal struct types (and will include padding filler and similar), while the immediate type stays a simple two-element struct type. This also means that booleans in immediate ScalarPair are now represented as i1 rather than i8, just like we do everywhere else.

The core change here is to llvm_type (which now treats ScalarPair as a normal struct) and immediate_llvm_type (which returns the two-element struct that llvm_type used to produce). The rest is fixing things up to no longer assume these are the same. In particular, this switches places that try to get pointers to the ScalarPair elements to use byte-geps instead of struct-geps.
2024-01-05 14:31:56 +00:00
..
auxiliary
avr
cffi
cross-crate-inlining Add -Zcross-crate-inline-threshold=yes 2023-11-07 18:45:11 -05:00
debug-accessibility Adapt debug-accessibility tests for msvc-style enums 2023-12-15 11:45:03 +00:00
dllimports
enum
instrument-xray Automatically enable cross-crate inlining for small functions 2023-10-17 19:53:51 -04:00
intrinsics Separate immediate and in-memory ScalarPair representation 2023-12-15 17:42:05 +01:00
issues Revert codegen test change. 2023-12-24 20:08:58 +00:00
lib-optimizations restrict test to x86-64 2023-09-02 13:42:58 +02:00
loongarch-abi
macos Raise minimum supported macOS to 10.12 2023-09-23 19:14:25 -05:00
naked-fn
non-terminate
remap_path_prefix
repr add support for rustc_abi(assert_eq) and use it to test some repr(transparent) cases 2023-09-07 09:14:29 +02:00
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 Automatically enable cross-crate inlining for small functions 2023-10-17 19:53:51 -04:00
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
array-clone.rs
array-codegen.rs Copy 1-element arrays as scalars, not vectors 2023-10-07 00:10:32 -07:00
array-equality.rs
array-map.rs
array-optimized.rs Copy 1-element arrays as scalars, not vectors 2023-10-07 00:10:32 -07:00
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 Automatically enable cross-crate inlining for small functions 2023-10-17 19:53:51 -04:00
asm-target-clobbers.rs
async-fn-debug-awaitee-field.rs s/generator/coroutine/ 2023-10-20 21:14:01 +00:00
async-fn-debug-msvc.rs s/generator/coroutine/ 2023-10-20 21:14:01 +00:00
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 Refactor some char, u8 ascii functions to be branchless 2023-10-26 21:48:36 -04:00
codemodels.rs
coercions.rs
cold-call-declare-and-call.rs
comparison-operators-2-tuple.rs
comparison-operators-newtype.rs
const_scalar_pair.rs
consts.rs
coroutine-debug-msvc.rs Rename lots of files that had generator in their name 2023-10-20 21:14:02 +00:00
coroutine-debug.rs Rename lots of files that had generator in their name 2023-10-20 21:14:02 +00:00
dealloc-no-unwind.rs
debug-alignment.rs
debug-column-msvc.rs
debug-column.rs
debug-compile-unit-path.rs
debug-fndef-size.rs Ignore MSVC in test. 2023-10-08 16:45:45 +00:00
debug-limited.rs
debug-line-directives-only.rs
debug-line-tables-only.rs
debug-linkage-name.rs Automatically enable cross-crate inlining for small functions 2023-10-17 19:53:51 -04:00
debug-vtable.rs
debuginfo-constant-locals.rs
debuginfo-generic-closure-env-names.rs
debuginfo-inline-callsite-location.rs Deduplicate inlined function debug info, but create a new lexical scope to child subsequent scopes and variables from colliding 2023-09-01 14:27:21 -07: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 Automatically enable cross-crate inlining for small functions 2023-10-17 19:53:51 -04:00
drop-in-place-noalias.rs
drop.rs Automatically enable cross-crate inlining for small functions 2023-10-17 19:53:51 -04:00
dst-vtable-align-nonzero.rs
dst-vtable-size-range.rs
ehcontguard_disabled.rs Add support for generating the EHCont section 2023-11-21 13:41:23 -08:00
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
float_math.rs
fn-impl-trait-self.rs
foo.s
force-frame-pointers.rs Automatically enable cross-crate inlining for small functions 2023-10-17 19:53:51 -04:00
force-no-unwind-tables.rs
force-unwind-tables.rs Automatically enable cross-crate inlining for small functions 2023-10-17 19:53:51 -04:00
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
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 Automatically enable cross-crate inlining for small functions 2023-10-17 19:53:51 -04:00
inline-hint.rs
instrument-coverage-off.rs coverage: Add UI tests for values accepted by -Cinstrument-coverage 2023-10-23 17:41:40 +11:00
instrument-coverage.rs coverage: Add UI tests for values accepted by -Cinstrument-coverage 2023-10-23 17:41:40 +11:00
instrument-mcount.rs Automatically enable cross-crate inlining for small functions 2023-10-17 19:53:51 -04:00
integer-cmp.rs
integer-overflow.rs
internalize-closures.rs
intrinsic-no-unnamed-attr.rs
issue-97217.rs Limit to LLVM 17.0.2 to work around WinEH codegen bug 2023-10-02 11:06:38 +02:00
iter-repeat-n-trivial-drop.rs
layout-size-checks.rs
lifetime_start_end.rs
link_section.rs
link-dead-code.rs
llvm_module_flags.rs Add -Z llvm_module_flag 2023-11-11 19:48:47 -08:00
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
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 Automatically enable cross-crate inlining for small functions 2023-10-17 19:53:51 -04:00
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
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 update tests that are ignored by debug 2023-09-01 04:01:54 +08:00
slice-indexing.rs
slice-init.rs
slice-iter-fold.rs Update the minimum external LLVM to 16. 2023-11-21 22:40:16 +01:00
slice-iter-len-eq-zero.rs
slice-iter-nonnull.rs Separate immediate and in-memory ScalarPair representation 2023-12-15 17:42:05 +01:00
slice-position-bounds-check.rs
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
target-cpu-on-functions.rs Automatically enable cross-crate inlining for small functions 2023-10-17 19:53:51 -04:00
target-feature-inline-closure.rs Don't accidentally detect the commit hash as an fadd instruction 2023-10-10 16:59:49 +11:00
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 Automatically enable cross-crate inlining for small functions 2023-10-17 19:53:51 -04:00
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 Automatically enable cross-crate inlining for small functions 2023-10-17 19:53:51 -04:00
tuple-layout-opt.rs
unchecked_shifts.rs tests: update check for inferred nneg on zext 2023-11-13 10:43:33 -05:00
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 Limit to LLVM 17.0.2 to work around WinEH codegen bug 2023-10-02 11:06:38 +02:00
unwind-landingpad-inline.rs Limit to LLVM 17.0.2 to work around WinEH codegen bug 2023-10-02 11:06:38 +02:00
used_with_arg.rs
var-names.rs
vec_pop_push_noop.rs Add invariant to Vec::pop that len < cap if pop successful 2023-10-16 18:49:25 +02:00
vec-as-ptr.rs
vec-calloc.rs
vec-in-place.rs Update the minimum external LLVM to 16. 2023-11-21 22:40:16 +01:00
vec-iter-collect-len.rs
vec-optimizes-away.rs
vec-reserve-extend.rs Hint optimizer about reserved capacity 2023-11-02 00:52:06 +00:00
vec-shrink-panik.rs
vecdeque_no_panic.rs
vecdeque-nonempty-get-no-panic.rs Add test to guard against VecDeque optimization regression 2023-09-21 20:42:21 -07:00
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