; NOTE: Assertions have been autogenerated by utils/update_test_checks.py ; RUN: opt < %s -passes='sroa' -S | FileCheck %s --check-prefixes=CHECK,CHECK-PRESERVE-CFG ; RUN: opt < %s -passes='sroa' -S | FileCheck %s --check-prefixes=CHECK,CHECK-MODIFY-CFG %struct.Value = type { %union.anon } %union.anon = type { <32 x i8> } @A = dso_local global i64 0, align 8 ; Make sure that sroa does not crash when dealing with an invalid vector ; element type. define void @foo() { ; CHECK-LABEL: @foo( ; CHECK-NEXT: entry: ; CHECK-NEXT: [[REF_TMP_I:%.*]] = alloca [[STRUCT_VALUE:%.*]], align 32 ; CHECK-NEXT: call void @value_create(ptr sret([[STRUCT_VALUE]]) align 32 [[REF_TMP_I]]) ; CHECK-NEXT: [[CALL_I:%.*]] = call align 32 ptr @value_set_type(ptr align 32 [[REF_TMP_I]]) ; CHECK-NEXT: [[TMP0:%.*]] = load <32 x i8>, ptr [[CALL_I]], align 32 ; CHECK-NEXT: [[REF_TMP_SROA_0_0_VEC_EXTRACT:%.*]] = shufflevector <32 x i8> [[TMP0]], <32 x i8> poison, <8 x i32> ; CHECK-NEXT: [[TMP1:%.*]] = bitcast <8 x i8> [[REF_TMP_SROA_0_0_VEC_EXTRACT]] to x86_mmx ; CHECK-NEXT: [[TMP2:%.*]] = call x86_mmx @llvm.x86.sse.pshuf.w(x86_mmx [[TMP1]], i8 0) ; CHECK-NEXT: store x86_mmx [[TMP2]], ptr @A, align 8 ; CHECK-NEXT: ret void ; entry: %ref.tmp.i = alloca %struct.Value, align 32 %ref.tmp = alloca %struct.Value, align 32 call void @value_create(ptr sret(%struct.Value) align 32 %ref.tmp.i) %call.i = call align 32 ptr @value_set_type(ptr align 32 %ref.tmp.i) %0 = load <32 x i8>, ptr %call.i, align 32 store <32 x i8> %0, ptr %ref.tmp, align 32 %1 = load x86_mmx, ptr %ref.tmp, align 32 %2 = call x86_mmx @llvm.x86.sse.pshuf.w(x86_mmx %1, i8 0) store x86_mmx %2, ptr @A, align 8 ret void } declare x86_mmx @llvm.x86.sse.pshuf.w(x86_mmx, i8 immarg) declare dso_local void @value_create(ptr sret(%struct.Value) align 32) declare dso_local align 32 ptr @value_set_type(ptr align 32) ;; NOTE: These prefixes are unused and the list is autogenerated. Do not add tests below this line: ; CHECK-MODIFY-CFG: {{.*}} ; CHECK-PRESERVE-CFG: {{.*}}