[llvm] a743033 - [SandboxVec][LoadStoreVec][NFC] Precommit tests (#194962)

via llvm-commits llvm-commits at lists.llvm.org
Thu Apr 30 16:09:25 PDT 2026


Author: vporpo
Date: 2026-04-30T16:09:21-07:00
New Revision: a743033bd1e4ed777035fabe2dd0a3b4d18f25d4

URL: https://github.com/llvm/llvm-project/commit/a743033bd1e4ed777035fabe2dd0a3b4d18f25d4
DIFF: https://github.com/llvm/llvm-project/commit/a743033bd1e4ed777035fabe2dd0a3b4d18f25d4.diff

LOG: [SandboxVec][LoadStoreVec][NFC] Precommit tests (#194962)

These tests are for a follow-up LoadStoreVec patch.

Added: 
    llvm/test/Transforms/SandboxVectorizer/load_store_vec_mixed_types.ll

Modified: 
    

Removed: 
    


################################################################################
diff  --git a/llvm/test/Transforms/SandboxVectorizer/load_store_vec_mixed_types.ll b/llvm/test/Transforms/SandboxVectorizer/load_store_vec_mixed_types.ll
new file mode 100644
index 0000000000000..34ab54c6f1233
--- /dev/null
+++ b/llvm/test/Transforms/SandboxVectorizer/load_store_vec_mixed_types.ll
@@ -0,0 +1,414 @@
+; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --version 6
+; RUN: opt -passes=sandbox-vectorizer -sbvec-passes="seed-collection(enable-
diff -types)<load-store-vec>" -sbvec-vec-reg-bits=1024 %s -S | FileCheck %s
+
+; Check that we vectorize mixed ints and floats.
+define void @mixed_int_float(ptr %ptr0) {
+; CHECK-LABEL: define void @mixed_int_float(
+; CHECK-SAME: ptr [[PTR0:%.*]]) {
+; CHECK-NEXT:    [[PTR1:%.*]] = getelementptr inbounds i8, ptr [[PTR0]], i64 4
+; CHECK-NEXT:    [[LD0:%.*]] = load i32, ptr [[PTR0]], align 4
+; CHECK-NEXT:    [[LD1:%.*]] = load float, ptr [[PTR1]], align 4
+; CHECK-NEXT:    store i32 [[LD0]], ptr [[PTR0]], align 4, !sandboxvec [[META0:![0-9]+]]
+; CHECK-NEXT:    store float [[LD1]], ptr [[PTR1]], align 4, !sandboxvec [[META0]]
+; CHECK-NEXT:    ret void
+;
+  %ptr1 = getelementptr inbounds i8, ptr %ptr0, i64 4
+
+  %ld0 = load i32, ptr %ptr0
+  %ld1 = load float, ptr %ptr1
+
+  store i32 %ld0, ptr %ptr0
+  store float %ld1, ptr %ptr1
+  ret void
+}
+
+; Check that we vectorize mixed ints and vector of floats.
+define void @mixed_int_vector_float(ptr %ptr) {
+; CHECK-LABEL: define void @mixed_int_vector_float(
+; CHECK-SAME: ptr [[PTR:%.*]]) {
+; CHECK-NEXT:    [[PTR_4:%.*]] = getelementptr inbounds i8, ptr [[PTR]], i64 4
+; CHECK-NEXT:    [[LD_0_3:%.*]] = load i32, ptr [[PTR]], align 4
+; CHECK-NEXT:    [[LD_4_LOAD:%.*]] = load <2 x half>, ptr [[PTR_4]], align 4
+; CHECK-NEXT:    store i32 [[LD_0_3]], ptr [[PTR]], align 4, !sandboxvec [[META1:![0-9]+]]
+; CHECK-NEXT:    store <2 x half> [[LD_4_LOAD]], ptr [[PTR_4]], align 4, !sandboxvec [[META1]]
+; CHECK-NEXT:    ret void
+;
+  %ptr_4 = getelementptr inbounds i8, ptr %ptr, i64 4
+
+  %ld_0_3 = load i32, ptr %ptr
+  %ld_4_7 = load <2 x half>, ptr %ptr_4
+
+  store i32 %ld_0_3, ptr %ptr
+  store <2 x half> %ld_4_7, ptr %ptr_4
+  ret void
+}
+
+; Check that we vectorize mixed ints and and pointers.
+define void @mixed_int_pointer(ptr %ptr) {
+; CHECK-LABEL: define void @mixed_int_pointer(
+; CHECK-SAME: ptr [[PTR:%.*]]) {
+; CHECK-NEXT:    [[VECIINITL:%.*]] = load <2 x i64>, ptr [[PTR]], align 1, !sandboxvec [[META2:![0-9]+]]
+; CHECK-NEXT:    store <2 x i64> [[VECIINITL]], ptr [[PTR]], align 1, !sandboxvec [[META2]]
+; CHECK-NEXT:    ret void
+;
+  %ptr_8 = getelementptr inbounds i8, ptr %ptr, i64 8
+
+  %ld_0_7 = load i64, ptr %ptr
+  %ld_8_15 = load ptr, ptr %ptr_8
+
+  store i64 %ld_0_7, ptr %ptr
+  store ptr %ld_8_15, ptr %ptr_8
+  ret void
+}
+
+; Check that we vectorize mixed doubles and pointers.
+define void @mixed_dboule_pointer(ptr %ptr) {
+; CHECK-LABEL: define void @mixed_dboule_pointer(
+; CHECK-SAME: ptr [[PTR:%.*]]) {
+; CHECK-NEXT:    [[PTR_8:%.*]] = getelementptr inbounds i8, ptr [[PTR]], i64 8
+; CHECK-NEXT:    [[LD_0_7:%.*]] = load double, ptr [[PTR]], align 8
+; CHECK-NEXT:    [[LD_8_15:%.*]] = load ptr, ptr [[PTR_8]], align 8
+; CHECK-NEXT:    store double [[LD_0_7]], ptr [[PTR]], align 8, !sandboxvec [[META3:![0-9]+]]
+; CHECK-NEXT:    store ptr [[LD_8_15]], ptr [[PTR_8]], align 8, !sandboxvec [[META3]]
+; CHECK-NEXT:    ret void
+;
+  %ptr_8 = getelementptr inbounds i8, ptr %ptr, i64 8
+
+  %ld_0_7 = load double, ptr %ptr
+  %ld_8_15 = load ptr, ptr %ptr_8
+
+  store double %ld_0_7, ptr %ptr
+  store ptr %ld_8_15, ptr %ptr_8
+  ret void
+}
+
+; ===----------------------------------------------------------------------=== ;
+; ===                           External Users                             === ;
+; ===----------------------------------------------------------------------=== ;
+
+define i32 @mixed_int_float_with_external_user_i32(ptr %ptr0) {
+; CHECK-LABEL: define i32 @mixed_int_float_with_external_user_i32(
+; CHECK-SAME: ptr [[PTR0:%.*]]) {
+; CHECK-NEXT:    [[PTR1:%.*]] = getelementptr inbounds i8, ptr [[PTR0]], i64 4
+; CHECK-NEXT:    [[LD0:%.*]] = load i32, ptr [[PTR0]], align 4
+; CHECK-NEXT:    [[LD1:%.*]] = load float, ptr [[PTR1]], align 4
+; CHECK-NEXT:    store i32 [[LD0]], ptr [[PTR0]], align 4, !sandboxvec [[META4:![0-9]+]]
+; CHECK-NEXT:    store float [[LD1]], ptr [[PTR1]], align 4, !sandboxvec [[META4]]
+; CHECK-NEXT:    ret i32 [[LD0]]
+;
+  %ptr1 = getelementptr inbounds i8, ptr %ptr0, i64 4
+
+  %ld0 = load i32, ptr %ptr0
+  %ld1 = load float, ptr %ptr1
+
+  store i32 %ld0, ptr %ptr0
+  store float %ld1, ptr %ptr1
+  ret i32 %ld0
+}
+
+define float @mixed_int_float_with_external_user_float(ptr %ptr0) {
+; CHECK-LABEL: define float @mixed_int_float_with_external_user_float(
+; CHECK-SAME: ptr [[PTR0:%.*]]) {
+; CHECK-NEXT:    [[PTR1:%.*]] = getelementptr inbounds i8, ptr [[PTR0]], i64 4
+; CHECK-NEXT:    [[LD0:%.*]] = load i32, ptr [[PTR0]], align 4
+; CHECK-NEXT:    [[LD1:%.*]] = load float, ptr [[PTR1]], align 4
+; CHECK-NEXT:    store i32 [[LD0]], ptr [[PTR0]], align 4, !sandboxvec [[META5:![0-9]+]]
+; CHECK-NEXT:    store float [[LD1]], ptr [[PTR1]], align 4, !sandboxvec [[META5]]
+; CHECK-NEXT:    ret float [[LD1]]
+;
+  %ptr1 = getelementptr inbounds i8, ptr %ptr0, i64 4
+
+  %ld0 = load i32, ptr %ptr0
+  %ld1 = load float, ptr %ptr1
+
+  store i32 %ld0, ptr %ptr0
+  store float %ld1, ptr %ptr1
+  ret float %ld1
+}
+
+define i32 @mixed_int_float_with_two_external_users(ptr %ptr0, ptr %ptrExt) {
+; CHECK-LABEL: define i32 @mixed_int_float_with_two_external_users(
+; CHECK-SAME: ptr [[PTR0:%.*]], ptr [[PTREXT:%.*]]) {
+; CHECK-NEXT:    [[PTR1:%.*]] = getelementptr inbounds i8, ptr [[PTR0]], i64 4
+; CHECK-NEXT:    [[LD0:%.*]] = load i32, ptr [[PTR0]], align 4
+; CHECK-NEXT:    [[LD1:%.*]] = load float, ptr [[PTR1]], align 4
+; CHECK-NEXT:    store i32 [[LD0]], ptr [[PTR0]], align 4, !sandboxvec [[META6:![0-9]+]]
+; CHECK-NEXT:    store float [[LD1]], ptr [[PTR1]], align 4, !sandboxvec [[META6]]
+; CHECK-NEXT:    store float [[LD1]], ptr [[PTREXT]], align 4
+; CHECK-NEXT:    ret i32 [[LD0]]
+;
+  %ptr1 = getelementptr inbounds i8, ptr %ptr0, i64 4
+
+  %ld0 = load i32, ptr %ptr0
+  %ld1 = load float, ptr %ptr1
+
+  store i32 %ld0, ptr %ptr0
+  store float %ld1, ptr %ptr1
+
+  store float %ld1, ptr %ptrExt  ; External user 2
+  ret i32 %ld0                   ; External user 1
+}
+
+define i32 @mixed_int_vector_float_with_external_user_ptr(ptr %ptr) {
+; CHECK-LABEL: define i32 @mixed_int_vector_float_with_external_user_ptr(
+; CHECK-SAME: ptr [[PTR:%.*]]) {
+; CHECK-NEXT:    [[PTR_4:%.*]] = getelementptr inbounds i8, ptr [[PTR]], i64 4
+; CHECK-NEXT:    [[LD_0_3:%.*]] = load i32, ptr [[PTR]], align 4
+; CHECK-NEXT:    [[LD_4_7:%.*]] = load <2 x half>, ptr [[PTR_4]], align 4
+; CHECK-NEXT:    store i32 [[LD_0_3]], ptr [[PTR]], align 4, !sandboxvec [[META7:![0-9]+]]
+; CHECK-NEXT:    store <2 x half> [[LD_4_7]], ptr [[PTR_4]], align 4, !sandboxvec [[META7]]
+; CHECK-NEXT:    ret i32 [[LD_0_3]]
+;
+  %ptr_4 = getelementptr inbounds i8, ptr %ptr, i64 4
+
+  %ld_0_3 = load i32, ptr %ptr
+  %ld_4_7 = load <2 x half>, ptr %ptr_4
+
+  store i32 %ld_0_3, ptr %ptr
+  store <2 x half> %ld_4_7, ptr %ptr_4
+  ret i32 %ld_0_3
+}
+
+define <2 x half> @mixed_int_vector_float_with_external_user_vec(ptr %ptr) {
+; CHECK-LABEL: define <2 x half> @mixed_int_vector_float_with_external_user_vec(
+; CHECK-SAME: ptr [[PTR:%.*]]) {
+; CHECK-NEXT:    [[PTR_4:%.*]] = getelementptr inbounds i8, ptr [[PTR]], i64 4
+; CHECK-NEXT:    [[LD_0_3:%.*]] = load i32, ptr [[PTR]], align 4
+; CHECK-NEXT:    [[LD_4_7:%.*]] = load <2 x half>, ptr [[PTR_4]], align 4
+; CHECK-NEXT:    store i32 [[LD_0_3]], ptr [[PTR]], align 4, !sandboxvec [[META8:![0-9]+]]
+; CHECK-NEXT:    store <2 x half> [[LD_4_7]], ptr [[PTR_4]], align 4, !sandboxvec [[META8]]
+; CHECK-NEXT:    ret <2 x half> [[LD_4_7]]
+;
+  %ptr_4 = getelementptr inbounds i8, ptr %ptr, i64 4
+
+  %ld_0_3 = load i32, ptr %ptr
+  %ld_4_7 = load <2 x half>, ptr %ptr_4
+
+  store i32 %ld_0_3, ptr %ptr
+  store <2 x half> %ld_4_7, ptr %ptr_4
+  ret <2 x half> %ld_4_7
+}
+
+define i32 @mixed_int_vector_float_with_two_external_users(ptr %ptr, ptr %ptrExt) {
+; CHECK-LABEL: define i32 @mixed_int_vector_float_with_two_external_users(
+; CHECK-SAME: ptr [[PTR:%.*]], ptr [[PTREXT:%.*]]) {
+; CHECK-NEXT:    [[PTR_4:%.*]] = getelementptr inbounds i8, ptr [[PTR]], i64 4
+; CHECK-NEXT:    [[LD_0_3:%.*]] = load i32, ptr [[PTR]], align 4
+; CHECK-NEXT:    [[LD_4_7:%.*]] = load <2 x half>, ptr [[PTR_4]], align 4
+; CHECK-NEXT:    store i32 [[LD_0_3]], ptr [[PTR]], align 4, !sandboxvec [[META9:![0-9]+]]
+; CHECK-NEXT:    store <2 x half> [[LD_4_7]], ptr [[PTR_4]], align 4, !sandboxvec [[META9]]
+; CHECK-NEXT:    store <2 x half> [[LD_4_7]], ptr [[PTREXT]], align 4
+; CHECK-NEXT:    ret i32 [[LD_0_3]]
+;
+  %ptr_4 = getelementptr inbounds i8, ptr %ptr, i64 4
+
+  %ld_0_3 = load i32, ptr %ptr
+  %ld_4_7 = load <2 x half>, ptr %ptr_4
+
+  store i32 %ld_0_3, ptr %ptr
+  store <2 x half> %ld_4_7, ptr %ptr_4
+
+  store <2 x half> %ld_4_7, ptr %ptrExt ; External user 2
+  ret i32 %ld_0_3                       ; External user 1
+}
+
+define i64 @mixed_int_pointer_with_external_user_int(ptr %ptr) {
+; CHECK-LABEL: define i64 @mixed_int_pointer_with_external_user_int(
+; CHECK-SAME: ptr [[PTR:%.*]]) {
+; CHECK-NEXT:    [[PTR_8:%.*]] = getelementptr inbounds i8, ptr [[PTR]], i64 8
+; CHECK-NEXT:    [[LD_0_7:%.*]] = load i64, ptr [[PTR]], align 4
+; CHECK-NEXT:    [[LD_8_15:%.*]] = load ptr, ptr [[PTR_8]], align 8
+; CHECK-NEXT:    store i64 [[LD_0_7]], ptr [[PTR]], align 4, !sandboxvec [[META10:![0-9]+]]
+; CHECK-NEXT:    store ptr [[LD_8_15]], ptr [[PTR_8]], align 8, !sandboxvec [[META10]]
+; CHECK-NEXT:    ret i64 [[LD_0_7]]
+;
+  %ptr_8 = getelementptr inbounds i8, ptr %ptr, i64 8
+
+  %ld_0_7 = load i64, ptr %ptr
+  %ld_8_15 = load ptr, ptr %ptr_8
+
+  store i64 %ld_0_7, ptr %ptr
+  store ptr %ld_8_15, ptr %ptr_8
+  ret i64 %ld_0_7
+}
+
+define ptr @mixed_int_pointer_with_external_user_ptr(ptr %ptr) {
+; CHECK-LABEL: define ptr @mixed_int_pointer_with_external_user_ptr(
+; CHECK-SAME: ptr [[PTR:%.*]]) {
+; CHECK-NEXT:    [[PTR_8:%.*]] = getelementptr inbounds i8, ptr [[PTR]], i64 8
+; CHECK-NEXT:    [[LD_0_7:%.*]] = load i64, ptr [[PTR]], align 4
+; CHECK-NEXT:    [[LD_8_15:%.*]] = load ptr, ptr [[PTR_8]], align 8
+; CHECK-NEXT:    store i64 [[LD_0_7]], ptr [[PTR]], align 4, !sandboxvec [[META11:![0-9]+]]
+; CHECK-NEXT:    store ptr [[LD_8_15]], ptr [[PTR_8]], align 8, !sandboxvec [[META11]]
+; CHECK-NEXT:    ret ptr [[LD_8_15]]
+;
+  %ptr_8 = getelementptr inbounds i8, ptr %ptr, i64 8
+
+  %ld_0_7 = load i64, ptr %ptr
+  %ld_8_15 = load ptr, ptr %ptr_8
+
+  store i64 %ld_0_7, ptr %ptr
+  store ptr %ld_8_15, ptr %ptr_8
+  ret ptr %ld_8_15
+}
+
+define ptr @mixed_int_pointer_with_two_external_users(ptr %ptr, ptr %ptrExt) {
+; CHECK-LABEL: define ptr @mixed_int_pointer_with_two_external_users(
+; CHECK-SAME: ptr [[PTR:%.*]], ptr [[PTREXT:%.*]]) {
+; CHECK-NEXT:    [[PTR_8:%.*]] = getelementptr inbounds i8, ptr [[PTR]], i64 8
+; CHECK-NEXT:    [[LD_0_7:%.*]] = load i64, ptr [[PTR]], align 4
+; CHECK-NEXT:    [[LD_8_15:%.*]] = load ptr, ptr [[PTR_8]], align 8
+; CHECK-NEXT:    store i64 [[LD_0_7]], ptr [[PTR]], align 4, !sandboxvec [[META12:![0-9]+]]
+; CHECK-NEXT:    store ptr [[LD_8_15]], ptr [[PTR_8]], align 8, !sandboxvec [[META12]]
+; CHECK-NEXT:    store i64 [[LD_0_7]], ptr [[PTREXT]], align 4
+; CHECK-NEXT:    ret ptr [[LD_8_15]]
+;
+  %ptr_8 = getelementptr inbounds i8, ptr %ptr, i64 8
+
+  %ld_0_7 = load i64, ptr %ptr
+  %ld_8_15 = load ptr, ptr %ptr_8
+
+  store i64 %ld_0_7, ptr %ptr
+  store ptr %ld_8_15, ptr %ptr_8
+
+  store i64 %ld_0_7, ptr %ptrExt  ; External user 1
+  ret ptr %ld_8_15                ; External user 2
+}
+
+define double @mixed_dboule_pointer_with_external_user_double(ptr %ptr) {
+; CHECK-LABEL: define double @mixed_dboule_pointer_with_external_user_double(
+; CHECK-SAME: ptr [[PTR:%.*]]) {
+; CHECK-NEXT:    [[PTR_8:%.*]] = getelementptr inbounds i8, ptr [[PTR]], i64 8
+; CHECK-NEXT:    [[LD_0_7:%.*]] = load double, ptr [[PTR]], align 8
+; CHECK-NEXT:    [[LD_8_15:%.*]] = load ptr, ptr [[PTR_8]], align 8
+; CHECK-NEXT:    store double [[LD_0_7]], ptr [[PTR]], align 8, !sandboxvec [[META13:![0-9]+]]
+; CHECK-NEXT:    store ptr [[LD_8_15]], ptr [[PTR_8]], align 8, !sandboxvec [[META13]]
+; CHECK-NEXT:    ret double [[LD_0_7]]
+;
+  %ptr_8 = getelementptr inbounds i8, ptr %ptr, i64 8
+
+  %ld_0_7 = load double, ptr %ptr
+  %ld_8_15 = load ptr, ptr %ptr_8
+
+  store double %ld_0_7, ptr %ptr
+  store ptr %ld_8_15, ptr %ptr_8
+  ret double %ld_0_7
+}
+
+define ptr @mixed_dboule_pointer_with_external_user_ptr(ptr %ptr) {
+; CHECK-LABEL: define ptr @mixed_dboule_pointer_with_external_user_ptr(
+; CHECK-SAME: ptr [[PTR:%.*]]) {
+; CHECK-NEXT:    [[PTR_8:%.*]] = getelementptr inbounds i8, ptr [[PTR]], i64 8
+; CHECK-NEXT:    [[LD_0_7:%.*]] = load double, ptr [[PTR]], align 8
+; CHECK-NEXT:    [[LD_8_15:%.*]] = load ptr, ptr [[PTR_8]], align 8
+; CHECK-NEXT:    store double [[LD_0_7]], ptr [[PTR]], align 8, !sandboxvec [[META14:![0-9]+]]
+; CHECK-NEXT:    store ptr [[LD_8_15]], ptr [[PTR_8]], align 8, !sandboxvec [[META14]]
+; CHECK-NEXT:    ret ptr [[LD_8_15]]
+;
+  %ptr_8 = getelementptr inbounds i8, ptr %ptr, i64 8
+
+  %ld_0_7 = load double, ptr %ptr
+  %ld_8_15 = load ptr, ptr %ptr_8
+
+  store double %ld_0_7, ptr %ptr
+  store ptr %ld_8_15, ptr %ptr_8
+  ret ptr %ld_8_15
+}
+
+define double @mixed_dboule_pointer_with_two_external_users(ptr %ptr, ptr %ptrExt) {
+; CHECK-LABEL: define double @mixed_dboule_pointer_with_two_external_users(
+; CHECK-SAME: ptr [[PTR:%.*]], ptr [[PTREXT:%.*]]) {
+; CHECK-NEXT:    [[PTR_8:%.*]] = getelementptr inbounds i8, ptr [[PTR]], i64 8
+; CHECK-NEXT:    [[LD_0_7:%.*]] = load double, ptr [[PTR]], align 8
+; CHECK-NEXT:    [[LD_8_15:%.*]] = load ptr, ptr [[PTR_8]], align 8
+; CHECK-NEXT:    store double [[LD_0_7]], ptr [[PTR]], align 8, !sandboxvec [[META15:![0-9]+]]
+; CHECK-NEXT:    store ptr [[LD_8_15]], ptr [[PTR_8]], align 8, !sandboxvec [[META15]]
+; CHECK-NEXT:    store ptr [[LD_8_15]], ptr [[PTREXT]], align 8
+; CHECK-NEXT:    ret double [[LD_0_7]]
+;
+  %ptr_8 = getelementptr inbounds i8, ptr %ptr, i64 8
+
+  %ld_0_7 = load double, ptr %ptr
+  %ld_8_15 = load ptr, ptr %ptr_8
+
+  store double %ld_0_7, ptr %ptr
+  store ptr %ld_8_15, ptr %ptr_8
+
+  store ptr %ld_8_15, ptr %ptrExt ; External user 1
+  ret double %ld_0_7              ; External user 2
+}
+
+define double @mixed_dboule_pointer_with_two_external_users_reverse(ptr %ptr, ptr %ptrExt) {
+; CHECK-LABEL: define double @mixed_dboule_pointer_with_two_external_users_reverse(
+; CHECK-SAME: ptr [[PTR:%.*]], ptr [[PTREXT:%.*]]) {
+; CHECK-NEXT:    [[PTR_8:%.*]] = getelementptr inbounds i8, ptr [[PTR]], i64 8
+; CHECK-NEXT:    [[LD_0_7:%.*]] = load double, ptr [[PTR]], align 8
+; CHECK-NEXT:    [[LD_8_15:%.*]] = load ptr, ptr [[PTR_8]], align 8
+; CHECK-NEXT:    store double [[LD_0_7]], ptr [[PTR]], align 8, !sandboxvec [[META16:![0-9]+]]
+; CHECK-NEXT:    store ptr [[LD_8_15]], ptr [[PTR_8]], align 8, !sandboxvec [[META16]]
+; CHECK-NEXT:    store ptr [[LD_8_15]], ptr [[PTREXT]], align 8
+; CHECK-NEXT:    ret double [[LD_0_7]]
+;
+  %ptr_8 = getelementptr inbounds i8, ptr %ptr, i64 8
+
+  %ld_0_7 = load double, ptr %ptr
+  %ld_8_15 = load ptr, ptr %ptr_8
+
+  store double %ld_0_7, ptr %ptr
+  store ptr %ld_8_15, ptr %ptr_8
+
+  store ptr %ld_8_15, ptr %ptrExt  ; External user 2
+  ret double %ld_0_7               ; External user 1
+}
+
+define void @mixed_dboule_pointer_with_four_external_users(ptr %ptr, ptr %ptrExt1, ptr %ptrExt2, ptr %ptrExt3, ptr %ptrExt4) {
+; CHECK-LABEL: define void @mixed_dboule_pointer_with_four_external_users(
+; CHECK-SAME: ptr [[PTR:%.*]], ptr [[PTREXT1:%.*]], ptr [[PTREXT2:%.*]], ptr [[PTREXT3:%.*]], ptr [[PTREXT4:%.*]]) {
+; CHECK-NEXT:    [[PTR_8:%.*]] = getelementptr inbounds i8, ptr [[PTR]], i64 8
+; CHECK-NEXT:    [[LD_0_7:%.*]] = load double, ptr [[PTR]], align 8
+; CHECK-NEXT:    [[LD_8_15:%.*]] = load ptr, ptr [[PTR_8]], align 8
+; CHECK-NEXT:    store double [[LD_0_7]], ptr [[PTR]], align 8, !sandboxvec [[META17:![0-9]+]]
+; CHECK-NEXT:    store ptr [[LD_8_15]], ptr [[PTR_8]], align 8, !sandboxvec [[META17]]
+; CHECK-NEXT:    store double [[LD_0_7]], ptr [[PTREXT1]], align 8
+; CHECK-NEXT:    store ptr [[LD_8_15]], ptr [[PTREXT2]], align 8
+; CHECK-NEXT:    store double [[LD_0_7]], ptr [[PTREXT3]], align 8
+; CHECK-NEXT:    store ptr [[LD_8_15]], ptr [[PTREXT4]], align 8
+; CHECK-NEXT:    ret void
+;
+  %ptr_8 = getelementptr inbounds i8, ptr %ptr, i64 8
+
+  %ld_0_7 = load double, ptr %ptr
+  %ld_8_15 = load ptr, ptr %ptr_8
+
+  store double %ld_0_7, ptr %ptr
+  store ptr %ld_8_15, ptr %ptr_8
+
+  store double %ld_0_7, ptr %ptrExt1  ; External user 1
+  store ptr %ld_8_15, ptr %ptrExt2    ; External user 2
+
+  store double %ld_0_7, ptr %ptrExt3  ; External user 3
+  store ptr %ld_8_15, ptr %ptrExt4    ; External user 4
+
+  ret void
+}
+
+;.
+; CHECK: [[META0]] = distinct !{!"sandboxregion"}
+; CHECK: [[META1]] = distinct !{!"sandboxregion"}
+; CHECK: [[META2]] = distinct !{!"sandboxregion"}
+; CHECK: [[META3]] = distinct !{!"sandboxregion"}
+; CHECK: [[META4]] = distinct !{!"sandboxregion"}
+; CHECK: [[META5]] = distinct !{!"sandboxregion"}
+; CHECK: [[META6]] = distinct !{!"sandboxregion"}
+; CHECK: [[META7]] = distinct !{!"sandboxregion"}
+; CHECK: [[META8]] = distinct !{!"sandboxregion"}
+; CHECK: [[META9]] = distinct !{!"sandboxregion"}
+; CHECK: [[META10]] = distinct !{!"sandboxregion"}
+; CHECK: [[META11]] = distinct !{!"sandboxregion"}
+; CHECK: [[META12]] = distinct !{!"sandboxregion"}
+; CHECK: [[META13]] = distinct !{!"sandboxregion"}
+; CHECK: [[META14]] = distinct !{!"sandboxregion"}
+; CHECK: [[META15]] = distinct !{!"sandboxregion"}
+; CHECK: [[META16]] = distinct !{!"sandboxregion"}
+; CHECK: [[META17]] = distinct !{!"sandboxregion"}
+;.


        


More information about the llvm-commits mailing list