1*9880d681SAndroid Build Coastguard Worker; RUN: opt < %s -mtriple=arm-eabi -mattr=+neon -interleaved-access -S | FileCheck %s 2*9880d681SAndroid Build Coastguard Worker 3*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @extract_user_basic( 4*9880d681SAndroid Build Coastguard Worker; CHECK: %vldN = call { <4 x i32>, <4 x i32> } @llvm.arm.neon.vld2.v4i32.p0i8 5*9880d681SAndroid Build Coastguard Worker; CHECK: %[[R:.+]] = extractvalue { <4 x i32>, <4 x i32> } %vldN, 0 6*9880d681SAndroid Build Coastguard Worker; CHECK: extractelement <4 x i32> %[[R]], i64 1 7*9880d681SAndroid Build Coastguard Workerdefine void @extract_user_basic(<8 x i32>* %A, i1 %C) { 8*9880d681SAndroid Build Coastguard Workerentry: 9*9880d681SAndroid Build Coastguard Worker %L = load <8 x i32>, <8 x i32>* %A, align 8 10*9880d681SAndroid Build Coastguard Worker %S = shufflevector <8 x i32> %L, <8 x i32> undef, <4 x i32> <i32 0, i32 2, i32 4, i32 6> 11*9880d681SAndroid Build Coastguard Worker br i1 %C, label %if.then, label %if.merge 12*9880d681SAndroid Build Coastguard Worker 13*9880d681SAndroid Build Coastguard Workerif.then: 14*9880d681SAndroid Build Coastguard Worker %E = extractelement <8 x i32> %L, i32 2 15*9880d681SAndroid Build Coastguard Worker br label %if.merge 16*9880d681SAndroid Build Coastguard Worker 17*9880d681SAndroid Build Coastguard Workerif.merge: 18*9880d681SAndroid Build Coastguard Worker ret void 19*9880d681SAndroid Build Coastguard Worker} 20*9880d681SAndroid Build Coastguard Worker 21*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @extract_user_multi( 22*9880d681SAndroid Build Coastguard Worker; CHECK: %vldN = call { <4 x i32>, <4 x i32> } @llvm.arm.neon.vld2.v4i32.p0i8 23*9880d681SAndroid Build Coastguard Worker; CHECK: %[[R:.+]] = extractvalue { <4 x i32>, <4 x i32> } %vldN, 0 24*9880d681SAndroid Build Coastguard Worker; CHECK: extractelement <4 x i32> %[[R]], i64 0 25*9880d681SAndroid Build Coastguard Worker; CHECK: extractelement <4 x i32> %[[R]], i64 1 26*9880d681SAndroid Build Coastguard Workerdefine void @extract_user_multi(<8 x i32>* %A, i1 %C) { 27*9880d681SAndroid Build Coastguard Workerentry: 28*9880d681SAndroid Build Coastguard Worker %L = load <8 x i32>, <8 x i32>* %A, align 8 29*9880d681SAndroid Build Coastguard Worker %S = shufflevector <8 x i32> %L, <8 x i32> undef, <4 x i32> <i32 0, i32 2, i32 4, i32 6> 30*9880d681SAndroid Build Coastguard Worker br i1 %C, label %if.then, label %if.merge 31*9880d681SAndroid Build Coastguard Worker 32*9880d681SAndroid Build Coastguard Workerif.then: 33*9880d681SAndroid Build Coastguard Worker %E1 = extractelement <8 x i32> %L, i32 0 34*9880d681SAndroid Build Coastguard Worker br label %if.merge 35*9880d681SAndroid Build Coastguard Worker 36*9880d681SAndroid Build Coastguard Workerif.merge: 37*9880d681SAndroid Build Coastguard Worker %E2 = extractelement <8 x i32> %L, i32 2 38*9880d681SAndroid Build Coastguard Worker ret void 39*9880d681SAndroid Build Coastguard Worker} 40*9880d681SAndroid Build Coastguard Worker 41*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @extract_user_multi_no_dom( 42*9880d681SAndroid Build Coastguard Worker; CHECK-NOT: %vldN = call { <4 x i32>, <4 x i32> } @llvm.arm.neon.vld2.v4i32.p0i8 43*9880d681SAndroid Build Coastguard Workerdefine void @extract_user_multi_no_dom(<8 x i32>* %A, i1 %C) { 44*9880d681SAndroid Build Coastguard Workerentry: 45*9880d681SAndroid Build Coastguard Worker %L = load <8 x i32>, <8 x i32>* %A, align 8 46*9880d681SAndroid Build Coastguard Worker %E1 = extractelement <8 x i32> %L, i32 0 47*9880d681SAndroid Build Coastguard Worker br i1 %C, label %if.then, label %if.merge 48*9880d681SAndroid Build Coastguard Worker 49*9880d681SAndroid Build Coastguard Workerif.then: 50*9880d681SAndroid Build Coastguard Worker %S = shufflevector <8 x i32> %L, <8 x i32> undef, <4 x i32> <i32 0, i32 2, i32 4, i32 6> 51*9880d681SAndroid Build Coastguard Worker %E2 = extractelement <8 x i32> %L, i32 2 52*9880d681SAndroid Build Coastguard Worker br label %if.merge 53*9880d681SAndroid Build Coastguard Worker 54*9880d681SAndroid Build Coastguard Workerif.merge: 55*9880d681SAndroid Build Coastguard Worker ret void 56*9880d681SAndroid Build Coastguard Worker} 57*9880d681SAndroid Build Coastguard Worker 58*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @extract_user_wrong_const_index( 59*9880d681SAndroid Build Coastguard Worker; CHECK-NOT: %vldN = call { <4 x i32>, <4 x i32> } @llvm.arm.neon.vld2.v4i32.p0i8 60*9880d681SAndroid Build Coastguard Workerdefine void @extract_user_wrong_const_index(<8 x i32>* %A) { 61*9880d681SAndroid Build Coastguard Workerentry: 62*9880d681SAndroid Build Coastguard Worker %L = load <8 x i32>, <8 x i32>* %A, align 8 63*9880d681SAndroid Build Coastguard Worker %S = shufflevector <8 x i32> %L, <8 x i32> undef, <4 x i32> <i32 0, i32 2, i32 4, i32 6> 64*9880d681SAndroid Build Coastguard Worker %E = extractelement <8 x i32> %L, i32 1 65*9880d681SAndroid Build Coastguard Worker ret void 66*9880d681SAndroid Build Coastguard Worker} 67*9880d681SAndroid Build Coastguard Worker 68*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @extract_user_undef_index( 69*9880d681SAndroid Build Coastguard Worker; CHECK-NOT: %vldN = call { <4 x i32>, <4 x i32> } @llvm.arm.neon.vld2.v4i32.p0i8 70*9880d681SAndroid Build Coastguard Workerdefine void @extract_user_undef_index(<8 x i32>* %A) { 71*9880d681SAndroid Build Coastguard Workerentry: 72*9880d681SAndroid Build Coastguard Worker %L = load <8 x i32>, <8 x i32>* %A, align 8 73*9880d681SAndroid Build Coastguard Worker %S = shufflevector <8 x i32> %L, <8 x i32> undef, <4 x i32> <i32 0, i32 2, i32 4, i32 6> 74*9880d681SAndroid Build Coastguard Worker %E = extractelement <8 x i32> %L, i32 undef 75*9880d681SAndroid Build Coastguard Worker ret void 76*9880d681SAndroid Build Coastguard Worker} 77*9880d681SAndroid Build Coastguard Worker 78*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @extract_user_var_index( 79*9880d681SAndroid Build Coastguard Worker; CHECK-NOT: %vldN = call { <4 x i32>, <4 x i32> } @llvm.arm.neon.vld2.v4i32.p0i8 80*9880d681SAndroid Build Coastguard Workerdefine void @extract_user_var_index(<8 x i32>* %A, i32 %I) { 81*9880d681SAndroid Build Coastguard Workerentry: 82*9880d681SAndroid Build Coastguard Worker %L = load <8 x i32>, <8 x i32>* %A, align 8 83*9880d681SAndroid Build Coastguard Worker %S = shufflevector <8 x i32> %L, <8 x i32> undef, <4 x i32> <i32 0, i32 2, i32 4, i32 6> 84*9880d681SAndroid Build Coastguard Worker %E = extractelement <8 x i32> %L, i32 %I 85*9880d681SAndroid Build Coastguard Worker ret void 86*9880d681SAndroid Build Coastguard Worker} 87