89 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_test_checks.py2; RUN: opt -mtriple=amdgcn-amd-amdhsa -mcpu=gfx900 < %s -passes=loop-vectorize,dce,instcombine -S | FileCheck -check-prefix=GFX9 %s3; RUN: opt -mtriple=amdgcn-amd-amdhsa -mcpu=fiji < %s -passes=loop-vectorize,dce,instcombine -S | FileCheck -check-prefix=VI %s4; RUN: opt -mtriple=amdgcn-amd-amdhsa -mcpu=hawaii < %s -passes=loop-vectorize,dce,instcombine -S | FileCheck -check-prefix=CI %s5 6define half @vectorize_v2f16_loop(ptr addrspace(1) noalias %s) {7; GFX9-LABEL: @vectorize_v2f16_loop(8; GFX9-NEXT: entry:9; GFX9-NEXT: br label [[VECTOR_PH:%.*]]10; GFX9: vector.ph:11; GFX9-NEXT: br label [[VECTOR_BODY:%.*]]12; GFX9: vector.body:13; GFX9-NEXT: [[INDEX:%.*]] = phi i64 [ 0, [[VECTOR_PH]] ], [ [[INDEX_NEXT:%.*]], [[VECTOR_BODY]] ]14; GFX9-NEXT: [[VEC_PHI:%.*]] = phi <2 x half> [ zeroinitializer, [[VECTOR_PH]] ], [ [[TMP2:%.*]], [[VECTOR_BODY]] ]15; GFX9-NEXT: [[VEC_PHI1:%.*]] = phi <2 x half> [ zeroinitializer, [[VECTOR_PH]] ], [ [[TMP3:%.*]], [[VECTOR_BODY]] ]16; GFX9-NEXT: [[TMP0:%.*]] = getelementptr inbounds half, ptr addrspace(1) [[S:%.*]], i64 [[INDEX]]17; GFX9-NEXT: [[TMP1:%.*]] = getelementptr inbounds nuw i8, ptr addrspace(1) [[TMP0]], i64 418; GFX9-NEXT: [[WIDE_LOAD:%.*]] = load <2 x half>, ptr addrspace(1) [[TMP0]], align 219; GFX9-NEXT: [[WIDE_LOAD2:%.*]] = load <2 x half>, ptr addrspace(1) [[TMP1]], align 220; GFX9-NEXT: [[TMP2]] = fadd fast <2 x half> [[VEC_PHI]], [[WIDE_LOAD]]21; GFX9-NEXT: [[TMP3]] = fadd fast <2 x half> [[VEC_PHI1]], [[WIDE_LOAD2]]22; GFX9-NEXT: [[INDEX_NEXT]] = add nuw i64 [[INDEX]], 423; GFX9-NEXT: [[TMP4:%.*]] = icmp eq i64 [[INDEX_NEXT]], 25624; GFX9-NEXT: br i1 [[TMP4]], label [[MIDDLE_BLOCK:%.*]], label [[VECTOR_BODY]], !llvm.loop [[LOOP0:![0-9]+]]25; GFX9: middle.block:26; GFX9-NEXT: br label [[FOR_BODY:%.*]]27; GFX9: for.end:28; GFX9-NEXT: [[BIN_RDX:%.*]] = fadd fast <2 x half> [[TMP3]], [[TMP2]]29; GFX9-NEXT: [[ADD_LCSSA:%.*]] = call fast half @llvm.vector.reduce.fadd.v2f16(half 0xH0000, <2 x half> [[BIN_RDX]])30; GFX9-NEXT: ret half [[ADD_LCSSA]]31;32; VI-LABEL: @vectorize_v2f16_loop(33; VI-NEXT: entry:34; VI-NEXT: br label [[VECTOR_PH:%.*]]35; VI: vector.ph:36; VI-NEXT: br label [[VECTOR_BODY:%.*]]37; VI: vector.body:38; VI-NEXT: [[INDEX:%.*]] = phi i64 [ 0, [[VECTOR_PH]] ], [ [[INDEX_NEXT:%.*]], [[VECTOR_BODY]] ]39; VI-NEXT: [[VEC_PHI:%.*]] = phi <2 x half> [ zeroinitializer, [[VECTOR_PH]] ], [ [[TMP2:%.*]], [[VECTOR_BODY]] ]40; VI-NEXT: [[VEC_PHI1:%.*]] = phi <2 x half> [ zeroinitializer, [[VECTOR_PH]] ], [ [[TMP3:%.*]], [[VECTOR_BODY]] ]41; VI-NEXT: [[TMP0:%.*]] = getelementptr inbounds half, ptr addrspace(1) [[S:%.*]], i64 [[INDEX]]42; VI-NEXT: [[TMP1:%.*]] = getelementptr inbounds nuw i8, ptr addrspace(1) [[TMP0]], i64 443; VI-NEXT: [[WIDE_LOAD:%.*]] = load <2 x half>, ptr addrspace(1) [[TMP0]], align 244; VI-NEXT: [[WIDE_LOAD2:%.*]] = load <2 x half>, ptr addrspace(1) [[TMP1]], align 245; VI-NEXT: [[TMP2]] = fadd fast <2 x half> [[VEC_PHI]], [[WIDE_LOAD]]46; VI-NEXT: [[TMP3]] = fadd fast <2 x half> [[VEC_PHI1]], [[WIDE_LOAD2]]47; VI-NEXT: [[INDEX_NEXT]] = add nuw i64 [[INDEX]], 448; VI-NEXT: [[TMP4:%.*]] = icmp eq i64 [[INDEX_NEXT]], 25649; VI-NEXT: br i1 [[TMP4]], label [[MIDDLE_BLOCK:%.*]], label [[VECTOR_BODY]], !llvm.loop [[LOOP0:![0-9]+]]50; VI: middle.block:51; VI-NEXT: br label [[FOR_BODY:%.*]]52; VI: for.end:53; VI-NEXT: [[BIN_RDX:%.*]] = fadd fast <2 x half> [[TMP3]], [[TMP2]]54; VI-NEXT: [[ADD_LCSSA:%.*]] = call fast half @llvm.vector.reduce.fadd.v2f16(half 0xH0000, <2 x half> [[BIN_RDX]])55; VI-NEXT: ret half [[ADD_LCSSA]]56;57; CI-LABEL: @vectorize_v2f16_loop(58; CI-NEXT: entry:59; CI-NEXT: br label [[FOR_BODY:%.*]]60; CI: for.body:61; CI-NEXT: [[INDVARS_IV:%.*]] = phi i64 [ 0, [[ENTRY:%.*]] ], [ [[INDVARS_IV_NEXT:%.*]], [[FOR_BODY]] ]62; CI-NEXT: [[Q_04:%.*]] = phi half [ 0xH0000, [[ENTRY]] ], [ [[ADD:%.*]], [[FOR_BODY]] ]63; CI-NEXT: [[ARRAYIDX:%.*]] = getelementptr inbounds nuw half, ptr addrspace(1) [[S:%.*]], i64 [[INDVARS_IV]]64; CI-NEXT: [[TMP0:%.*]] = load half, ptr addrspace(1) [[ARRAYIDX]], align 265; CI-NEXT: [[ADD]] = fadd fast half [[Q_04]], [[TMP0]]66; CI-NEXT: [[INDVARS_IV_NEXT]] = add nuw nsw i64 [[INDVARS_IV]], 167; CI-NEXT: [[EXITCOND:%.*]] = icmp eq i64 [[INDVARS_IV_NEXT]], 25668; CI-NEXT: br i1 [[EXITCOND]], label [[FOR_END:%.*]], label [[FOR_BODY]]69; CI: for.end:70; CI-NEXT: ret half [[ADD]]71;72entry:73 br label %for.body74 75for.body:76 %indvars.iv = phi i64 [ 0, %entry ], [ %indvars.iv.next, %for.body ]77 %q.04 = phi half [ 0.0, %entry ], [ %add, %for.body ]78 %arrayidx = getelementptr inbounds half, ptr addrspace(1) %s, i64 %indvars.iv79 %0 = load half, ptr addrspace(1) %arrayidx, align 280 %add = fadd fast half %q.04, %081 %indvars.iv.next = add nuw nsw i64 %indvars.iv, 182 %exitcond = icmp eq i64 %indvars.iv.next, 25683 br i1 %exitcond, label %for.end, label %for.body84 85for.end:86 %add.lcssa = phi half [ %add, %for.body ]87 ret half %add.lcssa88}89