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