Files
TheRock/compiler/amd-llvm/llvm/test/tools/llubi/loadstore_le.ll
T
derek.holloway 7502bf64a4
CodeQL / Analyze (actions) (push) Canceled after 0s
CodeQL / Analyze (python) (push) Canceled after 0s
pre-commit / pre-commit (push) Canceled after 0s
Multi-Arch CI / setup (push) Canceled after 0s
Publish build_manylinux_x86_64 images / publish_build_manylinux_x86_64 (push) Canceled after 0s
Setup (Multi-Arch) / setup (push) Canceled after 0s
Multi-Arch CI / Linux::${{ fromJSON(needs.setup.outputs.linux_build_config || '{}').build_variant_label || 'skip' }} (push) Canceled after 0s
Publish TheRock Docker image / build-and-push-image (push) Canceled after 0s
Publish no_rocm_image_ubi10 image / publish_no_rocm_image_ubi10 (push) Canceled after 0s
Multi-Arch CI / Windows::${{ fromJSON(needs.setup.outputs.windows_build_config || '{}').build_variant_label || 'skip' }} (push) Canceled after 0s
Publish TheRock Docker image / build-and-push-image (push) Canceled after 0s
Multi-Arch CI / Manifest Diff (push) Canceled after 0s
TheRock Manifest Diff Report / Generate Manifest Diff Report (push) Canceled after 0s
Multi-Arch CI / CI Summary (push) Canceled after 0s
Publish no_rocm_image_ubuntu24_04 images / publish_no_rocm_image_ubuntu24_04 (push) Canceled after 0s
Publish no_rocm_image_ubuntu24_04_ocl_rt images / publish_no_rocm_image_ubuntu24_04_ocl_rt (push) Canceled after 0s
Publish TheRock Docker image / build-and-push-image (push) Canceled after 0s
Publish TheRock Docker image / build-and-push-image (push) Canceled after 0s
Publish no_rocm_image_ubuntu24_04 images / publish_no_rocm_image_ubuntu24_04_rocgdb (push) Canceled after 0s
Publish no_rocm_image_ubuntu24_04_rocgdb images / publish_no_rocm_image_ubuntu24_04_rocgdb (push) Canceled after 0s
Publish no_rocm_image_ubuntu24_04 images / publish_no_rocm_image_ubuntu24_04_ocl_rt (push) Canceled after 0s
Publish TheRock Docker image / build-and-push-image (push) Canceled after 0s
Unit Tests / Unit Tests :: ubuntu-24.04 (push) Canceled after 0s
Unit Tests / Unit Tests :: windows-2022 (push) Canceled after 0s
Publish no_rocm_image_ubuntu24_04 images / publish_no_rocm_image_ubuntu24_04_media (push) Canceled after 0s
Unit Tests / Unit Tests Summary (push) Canceled after 0s
Publish no_rocm_image_ubuntu24_04 images / publish_no_rocm_image_ubuntu24_04_openmpi (push) Canceled after 0s
Flatten subprojects into a single base monorepo
2026-09-02 16:34:47 -07:00

215 lines
12 KiB
LLVM

