; NOTE: Assertions have been autogenerated by utils/update_test_checks.py ; RUN: opt < %s -passes='sroa' -S | FileCheck %s --check-prefixes=CHECK ; RUN: opt < %s -passes='sroa' -S | FileCheck %s --check-prefixes=CHECK ; This test checks that SROA runs mem2reg on structure that contains ; homogeneous scalable vectors. %struct.test = type { , } define %struct.test @alloca( %x, %y) { ; CHECK-LABEL: @alloca( ; CHECK-NEXT: [[AGG0:%.*]] = insertvalue [[STRUCT_TEST:%.*]] undef, [[X:%.*]], 0 ; CHECK-NEXT: [[AGG1:%.*]] = insertvalue [[STRUCT_TEST]] [[AGG0]], [[Y:%.*]], 1 ; CHECK-NEXT: ret [[STRUCT_TEST]] [[AGG1]] ; %addr = alloca %struct.test, align 4 %agg0 = insertvalue %struct.test undef, %x, 0 %agg1 = insertvalue %struct.test %agg0, %y, 1 store %struct.test %agg1, ptr %addr, align 4 %val = load %struct.test, ptr %addr, align 4 ret %struct.test %val } define { , } @return_tuple( %v_tuple.coerce0, %v_tuple.coerce1) { ; CHECK-LABEL: @return_tuple( ; CHECK-NEXT: entry: ; CHECK-NEXT: [[TMP0:%.*]] = insertvalue { , } poison, [[V_TUPLE_COERCE0:%.*]], 0 ; CHECK-NEXT: [[TMP1:%.*]] = insertvalue { , } [[TMP0]], [[V_TUPLE_COERCE1:%.*]], 1 ; CHECK-NEXT: [[COERCE_EXTRACT0:%.*]] = extractvalue { , } [[TMP1]], 0 ; CHECK-NEXT: [[COERCE_EXTRACT1:%.*]] = extractvalue { , } [[TMP1]], 1 ; CHECK-NEXT: [[CALL:%.*]] = call { , } @foo( [[COERCE_EXTRACT0]], [[COERCE_EXTRACT1]]) ; CHECK-NEXT: ret { , } [[CALL]] ; entry: %v_tuple = alloca { , }, align 4 %v_tuple.addr = alloca { , }, align 4 %coerce = alloca { , }, align 4 %0 = insertvalue { , } poison, %v_tuple.coerce0, 0 %1 = insertvalue { , } %0, %v_tuple.coerce1, 1 store { , } %1, ptr %v_tuple, align 4 %v_tuple1 = load { , }, ptr %v_tuple, align 4 store { , } %v_tuple1, ptr %v_tuple.addr, align 4 %2 = load { , }, ptr %v_tuple.addr, align 4 store { , } %2, ptr %coerce, align 4 %coerce.tuple = load { , }, ptr %coerce, align 4 %coerce.extract0 = extractvalue { , } %coerce.tuple, 0 %coerce.extract1 = extractvalue { , } %coerce.tuple, 1 %call = call { , } @foo( %coerce.extract0, %coerce.extract1) ret { , } %call } declare { , } @foo(, )