1; RUN: opt -mattr=+avx512f --loop-vectorize -S < %s | llc -mattr=+avx512f | FileCheck %s 2; RUN: opt -mattr=+avx512vl,+prefer-256-bit --loop-vectorize -S < %s | llc -mattr=+avx512f | FileCheck %s --check-prefix=CHECK-PREFER-AVX256 3 4target datalayout = "e-m:o-i64:64-f80:128-n8:16:32:64-S128" 5target triple = "x86_64-apple-macosx10.9.0" 6 7; Verify that we generate 512-bit wide vectors for a basic integer memset 8; loop. 9 10; CHECK-LABEL: f: 11; CHECK: vmovdqu64 %zmm{{.}}, 12; CHECK-NOT: %ymm 13; CHECK: epilog 14; CHECK: %ymm 15 16; Verify that we don't generate 512-bit wide vectors when subtarget feature says not to 17 18; CHECK-PREFER-AVX256-LABEL: f: 19; CHECK-PREFER-AVX256: vmovdqu %ymm{{.}}, 20; CHECK-PREFER-AVX256-NOT: %zmm 21 22define void @f(i32* %a, i32 %n) { 23entry: 24 %cmp4 = icmp sgt i32 %n, 0 25 br i1 %cmp4, label %for.body.preheader, label %for.end 26 27for.body.preheader: ; preds = %entry 28 br label %for.body 29 30for.body: ; preds = %for.body.preheader, %for.body 31 %indvars.iv = phi i64 [ %indvars.iv.next, %for.body ], [ 0, %for.body.preheader ] 32 %arrayidx = getelementptr inbounds i32, i32* %a, i64 %indvars.iv 33 store i32 %n, i32* %arrayidx, align 4 34 %indvars.iv.next = add nuw nsw i64 %indvars.iv, 1 35 %lftr.wideiv = trunc i64 %indvars.iv.next to i32 36 %exitcond = icmp eq i32 %lftr.wideiv, %n 37 br i1 %exitcond, label %for.end.loopexit, label %for.body 38 39for.end.loopexit: ; preds = %for.body 40 br label %for.end 41 42for.end: ; preds = %for.end.loopexit, %entry 43 ret void 44} 45 46; Verify that the "prefer-vector-width=256" attribute prevents the use of 512-bit 47; vectors 48 49; CHECK-LABEL: g: 50; CHECK: vmovdqu %ymm{{.}}, 51; CHECK-NOT: %zmm 52 53; CHECK-PREFER-AVX256-LABEL: g: 54; CHECK-PREFER-AVX256: vmovdqu %ymm{{.}}, 55; CHECK-PREFER-AVX256-NOT: %zmm 56 57define void @g(i32* %a, i32 %n) "prefer-vector-width"="256" { 58entry: 59 %cmp4 = icmp sgt i32 %n, 0 60 br i1 %cmp4, label %for.body.preheader, label %for.end 61 62for.body.preheader: ; preds = %entry 63 br label %for.body 64 65for.body: ; preds = %for.body.preheader, %for.body 66 %indvars.iv = phi i64 [ %indvars.iv.next, %for.body ], [ 0, %for.body.preheader ] 67 %arrayidx = getelementptr inbounds i32, i32* %a, i64 %indvars.iv 68 store i32 %n, i32* %arrayidx, align 4 69 %indvars.iv.next = add nuw nsw i64 %indvars.iv, 1 70 %lftr.wideiv = trunc i64 %indvars.iv.next to i32 71 %exitcond = icmp eq i32 %lftr.wideiv, %n 72 br i1 %exitcond, label %for.end.loopexit, label %for.body 73 74for.end.loopexit: ; preds = %for.body 75 br label %for.end 76 77for.end: ; preds = %for.end.loopexit, %entry 78 ret void 79} 80 81; Verify that the "prefer-vector-width=512" attribute override the subtarget 82; vectors 83 84; CHECK-LABEL: h: 85; CHECK: vmovdqu64 %zmm{{.}}, 86; CHECK-NOT: %ymm 87; CHECK: epilog 88; CHECK: %ymm 89 90; CHECK-PREFER-AVX256-LABEL: h: 91; CHECK-PREFER-AVX256: vmovdqu64 %zmm{{.}}, 92; CHECK-PREFER-AVX256-NOT: %ymm 93; CHECK-PREFER-AVX256: epilog 94; CHECK-PREFER-AVX256: %ymm 95 96define void @h(i32* %a, i32 %n) "prefer-vector-width"="512" { 97entry: 98 %cmp4 = icmp sgt i32 %n, 0 99 br i1 %cmp4, label %for.body.preheader, label %for.end 100 101for.body.preheader: ; preds = %entry 102 br label %for.body 103 104for.body: ; preds = %for.body.preheader, %for.body 105 %indvars.iv = phi i64 [ %indvars.iv.next, %for.body ], [ 0, %for.body.preheader ] 106 %arrayidx = getelementptr inbounds i32, i32* %a, i64 %indvars.iv 107 store i32 %n, i32* %arrayidx, align 4 108 %indvars.iv.next = add nuw nsw i64 %indvars.iv, 1 109 %lftr.wideiv = trunc i64 %indvars.iv.next to i32 110 %exitcond = icmp eq i32 %lftr.wideiv, %n 111 br i1 %exitcond, label %for.end.loopexit, label %for.body 112 113for.end.loopexit: ; preds = %for.body 114 br label %for.end 115 116for.end: ; preds = %for.end.loopexit, %entry 117 ret void 118} 119