diff --git a/llvm/test/Transforms/SLPVectorizer/X86/phi-unreachable-input-block.ll b/llvm/test/Transforms/SLPVectorizer/X86/phi-unreachable-input-block.ll new file mode 100644 --- /dev/null +++ b/llvm/test/Transforms/SLPVectorizer/X86/phi-unreachable-input-block.ll @@ -0,0 +1,112 @@ +; NOTE: Assertions have been autogenerated by utils/update_test_checks.py +; RUN: opt < %s -slp-vectorizer -slp-threshold=-1000 -mtriple=x86_64-unknown-linux -S | FileCheck %s + +; If an input block to a phi node is unreachable from entry then its input +; should be undef and not poison. +; In the following tests bb2 is unreachable from entry, so any input to the phi +; coming from there should be undef. + +define void @phiUndefInput(i64* %ptr, i8 %arg0, i8 %arg1) { +; CHECK-LABEL: @phiUndefInput( +; CHECK-NEXT: bb1: +; CHECK-NEXT: [[TMP0:%.*]] = insertelement <2 x i8> poison, i8 [[ARG0:%.*]], i32 0 +; CHECK-NEXT: [[TMP1:%.*]] = insertelement <2 x i8> [[TMP0]], i8 [[ARG1:%.*]], i32 1 +; CHECK-NEXT: br label [[BB3:%.*]] +; CHECK: bb2: +; CHECK-NEXT: br label [[BB3]] +; CHECK: bb3: +; CHECK-NEXT: [[TMP2:%.*]] = phi <2 x i8> [ [[TMP1]], [[BB1:%.*]] ], [ poison, [[BB2:%.*]] ] +; CHECK-NEXT: [[TMP3:%.*]] = zext <2 x i8> [[TMP2]] to <2 x i64> +; CHECK-NEXT: [[GEP0:%.*]] = getelementptr i64, i64* [[PTR:%.*]], i64 0 +; CHECK-NEXT: [[TMP4:%.*]] = bitcast i64* [[GEP0]] to <2 x i64>* +; CHECK-NEXT: store <2 x i64> [[TMP3]], <2 x i64>* [[TMP4]], align 4 +; CHECK-NEXT: ret void +; +bb1: + br label %bb3 + +bb2: + br label %bb3 + +bb3: + %phi0 = phi i8 [ %arg0, %bb1 ], [ undef, %bb2 ] + %phi1 = phi i8 [ %arg1, %bb1 ], [ 0, %bb2 ] + %zext0 = zext i8 %phi0 to i64 + %zext1 = zext i8 %phi1 to i64 + %gep0 = getelementptr i64, i64* %ptr, i64 0 + %gep1 = getelementptr i64, i64* %ptr, i64 1 + store i64 %zext0, i64* %gep0 + store i64 %zext1, i64* %gep1 + ret void +} + + +define void @phiConstInput(i64* %ptr, i8 %arg0, i8 %arg1) { +; CHECK-LABEL: @phiConstInput( +; CHECK-NEXT: bb1: +; CHECK-NEXT: [[TMP0:%.*]] = insertelement <2 x i8> poison, i8 [[ARG0:%.*]], i32 0 +; CHECK-NEXT: [[TMP1:%.*]] = insertelement <2 x i8> [[TMP0]], i8 [[ARG1:%.*]], i32 1 +; CHECK-NEXT: br label [[BB3:%.*]] +; CHECK: bb2: +; CHECK-NEXT: br label [[BB3]] +; CHECK: bb3: +; CHECK-NEXT: [[TMP2:%.*]] = phi <2 x i8> [ [[TMP1]], [[BB1:%.*]] ], [ poison, [[BB2:%.*]] ] +; CHECK-NEXT: [[TMP3:%.*]] = zext <2 x i8> [[TMP2]] to <2 x i64> +; CHECK-NEXT: [[GEP0:%.*]] = getelementptr i64, i64* [[PTR:%.*]], i64 0 +; CHECK-NEXT: [[TMP4:%.*]] = bitcast i64* [[GEP0]] to <2 x i64>* +; CHECK-NEXT: store <2 x i64> [[TMP3]], <2 x i64>* [[TMP4]], align 4 +; CHECK-NEXT: ret void +; +bb1: + br label %bb3 + +bb2: + br label %bb3 + +bb3: + %phi0 = phi i8 [ %arg0, %bb1 ], [ 1, %bb2 ] + %phi1 = phi i8 [ %arg1, %bb1 ], [ 0, %bb2 ] + %zext0 = zext i8 %phi0 to i64 + %zext1 = zext i8 %phi1 to i64 + %gep0 = getelementptr i64, i64* %ptr, i64 0 + %gep1 = getelementptr i64, i64* %ptr, i64 1 + store i64 %zext0, i64* %gep0 + store i64 %zext1, i64* %gep1 + ret void +} + + +define void @phiPoisonInput(i64* %ptr, i8 %arg0, i8 %arg1) { +; CHECK-LABEL: @phiPoisonInput( +; CHECK-NEXT: bb1: +; CHECK-NEXT: [[TMP0:%.*]] = insertelement <2 x i8> poison, i8 [[ARG0:%.*]], i32 0 +; CHECK-NEXT: [[TMP1:%.*]] = insertelement <2 x i8> [[TMP0]], i8 [[ARG1:%.*]], i32 1 +; CHECK-NEXT: br label [[BB3:%.*]] +; CHECK: bb2: +; CHECK-NEXT: br label [[BB3]] +; CHECK: bb3: +; CHECK-NEXT: [[TMP2:%.*]] = phi <2 x i8> [ [[TMP1]], [[BB1:%.*]] ], [ poison, [[BB2:%.*]] ] +; CHECK-NEXT: [[TMP3:%.*]] = zext <2 x i8> [[TMP2]] to <2 x i64> +; CHECK-NEXT: [[GEP0:%.*]] = getelementptr i64, i64* [[PTR:%.*]], i64 0 +; CHECK-NEXT: [[TMP4:%.*]] = bitcast i64* [[GEP0]] to <2 x i64>* +; CHECK-NEXT: store <2 x i64> [[TMP3]], <2 x i64>* [[TMP4]], align 4 +; CHECK-NEXT: ret void +; +bb1: + br label %bb3 + +bb2: + br label %bb3 + +bb3: + %phi0 = phi i8 [ %arg0, %bb1 ], [ poison, %bb2 ] + %phi1 = phi i8 [ %arg1, %bb1 ], [ poison, %bb2 ] + %zext0 = zext i8 %phi0 to i64 + %zext1 = zext i8 %phi1 to i64 + %gep0 = getelementptr i64, i64* %ptr, i64 0 + %gep1 = getelementptr i64, i64* %ptr, i64 1 + store i64 %zext0, i64* %gep0 + store i64 %zext1, i64* %gep1 + ret void +} +