brintos

brintos / llvm-project-archived public Read only

0
0
Text · 8.7 KiB · 14a6b2f Raw
190 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --version 52; RUN: opt -codegenprepare -S < %s -mtriple=aarch64-none-linux-gnu -mattr=+sve | FileCheck %s3 4define i64 @select_or_reduce_v2i1(ptr nocapture noundef readonly %src) {5; CHECK-LABEL: define i64 @select_or_reduce_v2i1(6; CHECK-SAME: ptr noundef readonly captures(none) [[SRC:%.*]]) #[[ATTR0:[0-9]+]] {7; CHECK-NEXT:  [[ENTRY:.*]]:8; CHECK-NEXT:    br label %[[VECTOR_BODY:.*]]9; CHECK:       [[VECTOR_BODY]]:10; CHECK-NEXT:    [[INDEX:%.*]] = phi i64 [ 0, %[[ENTRY]] ], [ [[INDEX_NEXT:%.*]], %[[VECTOR_BODY]] ]11; CHECK-NEXT:    [[ARRAYIDX:%.*]] = getelementptr inbounds ptr, ptr [[SRC]], i64 [[INDEX]]12; CHECK-NEXT:    [[WIDE_LOAD:%.*]] = load <2 x ptr>, ptr [[ARRAYIDX]], align 813; CHECK-NEXT:    [[COND:%.*]] = icmp eq <2 x ptr> [[WIDE_LOAD]], zeroinitializer14; CHECK-NEXT:    [[INDEX_NEXT]] = add nuw i64 [[INDEX]], 215; CHECK-NEXT:    [[OR_REDUC:%.*]] = tail call i1 @llvm.vector.reduce.or.v2i1(<2 x i1> [[COND]])16; CHECK-NEXT:    [[IV_CMP:%.*]] = icmp eq i64 [[INDEX_NEXT]], 417; CHECK-NEXT:    [[EXIT_COND:%.*]] = or i1 [[OR_REDUC]], [[IV_CMP]]18; CHECK-NEXT:    br i1 [[EXIT_COND]], label %[[MIDDLE_SPLIT:.*]], label %[[VECTOR_BODY]]19; CHECK:       [[MIDDLE_SPLIT]]:20; CHECK-NEXT:    [[SEL:%.*]] = select i1 [[OR_REDUC]], i64 1, i64 021; CHECK-NEXT:    ret i64 [[SEL]]22;23entry:24  br label %vector.body25 26vector.body:27  %index = phi i64 [ 0, %entry ], [ %index.next, %vector.body ]28  %arrayidx = getelementptr inbounds ptr, ptr %src, i64 %index29  %wide.load = load <2 x ptr>, ptr %arrayidx, align 830  %cond = icmp eq <2 x ptr> %wide.load, splat(ptr zeroinitializer)31  %index.next = add nuw i64 %index, 232  %or.reduc = tail call i1 @llvm.vector.reduce.or.v2i1(<2 x i1> %cond)33  %iv.cmp = icmp eq i64 %index.next, 434  %exit.cond = or i1 %or.reduc, %iv.cmp35  br i1 %exit.cond, label %middle.split, label %vector.body36 37middle.split:38  %sel = select i1 %or.reduc, i64 1, i64 039  ret i64 %sel40}41 42define i64 @br_or_reduce_v2i1(ptr nocapture noundef readonly %src, ptr noundef readnone %p) {43; CHECK-LABEL: define i64 @br_or_reduce_v2i1(44; CHECK-SAME: ptr noundef readonly captures(none) [[SRC:%.*]], ptr noundef readnone [[P:%.*]]) #[[ATTR0]] {45; CHECK-NEXT:  [[ENTRY:.*]]:46; CHECK-NEXT:    br label %[[VECTOR_BODY:.*]]47; CHECK:       [[VECTOR_BODY]]:48; CHECK-NEXT:    [[INDEX:%.*]] = phi i64 [ 0, %[[ENTRY]] ], [ [[INDEX_NEXT:%.*]], %[[VECTOR_BODY]] ]49; CHECK-NEXT:    [[ARRAYIDX:%.*]] = getelementptr inbounds ptr, ptr [[SRC]], i64 [[INDEX]]50; CHECK-NEXT:    [[WIDE_LOAD:%.*]] = load <2 x ptr>, ptr [[ARRAYIDX]], align 851; CHECK-NEXT:    [[COND:%.*]] = icmp eq <2 x ptr> [[WIDE_LOAD]], zeroinitializer52; CHECK-NEXT:    [[INDEX_NEXT]] = add nuw i64 [[INDEX]], 253; CHECK-NEXT:    [[OR_REDUC:%.*]] = tail call i1 @llvm.vector.reduce.or.v2i1(<2 x i1> [[COND]])54; CHECK-NEXT:    [[IV_CMP:%.*]] = icmp eq i64 [[INDEX_NEXT]], 455; CHECK-NEXT:    [[EXIT_COND:%.*]] = or i1 [[OR_REDUC]], [[IV_CMP]]56; CHECK-NEXT:    br i1 [[EXIT_COND]], label %[[MIDDLE_SPLIT:.*]], label %[[VECTOR_BODY]]57; CHECK:       [[MIDDLE_SPLIT]]:58; CHECK-NEXT:    br i1 [[OR_REDUC]], label %[[FOUND:.*]], label %[[NOTFOUND:.*]]59; CHECK:       [[FOUND]]:60; CHECK-NEXT:    store i64 56, ptr [[P]], align 861; CHECK-NEXT:    ret i64 162; CHECK:       [[NOTFOUND]]:63; CHECK-NEXT:    ret i64 064;65entry:66  br label %vector.body67 68vector.body:69  %index = phi i64 [ 0, %entry ], [ %index.next, %vector.body ]70  %arrayidx = getelementptr inbounds ptr, ptr %src, i64 %index71  %wide.load = load <2 x ptr>, ptr %arrayidx, align 872  %cond = icmp eq <2 x ptr> %wide.load, splat(ptr zeroinitializer)73  %index.next = add nuw i64 %index, 274  %or.reduc = tail call i1 @llvm.vector.reduce.or.v2i1(<2 x i1> %cond)75  %iv.cmp = icmp eq i64 %index.next, 476  %exit.cond = or i1 %or.reduc, %iv.cmp77  br i1 %exit.cond, label %middle.split, label %vector.body78 79middle.split:80  br i1 %or.reduc, label %found, label %notfound81 82found:83  store i64 56, ptr %p, align 884  ret i64 185 86notfound:87  ret i64 088}89 90define i64 @select_or_reduce_nxv2i1(ptr nocapture noundef readonly %src) {91; CHECK-LABEL: define i64 @select_or_reduce_nxv2i1(92; CHECK-SAME: ptr noundef readonly captures(none) [[SRC:%.*]]) #[[ATTR0]] {93; CHECK-NEXT:  [[ENTRY:.*]]:94; CHECK-NEXT:    br label %[[VECTOR_BODY:.*]]95; CHECK:       [[VECTOR_BODY]]:96; CHECK-NEXT:    [[INDEX:%.*]] = phi i64 [ 0, %[[ENTRY]] ], [ [[INDEX_NEXT:%.*]], %[[VECTOR_BODY]] ]97; CHECK-NEXT:    [[ARRAYIDX:%.*]] = getelementptr inbounds ptr, ptr [[SRC]], i64 [[INDEX]]98; CHECK-NEXT:    [[WIDE_LOAD:%.*]] = load <vscale x 2 x ptr>, ptr [[ARRAYIDX]], align 899; CHECK-NEXT:    [[COND:%.*]] = icmp eq <vscale x 2 x ptr> [[WIDE_LOAD]], zeroinitializer100; CHECK-NEXT:    [[TMP0:%.*]] = tail call i64 @llvm.vscale.i64()101; CHECK-NEXT:    [[TMP1:%.*]] = shl nuw nsw i64 [[TMP0]], 1102; CHECK-NEXT:    [[INDEX_NEXT]] = add nuw i64 [[INDEX]], [[TMP1]]103; CHECK-NEXT:    [[OR_REDUC:%.*]] = tail call i1 @llvm.vector.reduce.or.nxv2i1(<vscale x 2 x i1> [[COND]])104; CHECK-NEXT:    [[IV_CMP:%.*]] = icmp eq i64 [[INDEX_NEXT]], 4105; CHECK-NEXT:    [[EXIT_COND:%.*]] = or i1 [[OR_REDUC]], [[IV_CMP]]106; CHECK-NEXT:    br i1 [[EXIT_COND]], label %[[MIDDLE_SPLIT:.*]], label %[[VECTOR_BODY]]107; CHECK:       [[MIDDLE_SPLIT]]:108; CHECK-NEXT:    [[TMP2:%.*]] = icmp eq <vscale x 2 x ptr> [[WIDE_LOAD]], zeroinitializer109; CHECK-NEXT:    [[TMP3:%.*]] = tail call i1 @llvm.vector.reduce.or.nxv2i1(<vscale x 2 x i1> [[TMP2]])110; CHECK-NEXT:    [[SEL:%.*]] = select i1 [[TMP3]], i64 1, i64 0111; CHECK-NEXT:    ret i64 [[SEL]]112;113entry:114  %vscale = tail call i64 @llvm.vscale.i64()115  %vf = shl nuw nsw i64 %vscale, 1116  br label %vector.body117 118vector.body:119  %index = phi i64 [ 0, %entry ], [ %index.next, %vector.body ]120  %arrayidx = getelementptr inbounds ptr, ptr %src, i64 %index121  %wide.load = load <vscale x 2 x ptr>, ptr %arrayidx, align 8122  %cond = icmp eq <vscale x 2 x ptr> %wide.load, splat(ptr zeroinitializer)123  %index.next = add nuw i64 %index, %vf124  %or.reduc = tail call i1 @llvm.vector.reduce.or.nxv2i1(<vscale x 2 x i1> %cond)125  %iv.cmp = icmp eq i64 %index.next, 4126  %exit.cond = or i1 %or.reduc, %iv.cmp127  br i1 %exit.cond, label %middle.split, label %vector.body128 129middle.split:130  %sel = select i1 %or.reduc, i64 1, i64 0131  ret i64 %sel132}133 134define i64 @br_or_reduce_nxv2i1(ptr nocapture noundef readonly %src, ptr noundef readnone %p) {135; CHECK-LABEL: define i64 @br_or_reduce_nxv2i1(136; CHECK-SAME: ptr noundef readonly captures(none) [[SRC:%.*]], ptr noundef readnone [[P:%.*]]) #[[ATTR0]] {137; CHECK-NEXT:  [[ENTRY:.*]]:138; CHECK-NEXT:    br label %[[VECTOR_BODY:.*]]139; CHECK:       [[VECTOR_BODY]]:140; CHECK-NEXT:    [[INDEX:%.*]] = phi i64 [ 0, %[[ENTRY]] ], [ [[INDEX_NEXT:%.*]], %[[VECTOR_BODY]] ]141; CHECK-NEXT:    [[ARRAYIDX:%.*]] = getelementptr inbounds ptr, ptr [[SRC]], i64 [[INDEX]]142; CHECK-NEXT:    [[WIDE_LOAD:%.*]] = load <vscale x 2 x ptr>, ptr [[ARRAYIDX]], align 8143; CHECK-NEXT:    [[COND:%.*]] = icmp eq <vscale x 2 x ptr> [[WIDE_LOAD]], zeroinitializer144; CHECK-NEXT:    [[TMP0:%.*]] = tail call i64 @llvm.vscale.i64()145; CHECK-NEXT:    [[TMP1:%.*]] = shl nuw nsw i64 [[TMP0]], 1146; CHECK-NEXT:    [[INDEX_NEXT]] = add nuw i64 [[INDEX]], [[TMP1]]147; CHECK-NEXT:    [[OR_REDUC:%.*]] = tail call i1 @llvm.vector.reduce.or.nxv2i1(<vscale x 2 x i1> [[COND]])148; CHECK-NEXT:    [[IV_CMP:%.*]] = icmp eq i64 [[INDEX_NEXT]], 4149; CHECK-NEXT:    [[EXIT_COND:%.*]] = or i1 [[OR_REDUC]], [[IV_CMP]]150; CHECK-NEXT:    br i1 [[EXIT_COND]], label %[[MIDDLE_SPLIT:.*]], label %[[VECTOR_BODY]]151; CHECK:       [[MIDDLE_SPLIT]]:152; CHECK-NEXT:    [[TMP2:%.*]] = icmp eq <vscale x 2 x ptr> [[WIDE_LOAD]], zeroinitializer153; CHECK-NEXT:    [[TMP3:%.*]] = tail call i1 @llvm.vector.reduce.or.nxv2i1(<vscale x 2 x i1> [[TMP2]])154; CHECK-NEXT:    br i1 [[TMP3]], label %[[FOUND:.*]], label %[[NOTFOUND:.*]]155; CHECK:       [[FOUND]]:156; CHECK-NEXT:    store i64 56, ptr [[P]], align 8157; CHECK-NEXT:    ret i64 1158; CHECK:       [[NOTFOUND]]:159; CHECK-NEXT:    ret i64 0160;161entry:162  %vscale = tail call i64 @llvm.vscale.i64()163  %vf = shl nuw nsw i64 %vscale, 1164  br label %vector.body165 166vector.body:167  %index = phi i64 [ 0, %entry ], [ %index.next, %vector.body ]168  %arrayidx = getelementptr inbounds ptr, ptr %src, i64 %index169  %wide.load = load <vscale x 2 x ptr>, ptr %arrayidx, align 8170  %cond = icmp eq <vscale x 2 x ptr> %wide.load, splat(ptr zeroinitializer)171  %index.next = add nuw i64 %index, %vf172  %or.reduc = tail call i1 @llvm.vector.reduce.or.nxv2i1(<vscale x 2 x i1> %cond)173  %iv.cmp = icmp eq i64 %index.next, 4174  %exit.cond = or i1 %or.reduc, %iv.cmp175  br i1 %exit.cond, label %middle.split, label %vector.body176 177middle.split:178  br i1 %or.reduc, label %found, label %notfound179 180found:181  store i64 56, ptr %p, align 8182  ret i64 1183 184notfound:185  ret i64 0186}187 188declare i1 @llvm.vector.reduce.or.v2i1(<2 x i1>)189declare i1 @llvm.vector.reduce.or.nxv2i1(<vscale x 2 x i1>)190