; NOTE: Assertions have been autogenerated by utils/update_llubi_test_checks.py UTC_ARGS: --version 6
; RUN: llubi --verbose < %s 2>&1 | FileCheck %s
target datalayout = "e-p:64:64:64-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:64:64"
%struct = type { [2 x i16], i64 }
%struct.packed = type <{ [2 x i16], i64 }>
%struct.vscale = type { <vscale x 1 x i32>, <vscale x 1 x i32> }
define void @main() {
%alloc = alloca i32
store i32 u0x00010203, ptr %alloc
%val1 = load i32, ptr %alloc
%val2 = load i32, ptr %alloc, align 2
%gep = getelementptr i8, ptr %alloc, i64 1
%val3 = load i8, ptr %gep
%val4 = load <4 x i8>, ptr %alloc
store i16 u0x0405, ptr %gep, align 1
%val5 = load <4 x i8>, ptr %alloc
store <2 x i16> <i16 u0x0607, i16 u0x0809>, ptr %alloc
%val6 = load <4 x i8>, ptr %alloc
%val7 = load <8 x i4>, ptr %alloc
store <3 x i3> <i3 1, i3 2, i3 3>, ptr %alloc
; padding bits are undefined.
%val8 = load <16 x i1>, ptr %alloc
%val9 = load <16 x i1>, ptr %alloc
store <8 x i3> <i3 0, i3 1, i3 2, i3 3, i3 4, i3 5, i3 6, i3 7>, ptr %alloc
%val_bitcast = load <3 x i8>, ptr %alloc
; For non-byte-sized types, the padding bits must be zero.
store i25 -1, ptr %alloc
%val10 = load <4 x i8>, ptr %alloc
%gep2 = getelementptr i8, ptr %alloc, i64 3
store i8 -1, ptr %gep2
; If the padding bits were not zero, load yields poison value.
%val11 = load i25, ptr %alloc
call void @llvm.lifetime.start.p0(ptr poison)
call void @llvm.lifetime.end.p0(ptr poison)
%alloc_lifetime = alloca i32
; Load of an dead object yields poison value.
%val12 = load i32, ptr %alloc_lifetime
call void @llvm.lifetime.start.p0(ptr %alloc_lifetime)
; After lifetime.start, the object is alive but uninitialized.
%val13 = load i32, ptr %alloc_lifetime
%val14 = load i32, ptr %alloc_lifetime
store i32 77, ptr %alloc_lifetime
%val15 = load i32, ptr %alloc_lifetime
; Calling lifetime.start on an alive object makes the contents uninitialized again.
call void @llvm.lifetime.start.p0(ptr %alloc_lifetime)
%val_undef1 = load i32, ptr %alloc_lifetime
%val_undef2 = load i32, ptr %alloc_lifetime
call void @llvm.lifetime.end.p0(ptr %alloc_lifetime)
; Calling lifetime.end on an already dead object is a no-op.
call void @llvm.lifetime.end.p0(ptr %alloc_lifetime)
; Load of an dead object yields poison value.
%val16 = load i32, ptr %alloc_lifetime
store i32 u0xFFF80000, ptr %alloc
%val17 = load float, ptr %alloc
%alloc_vscale = alloca <vscale x 2 x i32>
%insert = insertelement <vscale x 1 x i32> poison, i32 1, i32 0
%ones = shufflevector <vscale x 1 x i32> %insert, <vscale x 1 x i32> poison, <vscale x 1 x i32> zeroinitializer
%twos = add <vscale x 1 x i32> %ones, %ones
store <vscale x 1 x i32> %ones, ptr %alloc_vscale
%gep3 = getelementptr <vscale x 1 x i32>, ptr %alloc_vscale, i64 1
store <vscale x 1 x i32> %twos, ptr %gep3
%val18 = load <vscale x 2 x i32>, ptr %alloc_vscale
%alloc_struct = alloca %struct
store %struct { [2 x i16] [i16 1, i16 2], i64 3 }, ptr %alloc_struct
%val19 = load %struct, ptr %alloc_struct
; Padding bytes of struct are undefined.
%val20 = load i64, ptr %alloc_struct
%val21 = load i64, ptr %alloc_struct
%alloc_struct_packed = alloca %struct.packed
store %struct.packed <{ [2 x i16] [i16 1, i16 2], i64 3 }>, ptr %alloc_struct_packed
%val22 = load %struct.packed, ptr %alloc_struct_packed
; No padding bytes.
%val23 = load i64, ptr %alloc_struct_packed
%val24 = load i64, ptr %alloc_struct_packed
%alloc_struct_vscale = alloca %struct.vscale
store %struct.vscale zeroinitializer, ptr %alloc_struct_vscale
%gep4 = getelementptr <vscale x 1 x i32>, ptr %alloc_struct_vscale, i32 1
store <vscale x 1 x i32> %ones, ptr %gep4
%val25 = load %struct.vscale, ptr %alloc_struct_vscale
%alloc_array = alloca [2 x i32]
store [2 x i32] [i32 1, i32 2], ptr %alloc_array
%val26 = load [2 x i32], ptr %alloc_array
%alloc_i1_vec = alloca <4 x i1>
store <4 x i1> <i1 1, i1 0, i1 poison, i1 0>, ptr %alloc_i1_vec
%val27 = load <4 x i1>, ptr %alloc_i1_vec
%val28 = load i8, ptr %alloc_i1_vec
%alloc_padding = alloca i31
store i32 0, ptr %alloc_padding
%alloc_padding_vec = alloca i64
store { <6 x i5>, i32 } { <6 x i5> zeroinitializer, i32 -1}, ptr %alloc_padding_vec
%load_agg = load { <6 x i5>, i32 }, ptr %alloc_padding_vec
%load_vec = load <6 x i5>, ptr %alloc_padding_vec
%load_int_non_zero_padding = load i33, ptr %alloc_padding_vec
%load_vec_non_zero_padding = load <3 x i11>, ptr %alloc_padding_vec
%alloc_struct_padding = alloca {i8, i32}
store {i8, i32} zeroinitializer, ptr %alloc_struct_padding
%load_struct_noundef = load {i8, i32}, ptr %alloc_struct_padding, !noundef !{}
%alloc_ptr = alloca ptr
store ptr %alloc_ptr, ptr %alloc_ptr
; It should recover the provenance.
%ptr_with_provenance = load ptr, ptr %alloc_ptr
%addr_bits = load i8, ptr %alloc_ptr
store i8 %addr_bits, ptr %alloc_ptr
; The first byte is tainted. We cannot recover the provenance.
%ptr_without_provenance = load ptr, ptr %alloc_ptr
ret void
}
; CHECK: Entering function: main
; CHECK-NEXT: %alloc = alloca i32, align 4 => ptr 0x8 [alloc]
; CHECK-NEXT: store i32 66051, ptr %alloc, align 4
; CHECK-NEXT: %val1 = load i32, ptr %alloc, align 4 => i32 66051
; CHECK-NEXT: %val2 = load i32, ptr %alloc, align 2 => i32 66051
; CHECK-NEXT: %gep = getelementptr i8, ptr %alloc, i64 1 => ptr 0x9 [alloc + 1]
; CHECK-NEXT: %val3 = load i8, ptr %gep, align 1 => i8 2
; CHECK-NEXT: %val4 = load <4 x i8>, ptr %alloc, align 4 => { i8 3, i8 2, i8 1, i8 0 }
; CHECK-NEXT: store i16 1029, ptr %gep, align 1
; CHECK-NEXT: %val5 = load <4 x i8>, ptr %alloc, align 4 => { i8 3, i8 5, i8 4, i8 0 }
; CHECK-NEXT: store <2 x i16> <i16 1543, i16 2057>, ptr %alloc, align 4
; CHECK-NEXT: %val6 = load <4 x i8>, ptr %alloc, align 4 => { i8 7, i8 6, i8 9, i8 8 }
; CHECK-NEXT: %val7 = load <8 x i4>, ptr %alloc, align 4 => { i4 7, i4 0, i4 6, i4 0, i4 -7, i4 0, i4 -8, i4 0 }
; CHECK-NEXT: store <3 x i3> <i3 1, i3 2, i3 3>, ptr %alloc, align 2
; CHECK-NEXT: %val8 = load <16 x i1>, ptr %alloc, align 2 => { T, F, F, F, T, F, T, T, F, F, F, F, F, F, F, F }
; CHECK-NEXT: %val9 = load <16 x i1>, ptr %alloc, align 2 => { T, F, F, F, T, F, T, T, F, F, F, F, F, F, F, F }
; CHECK-NEXT: store <8 x i3> <i3 0, i3 1, i3 2, i3 3, i3 -4, i3 -3, i3 -2, i3 -1>, ptr %alloc, align 4
; CHECK-NEXT: %val_bitcast = load <3 x i8>, ptr %alloc, align 4 => { i8 -120, i8 -58, i8 -6 }
; CHECK-NEXT: store i25 -1, ptr %alloc, align 4
; CHECK-NEXT: %val10 = load <4 x i8>, ptr %alloc, align 4 => { i8 -1, i8 -1, i8 -1, i8 1 }
; CHECK-NEXT: %gep2 = getelementptr i8, ptr %alloc, i64 3 => ptr 0xB [alloc + 3]
; CHECK-NEXT: store i8 -1, ptr %gep2, align 1
; CHECK-NEXT: %val11 = load i25, ptr %alloc, align 4 => poison
; CHECK-NEXT: call void @llvm.lifetime.start.p0(ptr poison)
; CHECK-NEXT: call void @llvm.lifetime.end.p0(ptr poison)
; CHECK-NEXT: %alloc_lifetime = alloca i32, align 4 => ptr 0xC [alloc_lifetime (dead)]
; CHECK-NEXT: %val12 = load i32, ptr %alloc_lifetime, align 4 => poison
; CHECK-NEXT: call void @llvm.lifetime.start.p0(ptr %alloc_lifetime)
; CHECK-NEXT: %val13 = load i32, ptr %alloc_lifetime, align 4 => i32 -289830082
; CHECK-NEXT: %val14 = load i32, ptr %alloc_lifetime, align 4 => i32 -399511892
; CHECK-NEXT: store i32 77, ptr %alloc_lifetime, align 4
; CHECK-NEXT: %val15 = load i32, ptr %alloc_lifetime, align 4 => i32 77
; CHECK-NEXT: call void @llvm.lifetime.start.p0(ptr %alloc_lifetime)
; CHECK-NEXT: %val_undef1 = load i32, ptr %alloc_lifetime, align 4 => i32 -132966042
; CHECK-NEXT: %val_undef2 = load i32, ptr %alloc_lifetime, align 4 => i32 1094190734
; CHECK-NEXT: call void @llvm.lifetime.end.p0(ptr %alloc_lifetime)
; CHECK-NEXT: call void @llvm.lifetime.end.p0(ptr %alloc_lifetime)
; CHECK-NEXT: %val16 = load i32, ptr %alloc_lifetime, align 4 => poison
; CHECK-NEXT: store i32 -524288, ptr %alloc, align 4
; CHECK-NEXT: %val17 = load float, ptr %alloc, align 4 => float 0xFFF80000
; CHECK-NEXT: %alloc_vscale = alloca <vscale x 2 x i32>, align 8 => ptr 0x10 [alloc_vscale]
; CHECK-NEXT: %insert = insertelement <vscale x 1 x i32> poison, i32 1, i32 0 => { i32 1, poison, poison, poison }
; CHECK-NEXT: %ones = shufflevector <vscale x 1 x i32> %insert, <vscale x 1 x i32> poison, <vscale x 1 x i32> zeroinitializer => { i32 1, i32 1, i32 1, i32 1 }
; CHECK-NEXT: %twos = add <vscale x 1 x i32> %ones, %ones => { i32 2, i32 2, i32 2, i32 2 }
; CHECK-NEXT: store <vscale x 1 x i32> %ones, ptr %alloc_vscale, align 4
; CHECK-NEXT: %gep3 = getelementptr <vscale x 1 x i32>, ptr %alloc_vscale, i64 1 => ptr 0x20 [alloc_vscale + 16]
; CHECK-NEXT: store <vscale x 1 x i32> %twos, ptr %gep3, align 4
; CHECK-NEXT: %val18 = load <vscale x 2 x i32>, ptr %alloc_vscale, align 8 => { i32 1, i32 1, i32 1, i32 1, i32 2, i32 2, i32 2, i32 2 }
; CHECK-NEXT: %alloc_struct = alloca %struct, align 8 => ptr 0x30 [alloc_struct]
; CHECK-NEXT: store %struct { [2 x i16] [i16 1, i16 2], i64 3 }, ptr %alloc_struct, align 8
; CHECK-NEXT: %val19 = load %struct, ptr %alloc_struct, align 8 => { { i16 1, i16 2 }, i64 3 }
; CHECK-NEXT: %val20 = load i64, ptr %alloc_struct, align 8 => i64 -7172745523491635199
; CHECK-NEXT: %val21 = load i64, ptr %alloc_struct, align 8 => i64 -3863260483603529727
; CHECK-NEXT: %alloc_struct_packed = alloca %struct.packed, align 8 => ptr 0x40 [alloc_struct_packed]
; CHECK-NEXT: store %struct.packed <{ [2 x i16] [i16 1, i16 2], i64 3 }>, ptr %alloc_struct_packed, align 1
; CHECK-NEXT: %val22 = load %struct.packed, ptr %alloc_struct_packed, align 1 => { { i16 1, i16 2 }, i64 3 }
; CHECK-NEXT: %val23 = load i64, ptr %alloc_struct_packed, align 8 => i64 12885032961
; CHECK-NEXT: %val24 = load i64, ptr %alloc_struct_packed, align 8 => i64 12885032961
; CHECK-NEXT: %alloc_struct_vscale = alloca %struct.vscale, align 8 => ptr 0x50 [alloc_struct_vscale]
; CHECK-NEXT: store %struct.vscale zeroinitializer, ptr %alloc_struct_vscale, align 4
; CHECK-NEXT: %gep4 = getelementptr <vscale x 1 x i32>, ptr %alloc_struct_vscale, i32 1 => ptr 0x60 [alloc_struct_vscale + 16]
; CHECK-NEXT: store <vscale x 1 x i32> %ones, ptr %gep4, align 4
; CHECK-NEXT: %val25 = load %struct.vscale, ptr %alloc_struct_vscale, align 4 => { { i32 0, i32 0, i32 0, i32 0 }, { i32 1, i32 1, i32 1, i32 1 } }
; CHECK-NEXT: %alloc_array = alloca [2 x i32], align 4 => ptr 0x70 [alloc_array]
; CHECK-NEXT: store [2 x i32] [i32 1, i32 2], ptr %alloc_array, align 4
; CHECK-NEXT: %val26 = load [2 x i32], ptr %alloc_array, align 4 => { i32 1, i32 2 }
; CHECK-NEXT: %alloc_i1_vec = alloca <4 x i1>, align 1 => ptr 0x78 [alloc_i1_vec]
; CHECK-NEXT: store <4 x i1> <i1 true, i1 false, i1 poison, i1 false>, ptr %alloc_i1_vec, align 1
; CHECK-NEXT: %val27 = load <4 x i1>, ptr %alloc_i1_vec, align 1 => { T, F, poison, F }
; CHECK-NEXT: %val28 = load i8, ptr %alloc_i1_vec, align 1 => poison
; CHECK-NEXT: %alloc_padding = alloca i31, align 4 => ptr 0x7C [alloc_padding]
; CHECK-NEXT: store i32 0, ptr %alloc_padding, align 4
; CHECK-NEXT: %alloc_padding_vec = alloca i64, align 8 => ptr 0x80 [alloc_padding_vec]
; CHECK-NEXT: store { <6 x i5>, i32 } { <6 x i5> zeroinitializer, i32 -1 }, ptr %alloc_padding_vec, align 4
; CHECK-NEXT: %load_agg = load { <6 x i5>, i32 }, ptr %alloc_padding_vec, align 4 => { { i5 0, i5 0, i5 0, i5 0, i5 0, i5 0 }, i32 -1 }
; CHECK-NEXT: %load_vec = load <6 x i5>, ptr %alloc_padding_vec, align 4 => { i5 0, i5 0, i5 0, i5 0, i5 0, i5 0 }
; CHECK-NEXT: %load_int_non_zero_padding = load i33, ptr %alloc_padding_vec, align 8 => poison
; CHECK-NEXT: %load_vec_non_zero_padding = load <3 x i11>, ptr %alloc_padding_vec, align 8 => { poison, poison, poison }
; CHECK-NEXT: %alloc_struct_padding = alloca { i8, i32 }, align 8 => ptr 0x88 [alloc_struct_padding]
; CHECK-NEXT: store { i8, i32 } zeroinitializer, ptr %alloc_struct_padding, align 4
; CHECK-NEXT: %load_struct_noundef = load { i8, i32 }, ptr %alloc_struct_padding, align 4, !noundef !0 => { i8 0, i32 0 }
; CHECK-NEXT: %alloc_ptr = alloca ptr, align 8 => ptr 0x90 [alloc_ptr]
; CHECK-NEXT: store ptr %alloc_ptr, ptr %alloc_ptr, align 8
; CHECK-NEXT: %ptr_with_provenance = load ptr, ptr %alloc_ptr, align 8 => ptr 0x90 [alloc_ptr]
; CHECK-NEXT: %addr_bits = load i8, ptr %alloc_ptr, align 1 => i8 -112
; CHECK-NEXT: store i8 %addr_bits, ptr %alloc_ptr, align 1
; CHECK-NEXT: %ptr_without_provenance = load ptr, ptr %alloc_ptr, align 8 => ptr 0x90 [nullary]
; CHECK-NEXT: ret void
; CHECK-NEXT: Exiting function: main