113 lines · plain
1; RUN: opt -mattr=+avx512f -passes=loop-vectorize -S < %s | FileCheck %s --check-prefixes=CHECK,CHECK-NO-PREFER2; RUN: opt -mattr=+avx512vl,+prefer-256-bit -passes=loop-vectorize -S < %s | FileCheck %s --check-prefixes=CHECK,CHECK-PREFER-AVX2563 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 memset8; loop.9 10; CHECK-NO-PREFER-LABEL: @f(11; CHECK-NO-PREFER: vector.body:12; CHECK-NO-PREFER: store <16 x i32>13; CHECK-NO-PREFER: vec.epilog.vector.body:14; CHECK-NO-PREFER: store <8 x i32>15 16; Verify that we don't generate 512-bit wide vectors when subtarget feature says not to17 18; CHECK-PREFER-AVX256-LABEL: @f(19; CHECK-PREFER-AVX256: vector.body:20; CHECK-PREFER-AVX256: store <8 x i32>21; CHECK-PREFER-AVX256: vec.epilog.vector.body:22; CHECK-PREFER-AVX256: store <4 x i32>23 24define void @f(ptr %a, i32 %n) {25entry:26 %cmp4 = icmp sgt i32 %n, 027 br i1 %cmp4, label %for.body.preheader, label %for.end28 29for.body.preheader: ; preds = %entry30 br label %for.body31 32for.body: ; preds = %for.body.preheader, %for.body33 %indvars.iv = phi i64 [ %indvars.iv.next, %for.body ], [ 0, %for.body.preheader ]34 %arrayidx = getelementptr inbounds i32, ptr %a, i64 %indvars.iv35 store i32 %n, ptr %arrayidx, align 436 %indvars.iv.next = add nuw nsw i64 %indvars.iv, 137 %lftr.wideiv = trunc i64 %indvars.iv.next to i3238 %exitcond = icmp eq i32 %lftr.wideiv, %n39 br i1 %exitcond, label %for.end.loopexit, label %for.body40 41for.end.loopexit: ; preds = %for.body42 br label %for.end43 44for.end: ; preds = %for.end.loopexit, %entry45 ret void46}47 48; Verify that the "prefer-vector-width=256" attribute prevents the use of 512-bit49; vectors50 51; CHECK-LABEL: @g(52; CHECK: vector.body:53; CHECK: store <8 x i32>54; CHECK: vec.epilog.vector.body:55; CHECK: store <4 x i32>56 57define void @g(ptr %a, i32 %n) "prefer-vector-width"="256" {58entry:59 %cmp4 = icmp sgt i32 %n, 060 br i1 %cmp4, label %for.body.preheader, label %for.end61 62for.body.preheader: ; preds = %entry63 br label %for.body64 65for.body: ; preds = %for.body.preheader, %for.body66 %indvars.iv = phi i64 [ %indvars.iv.next, %for.body ], [ 0, %for.body.preheader ]67 %arrayidx = getelementptr inbounds i32, ptr %a, i64 %indvars.iv68 store i32 %n, ptr %arrayidx, align 469 %indvars.iv.next = add nuw nsw i64 %indvars.iv, 170 %lftr.wideiv = trunc i64 %indvars.iv.next to i3271 %exitcond = icmp eq i32 %lftr.wideiv, %n72 br i1 %exitcond, label %for.end.loopexit, label %for.body73 74for.end.loopexit: ; preds = %for.body75 br label %for.end76 77for.end: ; preds = %for.end.loopexit, %entry78 ret void79}80 81; Verify that the "prefer-vector-width=512" attribute override the subtarget82; vectors83 84; CHECK-LABEL: @h(85; CHECK: vector.body:86; CHECK: store <16 x i32>87; CHECK: vec.epilog.vector.body:88; CHECK: store <8 x i32>89 90define void @h(ptr %a, i32 %n) "prefer-vector-width"="512" {91entry:92 %cmp4 = icmp sgt i32 %n, 093 br i1 %cmp4, label %for.body.preheader, label %for.end94 95for.body.preheader: ; preds = %entry96 br label %for.body97 98for.body: ; preds = %for.body.preheader, %for.body99 %indvars.iv = phi i64 [ %indvars.iv.next, %for.body ], [ 0, %for.body.preheader ]100 %arrayidx = getelementptr inbounds i32, ptr %a, i64 %indvars.iv101 store i32 %n, ptr %arrayidx, align 4102 %indvars.iv.next = add nuw nsw i64 %indvars.iv, 1103 %lftr.wideiv = trunc i64 %indvars.iv.next to i32104 %exitcond = icmp eq i32 %lftr.wideiv, %n105 br i1 %exitcond, label %for.end.loopexit, label %for.body106 107for.end.loopexit: ; preds = %for.body108 br label %for.end109 110for.end: ; preds = %for.end.loopexit, %entry111 ret void112}113