113 lines · plain
1; RUN: opt < %s -interleaved-access -S | FileCheck %s2; RUN: opt < %s -passes=interleaved-access -S | FileCheck %s3 4target datalayout = "e-m:e-i64:64-i128:128-n32:64-S128"5target triple = "aarch64--linux-gnu"6 7define void @extract_user_basic(ptr %ptr, i1 %c) {8; CHECK-LABEL: @extract_user_basic(9; CHECK-NEXT: entry:10; CHECK-NEXT: [[LDN:%.*]] = call { <4 x i32>, <4 x i32> } @llvm.aarch64.neon.ld2.v4i32.p0(ptr %ptr)11; CHECK-NEXT: [[TMP1:%.*]] = extractvalue { <4 x i32>, <4 x i32> } [[LDN]], 012; CHECK-NEXT: br i1 %c, label %if.then, label %if.merge13; CHECK: if.then:14; CHECK-NEXT: [[TMP2:%.*]] = extractelement <4 x i32> [[TMP1]], i64 115; CHECK-NEXT: br label %if.merge16; CHECK: if.merge:17; CHECK-NEXT: ret void18;19entry:20 %interleaved.vec = load <8 x i32>, ptr %ptr, align 821 %v0 = shufflevector <8 x i32> %interleaved.vec, <8 x i32> undef, <4 x i32> <i32 0, i32 2, i32 4, i32 6>22 br i1 %c, label %if.then, label %if.merge23 24if.then:25 %e0 = extractelement <8 x i32> %interleaved.vec, i32 226 br label %if.merge27 28if.merge:29 ret void30}31 32define void @extract_user_multi(ptr %ptr, i1 %c) {33; CHECK-LABEL: @extract_user_multi(34; CHECK-NEXT: entry:35; CHECK-NEXT: [[LDN:%.*]] = call { <4 x i32>, <4 x i32> } @llvm.aarch64.neon.ld2.v4i32.p0(ptr %ptr)36; CHECK-NEXT: [[TMP1:%.*]] = extractvalue { <4 x i32>, <4 x i32> } [[LDN]], 037; CHECK-NEXT: br i1 %c, label %if.then, label %if.merge38; CHECK: if.then:39; CHECK-NEXT: [[TMP2:%.*]] = extractelement <4 x i32> [[TMP1]], i64 040; CHECK-NEXT: br label %if.merge41; CHECK: if.merge:42; CHECK-NEXT: [[TMP3:%.*]] = extractelement <4 x i32> [[TMP1]], i64 143; CHECK-NEXT: ret void44;45entry:46 %interleaved.vec = load <8 x i32>, ptr %ptr, align 847 %v0 = shufflevector <8 x i32> %interleaved.vec, <8 x i32> undef, <4 x i32> <i32 0, i32 2, i32 4, i32 6>48 br i1 %c, label %if.then, label %if.merge49 50if.then:51 %e0 = extractelement <8 x i32> %interleaved.vec, i32 052 br label %if.merge53 54if.merge:55 %e1 = extractelement <8 x i32> %interleaved.vec, i32 256 ret void57}58 59define void @extract_user_multi_no_dom(ptr %ptr, i1 %c) {60; CHECK-LABEL: @extract_user_multi_no_dom(61; CHECK-NOT: @llvm.aarch64.neon62; CHECK: ret void63;64entry:65 %interleaved.vec = load <8 x i32>, ptr %ptr, align 866 %e0 = extractelement <8 x i32> %interleaved.vec, i32 067 br i1 %c, label %if.then, label %if.merge68 69if.then:70 %v0 = shufflevector <8 x i32> %interleaved.vec, <8 x i32> undef, <4 x i32> <i32 0, i32 2, i32 4, i32 6>71 %e1 = extractelement <8 x i32> %interleaved.vec, i32 272 br label %if.merge73 74if.merge:75 ret void76}77 78define void @extract_user_wrong_const_index(ptr %ptr) {79; CHECK-LABEL: @extract_user_wrong_const_index(80; CHECK-NOT: @llvm.aarch64.neon81; CHECK: ret void82;83entry:84 %interleaved.vec = load <8 x i32>, ptr %ptr, align 885 %v0 = shufflevector <8 x i32> %interleaved.vec, <8 x i32> undef, <4 x i32> <i32 0, i32 2, i32 4, i32 6>86 %e0 = extractelement <8 x i32> %interleaved.vec, i32 187 ret void88}89 90define void @extract_user_undef_index(ptr %ptr) {91; CHECK-LABEL: @extract_user_undef_index(92; CHECK-NOT: @llvm.aarch64.neon93; CHECK: ret void94;95entry:96 %interleaved.vec = load <8 x i32>, ptr %ptr, align 897 %v0 = shufflevector <8 x i32> %interleaved.vec, <8 x i32> undef, <4 x i32> <i32 0, i32 2, i32 4, i32 6>98 %e0 = extractelement <8 x i32> %interleaved.vec, i32 undef99 ret void100}101 102define void @extract_user_var_index(ptr %ptr, i32 %i) {103; CHECK-LABEL: @extract_user_var_index(104; CHECK-NOT: @llvm.aarch64.neon105; CHECK: ret void106;107entry:108 %interleaved.vec = load <8 x i32>, ptr %ptr, align 8109 %v0 = shufflevector <8 x i32> %interleaved.vec, <8 x i32> undef, <4 x i32> <i32 0, i32 2, i32 4, i32 6>110 %e0 = extractelement <8 x i32> %interleaved.vec, i32 %i111 ret void112}113