brintos

brintos / llvm-project-archived public Read only

0
0
Text · 6.0 KiB · cd9eb72 Raw
139 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --version 22; RUN: opt -passes=loop-vectorize -force-vector-width=2 -force-vector-interleave=1 -S %s | FileCheck %s3 4 5define i64 @pr62565_incoming_value_known_undef(i64 %a, ptr %src) {6; CHECK-LABEL: define i64 @pr62565_incoming_value_known_undef7; CHECK-SAME: (i64 [[A:%.*]], ptr [[SRC:%.*]]) {8; CHECK-NEXT:  entry:9; CHECK-NEXT:    br label [[VECTOR_PH:%.*]]10; CHECK:       vector.ph:11; CHECK-NEXT:    br label [[VECTOR_BODY:%.*]]12; CHECK:       vector.body:13; CHECK-NEXT:    [[INDEX:%.*]] = phi i32 [ 0, [[VECTOR_PH]] ], [ [[INDEX_NEXT:%.*]], [[VECTOR_BODY]] ]14; CHECK-NEXT:    [[VEC_PHI:%.*]] = phi <2 x i1> [ zeroinitializer, [[VECTOR_PH]] ], [ [[TMP2:%.*]], [[VECTOR_BODY]] ]15; CHECK-NEXT:    [[OFFSET_IDX:%.*]] = add i32 1, [[INDEX]]16; CHECK-NEXT:    [[TMP0:%.*]] = getelementptr inbounds i32, ptr [[SRC]], i32 [[OFFSET_IDX]]17; CHECK-NEXT:    [[WIDE_LOAD:%.*]] = load <2 x i32>, ptr [[TMP0]], align 418; CHECK-NEXT:    [[TMP1:%.*]] = icmp ne <2 x i32> [[WIDE_LOAD]], splat (i32 1)19; CHECK-NEXT:    [[TMP2]] = or <2 x i1> [[VEC_PHI]], [[TMP1]]20; CHECK-NEXT:    [[INDEX_NEXT]] = add nuw i32 [[INDEX]], 221; CHECK-NEXT:    [[TMP3:%.*]] = icmp eq i32 [[INDEX_NEXT]], 3222; CHECK-NEXT:    br i1 [[TMP3]], label [[MIDDLE_BLOCK:%.*]], label [[VECTOR_BODY]], !llvm.loop [[LOOP0:![0-9]+]]23; CHECK:       middle.block:24; CHECK-NEXT:    [[TMP4:%.*]] = call i1 @llvm.vector.reduce.or.v2i1(<2 x i1> [[TMP2]])25; CHECK-NEXT:    [[TMP5:%.*]] = freeze i1 [[TMP4]]26; CHECK-NEXT:    [[RDX_SELECT:%.*]] = select i1 [[TMP5]], i64 [[A]], i64 poison27; CHECK-NEXT:    br label [[EXIT:%.*]]28; CHECK:       exit:29; CHECK-NEXT:    ret i64 [[RDX_SELECT]]30;31entry:32  br label %loop33 34loop:35  %iv = phi i32 [ 1, %entry ], [ %add, %loop ]36  %red = phi i64 [ poison, %entry ], [ %select, %loop ]37  %gep = getelementptr inbounds i32, ptr %src, i32 %iv38  %l = load i32, ptr %gep39  %c = icmp eq i32 %l, 140  %select = select i1 %c, i64 %red, i64 %a41  %add = add nuw i32 %iv, 142  %ec = icmp eq i32 %iv, 3243  br i1 %ec, label %exit, label %loop44 45exit:46  %phi = phi i64 [ %select, %loop ]47  ret i64 %phi48}49 50define i64 @pr62565_incoming_value_known_poison(i64 %a, ptr %src) {51; CHECK-LABEL: define i64 @pr62565_incoming_value_known_poison52; CHECK-SAME: (i64 [[A:%.*]], ptr [[SRC:%.*]]) {53; CHECK-NEXT:  entry:54; CHECK-NEXT:    br label [[VECTOR_PH:%.*]]55; CHECK:       vector.ph:56; CHECK-NEXT:    br label [[VECTOR_BODY:%.*]]57; CHECK:       vector.body:58; CHECK-NEXT:    [[INDEX:%.*]] = phi i32 [ 0, [[VECTOR_PH]] ], [ [[INDEX_NEXT:%.*]], [[VECTOR_BODY]] ]59; CHECK-NEXT:    [[VEC_PHI:%.*]] = phi <2 x i1> [ zeroinitializer, [[VECTOR_PH]] ], [ [[TMP2:%.*]], [[VECTOR_BODY]] ]60; CHECK-NEXT:    [[OFFSET_IDX:%.*]] = add i32 1, [[INDEX]]61; CHECK-NEXT:    [[TMP0:%.*]] = getelementptr inbounds i32, ptr [[SRC]], i32 [[OFFSET_IDX]]62; CHECK-NEXT:    [[WIDE_LOAD:%.*]] = load <2 x i32>, ptr [[TMP0]], align 463; CHECK-NEXT:    [[TMP1:%.*]] = icmp ne <2 x i32> [[WIDE_LOAD]], splat (i32 1)64; CHECK-NEXT:    [[TMP2]] = or <2 x i1> [[VEC_PHI]], [[TMP1]]65; CHECK-NEXT:    [[INDEX_NEXT]] = add nuw i32 [[INDEX]], 266; CHECK-NEXT:    [[TMP3:%.*]] = icmp eq i32 [[INDEX_NEXT]], 3267; CHECK-NEXT:    br i1 [[TMP3]], label [[MIDDLE_BLOCK:%.*]], label [[VECTOR_BODY]], !llvm.loop [[LOOP3:![0-9]+]]68; CHECK:       middle.block:69; CHECK-NEXT:    [[TMP4:%.*]] = call i1 @llvm.vector.reduce.or.v2i1(<2 x i1> [[TMP2]])70; CHECK-NEXT:    [[TMP5:%.*]] = freeze i1 [[TMP4]]71; CHECK-NEXT:    [[RDX_SELECT:%.*]] = select i1 [[TMP5]], i64 [[A]], i64 poison72; CHECK-NEXT:    br label [[EXIT:%.*]]73; CHECK:       exit:74; CHECK-NEXT:    ret i64 [[RDX_SELECT]]75;76entry:77  br label %loop78 79loop:80  %iv = phi i32 [ 1, %entry ], [ %add, %loop ]81  %red = phi i64 [ poison, %entry ], [ %select, %loop ]82  %gep = getelementptr inbounds i32, ptr %src, i32 %iv83  %l = load i32, ptr %gep84  %c = icmp eq i32 %l, 185  %select = select i1 %c, i64 %red, i64 %a86  %add = add nuw i32 %iv, 187  %ec = icmp eq i32 %iv, 3288  br i1 %ec, label %exit, label %loop89 90exit:91  %phi = phi i64 [ %select, %loop ]92  ret i64 %phi93}94 95define i64 @pr62565_incoming_value_may_be_poison(i64 %a, ptr %src, i64 %start) {96; CHECK-LABEL: define i64 @pr62565_incoming_value_may_be_poison97; CHECK-SAME: (i64 [[A:%.*]], ptr [[SRC:%.*]], i64 [[START:%.*]]) {98; CHECK-NEXT:  entry:99; CHECK-NEXT:    br label [[VECTOR_PH:%.*]]100; CHECK:       vector.ph:101; CHECK-NEXT:    br label [[VECTOR_BODY:%.*]]102; CHECK:       vector.body:103; CHECK-NEXT:    [[INDEX:%.*]] = phi i32 [ 0, [[VECTOR_PH]] ], [ [[INDEX_NEXT:%.*]], [[VECTOR_BODY]] ]104; CHECK-NEXT:    [[VEC_PHI:%.*]] = phi <2 x i1> [ zeroinitializer, [[VECTOR_PH]] ], [ [[TMP2:%.*]], [[VECTOR_BODY]] ]105; CHECK-NEXT:    [[OFFSET_IDX:%.*]] = add i32 1, [[INDEX]]106; CHECK-NEXT:    [[TMP0:%.*]] = getelementptr inbounds i32, ptr [[SRC]], i32 [[OFFSET_IDX]]107; CHECK-NEXT:    [[WIDE_LOAD:%.*]] = load <2 x i32>, ptr [[TMP0]], align 4108; CHECK-NEXT:    [[TMP1:%.*]] = icmp ne <2 x i32> [[WIDE_LOAD]], splat (i32 1)109; CHECK-NEXT:    [[TMP2]] = or <2 x i1> [[VEC_PHI]], [[TMP1]]110; CHECK-NEXT:    [[INDEX_NEXT]] = add nuw i32 [[INDEX]], 2111; CHECK-NEXT:    [[TMP3:%.*]] = icmp eq i32 [[INDEX_NEXT]], 32112; CHECK-NEXT:    br i1 [[TMP3]], label [[MIDDLE_BLOCK:%.*]], label [[VECTOR_BODY]], !llvm.loop [[LOOP4:![0-9]+]]113; CHECK:       middle.block:114; CHECK-NEXT:    [[TMP4:%.*]] = call i1 @llvm.vector.reduce.or.v2i1(<2 x i1> [[TMP2]])115; CHECK-NEXT:    [[TMP5:%.*]] = freeze i1 [[TMP4]]116; CHECK-NEXT:    [[RDX_SELECT:%.*]] = select i1 [[TMP5]], i64 [[A]], i64 [[START]]117; CHECK-NEXT:    br label [[EXIT:%.*]]118; CHECK:       exit:119; CHECK-NEXT:    ret i64 [[RDX_SELECT]]120;121entry:122  br label %loop123 124loop:125  %iv = phi i32 [ 1, %entry ], [ %add, %loop ]126  %red = phi i64 [ %start, %entry ], [ %select, %loop ]127  %gep = getelementptr inbounds i32, ptr %src, i32 %iv128  %l = load i32, ptr %gep129  %c = icmp eq i32 %l, 1130  %select = select i1 %c, i64 %red, i64 %a131  %add = add nuw i32 %iv, 1132  %ec = icmp eq i32 %iv, 32133  br i1 %ec, label %exit, label %loop134 135exit:136  %phi = phi i64 [ %select, %loop ]137  ret i64 %phi138}139