diff --git a/llvm/test/Transforms/SLPVectorizer/RISCV/load-store.ll b/llvm/test/Transforms/SLPVectorizer/RISCV/load-store.ll index 4ae3c2f44f2213..324fad5e829bea 100644 --- a/llvm/test/Transforms/SLPVectorizer/RISCV/load-store.ll +++ b/llvm/test/Transforms/SLPVectorizer/RISCV/load-store.ll @@ -67,8 +67,8 @@ entry: } -define void @splat_store(ptr %dest, ptr %p) { -; CHECK-LABEL: @splat_store( +define void @splat_store_i16(ptr %dest, ptr %p) { +; CHECK-LABEL: @splat_store_i16( ; CHECK-NEXT: entry: ; CHECK-NEXT: [[E0:%.*]] = load i16, ptr [[P:%.*]], align 4 ; CHECK-NEXT: store i16 [[E0]], ptr [[DEST:%.*]], align 4 @@ -76,7 +76,7 @@ define void @splat_store(ptr %dest, ptr %p) { ; CHECK-NEXT: store i16 [[E0]], ptr [[INC2]], align 2 ; CHECK-NEXT: ret void ; -; DEFAULT-LABEL: @splat_store( +; DEFAULT-LABEL: @splat_store_i16( ; DEFAULT-NEXT: entry: ; DEFAULT-NEXT: [[E0:%.*]] = load i16, ptr [[P:%.*]], align 4 ; DEFAULT-NEXT: store i16 [[E0]], ptr [[DEST:%.*]], align 4 @@ -93,3 +93,184 @@ entry: ret void } +define void @splat_store_i64(ptr %dest, ptr %p) { +; CHECK-LABEL: @splat_store_i64( +; CHECK-NEXT: entry: +; CHECK-NEXT: [[E0:%.*]] = load i64, ptr [[P:%.*]], align 4 +; CHECK-NEXT: store i64 [[E0]], ptr [[DEST:%.*]], align 4 +; CHECK-NEXT: [[INC2:%.*]] = getelementptr inbounds i64, ptr [[DEST]], i64 1 +; CHECK-NEXT: store i64 [[E0]], ptr [[INC2]], align 2 +; CHECK-NEXT: ret void +; +; DEFAULT-LABEL: @splat_store_i64( +; DEFAULT-NEXT: entry: +; DEFAULT-NEXT: [[E0:%.*]] = load i64, ptr [[P:%.*]], align 4 +; DEFAULT-NEXT: store i64 [[E0]], ptr [[DEST:%.*]], align 4 +; DEFAULT-NEXT: [[INC2:%.*]] = getelementptr inbounds i64, ptr [[DEST]], i64 1 +; DEFAULT-NEXT: store i64 [[E0]], ptr [[INC2]], align 2 +; DEFAULT-NEXT: ret void +; +entry: + %e0 = load i64, ptr %p, align 4 + + store i64 %e0, ptr %dest, align 4 + %inc2 = getelementptr inbounds i64, ptr %dest, i64 1 + store i64 %e0, ptr %inc2, align 2 + ret void +} + +define void @splat_store_i64_zero(ptr %dest) { +; CHECK-LABEL: @splat_store_i64_zero( +; CHECK-NEXT: entry: +; CHECK-NEXT: store i64 0, ptr [[DEST:%.*]], align 4 +; CHECK-NEXT: [[INC2:%.*]] = getelementptr inbounds i64, ptr [[DEST]], i64 1 +; CHECK-NEXT: store i64 0, ptr [[INC2]], align 2 +; CHECK-NEXT: ret void +; +; DEFAULT-LABEL: @splat_store_i64_zero( +; DEFAULT-NEXT: entry: +; DEFAULT-NEXT: store i64 0, ptr [[DEST:%.*]], align 4 +; DEFAULT-NEXT: [[INC2:%.*]] = getelementptr inbounds i64, ptr [[DEST]], i64 1 +; DEFAULT-NEXT: store i64 0, ptr [[INC2]], align 2 +; DEFAULT-NEXT: ret void +; +entry: + store i64 0, ptr %dest, align 4 + %inc2 = getelementptr inbounds i64, ptr %dest, i64 1 + store i64 0, ptr %inc2, align 2 + ret void +} + +define void @splat_store_i64_one(ptr %dest) { +; CHECK-LABEL: @splat_store_i64_one( +; CHECK-NEXT: entry: +; CHECK-NEXT: store i64 1, ptr [[DEST:%.*]], align 4 +; CHECK-NEXT: [[INC2:%.*]] = getelementptr inbounds i64, ptr [[DEST]], i64 1 +; CHECK-NEXT: store i64 1, ptr [[INC2]], align 2 +; CHECK-NEXT: ret void +; +; DEFAULT-LABEL: @splat_store_i64_one( +; DEFAULT-NEXT: entry: +; DEFAULT-NEXT: store i64 1, ptr [[DEST:%.*]], align 4 +; DEFAULT-NEXT: [[INC2:%.*]] = getelementptr inbounds i64, ptr [[DEST]], i64 1 +; DEFAULT-NEXT: store i64 1, ptr [[INC2]], align 2 +; DEFAULT-NEXT: ret void +; +entry: + store i64 1, ptr %dest, align 4 + %inc2 = getelementptr inbounds i64, ptr %dest, i64 1 + store i64 1, ptr %inc2, align 2 + ret void +} + +define void @splat_store_i32_zero(ptr %dest) { +; CHECK-LABEL: @splat_store_i32_zero( +; CHECK-NEXT: entry: +; CHECK-NEXT: store <4 x i32> zeroinitializer, ptr [[DEST:%.*]], align 4 +; CHECK-NEXT: ret void +; +; DEFAULT-LABEL: @splat_store_i32_zero( +; DEFAULT-NEXT: entry: +; DEFAULT-NEXT: store i32 0, ptr [[DEST:%.*]], align 4 +; DEFAULT-NEXT: [[INC1:%.*]] = getelementptr inbounds i32, ptr [[DEST]], i64 1 +; DEFAULT-NEXT: store i32 0, ptr [[INC1]], align 2 +; DEFAULT-NEXT: [[INC2:%.*]] = getelementptr inbounds i32, ptr [[DEST]], i64 2 +; DEFAULT-NEXT: store i32 0, ptr [[INC2]], align 2 +; DEFAULT-NEXT: [[INC3:%.*]] = getelementptr inbounds i32, ptr [[DEST]], i64 3 +; DEFAULT-NEXT: store i32 0, ptr [[INC3]], align 2 +; DEFAULT-NEXT: ret void +; +entry: + store i32 0, ptr %dest, align 4 + %inc1 = getelementptr inbounds i32, ptr %dest, i64 1 + store i32 0, ptr %inc1, align 2 + %inc2 = getelementptr inbounds i32, ptr %dest, i64 2 + store i32 0, ptr %inc2, align 2 + %inc3 = getelementptr inbounds i32, ptr %dest, i64 3 + store i32 0, ptr %inc3, align 2 + ret void +} + +define void @splat_store_i32_one(ptr %dest) { +; CHECK-LABEL: @splat_store_i32_one( +; CHECK-NEXT: entry: +; CHECK-NEXT: store <4 x i32> , ptr [[DEST:%.*]], align 4 +; CHECK-NEXT: ret void +; +; DEFAULT-LABEL: @splat_store_i32_one( +; DEFAULT-NEXT: entry: +; DEFAULT-NEXT: store i32 1, ptr [[DEST:%.*]], align 4 +; DEFAULT-NEXT: [[INC1:%.*]] = getelementptr inbounds i32, ptr [[DEST]], i64 1 +; DEFAULT-NEXT: store i32 1, ptr [[INC1]], align 2 +; DEFAULT-NEXT: [[INC2:%.*]] = getelementptr inbounds i32, ptr [[DEST]], i64 2 +; DEFAULT-NEXT: store i32 1, ptr [[INC2]], align 2 +; DEFAULT-NEXT: [[INC3:%.*]] = getelementptr inbounds i32, ptr [[DEST]], i64 3 +; DEFAULT-NEXT: store i32 1, ptr [[INC3]], align 2 +; DEFAULT-NEXT: ret void +; +entry: + store i32 1, ptr %dest, align 4 + %inc1 = getelementptr inbounds i32, ptr %dest, i64 1 + store i32 1, ptr %inc1, align 2 + %inc2 = getelementptr inbounds i32, ptr %dest, i64 2 + store i32 1, ptr %inc2, align 2 + %inc3 = getelementptr inbounds i32, ptr %dest, i64 3 + store i32 1, ptr %inc3, align 2 + ret void +} + +define void @store_stepvector_i32(ptr %dest) { +; CHECK-LABEL: @store_stepvector_i32( +; CHECK-NEXT: entry: +; CHECK-NEXT: store <4 x i32> , ptr [[DEST:%.*]], align 4 +; CHECK-NEXT: ret void +; +; DEFAULT-LABEL: @store_stepvector_i32( +; DEFAULT-NEXT: entry: +; DEFAULT-NEXT: store i32 0, ptr [[DEST:%.*]], align 4 +; DEFAULT-NEXT: [[INC1:%.*]] = getelementptr inbounds i32, ptr [[DEST]], i64 1 +; DEFAULT-NEXT: store i32 1, ptr [[INC1]], align 2 +; DEFAULT-NEXT: [[INC2:%.*]] = getelementptr inbounds i32, ptr [[DEST]], i64 2 +; DEFAULT-NEXT: store i32 2, ptr [[INC2]], align 2 +; DEFAULT-NEXT: [[INC3:%.*]] = getelementptr inbounds i32, ptr [[DEST]], i64 3 +; DEFAULT-NEXT: store i32 3, ptr [[INC3]], align 2 +; DEFAULT-NEXT: ret void +; +entry: + store i32 0, ptr %dest, align 4 + %inc1 = getelementptr inbounds i32, ptr %dest, i64 1 + store i32 1, ptr %inc1, align 2 + %inc2 = getelementptr inbounds i32, ptr %dest, i64 2 + store i32 2, ptr %inc2, align 2 + %inc3 = getelementptr inbounds i32, ptr %dest, i64 3 + store i32 3, ptr %inc3, align 2 + ret void +} + +define void @store_arbitrary_constant_i32(ptr %dest) { +; CHECK-LABEL: @store_arbitrary_constant_i32( +; CHECK-NEXT: entry: +; CHECK-NEXT: store <4 x i32> , ptr [[DEST:%.*]], align 4 +; CHECK-NEXT: ret void +; +; DEFAULT-LABEL: @store_arbitrary_constant_i32( +; DEFAULT-NEXT: entry: +; DEFAULT-NEXT: store i32 0, ptr [[DEST:%.*]], align 4 +; DEFAULT-NEXT: [[INC1:%.*]] = getelementptr inbounds i32, ptr [[DEST]], i64 1 +; DEFAULT-NEXT: store i32 -33, ptr [[INC1]], align 2 +; DEFAULT-NEXT: [[INC2:%.*]] = getelementptr inbounds i32, ptr [[DEST]], i64 2 +; DEFAULT-NEXT: store i32 44, ptr [[INC2]], align 2 +; DEFAULT-NEXT: [[INC3:%.*]] = getelementptr inbounds i32, ptr [[DEST]], i64 3 +; DEFAULT-NEXT: store i32 77, ptr [[INC3]], align 2 +; DEFAULT-NEXT: ret void +; +entry: + store i32 0, ptr %dest, align 4 + %inc1 = getelementptr inbounds i32, ptr %dest, i64 1 + store i32 -33, ptr %inc1, align 2 + %inc2 = getelementptr inbounds i32, ptr %dest, i64 2 + store i32 44, ptr %inc2, align 2 + %inc3 = getelementptr inbounds i32, ptr %dest, i64 3 + store i32 77, ptr %inc3, align 2 + ret void +}