110625958SPhilip Reames; NOTE: Assertions have been autogenerated by utils/update_test_checks.py 23be72f40SBjorn Pettersson; RUN: opt < %s -passes=slp-vectorizer -mtriple=riscv64 -mattr=+v \ 3a3106371SPhilip Reames; RUN: -riscv-v-vector-bits-min=-1 -riscv-v-slp-max-vf=0 -S | FileCheck %s --check-prefixes=CHECK 43be72f40SBjorn Pettersson; RUN: opt < %s -passes=slp-vectorizer -mtriple=riscv64 -mattr=+v -S | FileCheck %s --check-prefixes=DEFAULT 5a3106371SPhilip Reames 610625958SPhilip Reames 710625958SPhilip Reamesdefine void @simple_copy(ptr %dest, ptr %p) { 810625958SPhilip Reames; CHECK-LABEL: @simple_copy( 910625958SPhilip Reames; CHECK-NEXT: entry: 1010625958SPhilip Reames; CHECK-NEXT: [[TMP0:%.*]] = load <2 x i16>, ptr [[P:%.*]], align 4 1110625958SPhilip Reames; CHECK-NEXT: store <2 x i16> [[TMP0]], ptr [[DEST:%.*]], align 4 1210625958SPhilip Reames; CHECK-NEXT: ret void 1310625958SPhilip Reames; 14a3106371SPhilip Reames; DEFAULT-LABEL: @simple_copy( 15a3106371SPhilip Reames; DEFAULT-NEXT: entry: 167f26c27eSPhilip Reames; DEFAULT-NEXT: [[TMP0:%.*]] = load <2 x i16>, ptr [[P:%.*]], align 4 177f26c27eSPhilip Reames; DEFAULT-NEXT: store <2 x i16> [[TMP0]], ptr [[DEST:%.*]], align 4 18a3106371SPhilip Reames; DEFAULT-NEXT: ret void 19a3106371SPhilip Reames; 2010625958SPhilip Reamesentry: 2110625958SPhilip Reames %e0 = load i16, ptr %p, align 4 2210625958SPhilip Reames %inc = getelementptr inbounds i16, ptr %p, i64 1 2310625958SPhilip Reames %e1 = load i16, ptr %inc, align 2 2410625958SPhilip Reames 2510625958SPhilip Reames store i16 %e0, ptr %dest, align 4 2610625958SPhilip Reames %inc2 = getelementptr inbounds i16, ptr %dest, i64 1 2710625958SPhilip Reames store i16 %e1, ptr %inc2, align 2 2810625958SPhilip Reames ret void 2910625958SPhilip Reames} 3010625958SPhilip Reames 3110625958SPhilip Reamesdefine void @vec_add(ptr %dest, ptr %p) { 3210625958SPhilip Reames; CHECK-LABEL: @vec_add( 3310625958SPhilip Reames; CHECK-NEXT: entry: 3410625958SPhilip Reames; CHECK-NEXT: [[TMP0:%.*]] = load <2 x i16>, ptr [[P:%.*]], align 4 35*38fffa63SPaul Walker; CHECK-NEXT: [[TMP1:%.*]] = add <2 x i16> [[TMP0]], splat (i16 1) 3610625958SPhilip Reames; CHECK-NEXT: store <2 x i16> [[TMP1]], ptr [[DEST:%.*]], align 4 3710625958SPhilip Reames; CHECK-NEXT: ret void 3810625958SPhilip Reames; 39a3106371SPhilip Reames; DEFAULT-LABEL: @vec_add( 40a3106371SPhilip Reames; DEFAULT-NEXT: entry: 417f26c27eSPhilip Reames; DEFAULT-NEXT: [[TMP0:%.*]] = load <2 x i16>, ptr [[P:%.*]], align 4 42*38fffa63SPaul Walker; DEFAULT-NEXT: [[TMP1:%.*]] = add <2 x i16> [[TMP0]], splat (i16 1) 437f26c27eSPhilip Reames; DEFAULT-NEXT: store <2 x i16> [[TMP1]], ptr [[DEST:%.*]], align 4 44a3106371SPhilip Reames; DEFAULT-NEXT: ret void 45a3106371SPhilip Reames; 4610625958SPhilip Reamesentry: 4710625958SPhilip Reames %e0 = load i16, ptr %p, align 4 4810625958SPhilip Reames %inc = getelementptr inbounds i16, ptr %p, i64 1 4910625958SPhilip Reames %e1 = load i16, ptr %inc, align 2 5010625958SPhilip Reames 5110625958SPhilip Reames %a0 = add i16 %e0, 1 5210625958SPhilip Reames %a1 = add i16 %e1, 1 5310625958SPhilip Reames 5410625958SPhilip Reames store i16 %a0, ptr %dest, align 4 5510625958SPhilip Reames %inc2 = getelementptr inbounds i16, ptr %dest, i64 1 5610625958SPhilip Reames store i16 %a1, ptr %inc2, align 2 5710625958SPhilip Reames ret void 5810625958SPhilip Reames} 5910625958SPhilip Reames 6010625958SPhilip Reames 6117f2ee80SPhilip Reamesdefine void @splat_store_i16(ptr %dest, ptr %p) { 6217f2ee80SPhilip Reames; CHECK-LABEL: @splat_store_i16( 6310625958SPhilip Reames; CHECK-NEXT: entry: 6410625958SPhilip Reames; CHECK-NEXT: [[E0:%.*]] = load i16, ptr [[P:%.*]], align 4 6510625958SPhilip Reames; CHECK-NEXT: store i16 [[E0]], ptr [[DEST:%.*]], align 4 6610625958SPhilip Reames; CHECK-NEXT: [[INC2:%.*]] = getelementptr inbounds i16, ptr [[DEST]], i64 1 6710625958SPhilip Reames; CHECK-NEXT: store i16 [[E0]], ptr [[INC2]], align 2 6810625958SPhilip Reames; CHECK-NEXT: ret void 6910625958SPhilip Reames; 7017f2ee80SPhilip Reames; DEFAULT-LABEL: @splat_store_i16( 71a3106371SPhilip Reames; DEFAULT-NEXT: entry: 72a3106371SPhilip Reames; DEFAULT-NEXT: [[E0:%.*]] = load i16, ptr [[P:%.*]], align 4 73a3106371SPhilip Reames; DEFAULT-NEXT: store i16 [[E0]], ptr [[DEST:%.*]], align 4 74a3106371SPhilip Reames; DEFAULT-NEXT: [[INC2:%.*]] = getelementptr inbounds i16, ptr [[DEST]], i64 1 75a3106371SPhilip Reames; DEFAULT-NEXT: store i16 [[E0]], ptr [[INC2]], align 2 76a3106371SPhilip Reames; DEFAULT-NEXT: ret void 77a3106371SPhilip Reames; 7810625958SPhilip Reamesentry: 7910625958SPhilip Reames %e0 = load i16, ptr %p, align 4 8010625958SPhilip Reames 8110625958SPhilip Reames store i16 %e0, ptr %dest, align 4 8210625958SPhilip Reames %inc2 = getelementptr inbounds i16, ptr %dest, i64 1 8310625958SPhilip Reames store i16 %e0, ptr %inc2, align 2 8410625958SPhilip Reames ret void 8510625958SPhilip Reames} 8610625958SPhilip Reames 8717f2ee80SPhilip Reamesdefine void @splat_store_i64(ptr %dest, ptr %p) { 8817f2ee80SPhilip Reames; CHECK-LABEL: @splat_store_i64( 8917f2ee80SPhilip Reames; CHECK-NEXT: entry: 9017f2ee80SPhilip Reames; CHECK-NEXT: [[E0:%.*]] = load i64, ptr [[P:%.*]], align 4 9117f2ee80SPhilip Reames; CHECK-NEXT: store i64 [[E0]], ptr [[DEST:%.*]], align 4 9217f2ee80SPhilip Reames; CHECK-NEXT: [[INC2:%.*]] = getelementptr inbounds i64, ptr [[DEST]], i64 1 9317f2ee80SPhilip Reames; CHECK-NEXT: store i64 [[E0]], ptr [[INC2]], align 2 9417f2ee80SPhilip Reames; CHECK-NEXT: ret void 9517f2ee80SPhilip Reames; 9617f2ee80SPhilip Reames; DEFAULT-LABEL: @splat_store_i64( 9717f2ee80SPhilip Reames; DEFAULT-NEXT: entry: 9817f2ee80SPhilip Reames; DEFAULT-NEXT: [[E0:%.*]] = load i64, ptr [[P:%.*]], align 4 9917f2ee80SPhilip Reames; DEFAULT-NEXT: store i64 [[E0]], ptr [[DEST:%.*]], align 4 10017f2ee80SPhilip Reames; DEFAULT-NEXT: [[INC2:%.*]] = getelementptr inbounds i64, ptr [[DEST]], i64 1 10117f2ee80SPhilip Reames; DEFAULT-NEXT: store i64 [[E0]], ptr [[INC2]], align 2 10217f2ee80SPhilip Reames; DEFAULT-NEXT: ret void 10317f2ee80SPhilip Reames; 10417f2ee80SPhilip Reamesentry: 10517f2ee80SPhilip Reames %e0 = load i64, ptr %p, align 4 10617f2ee80SPhilip Reames 10717f2ee80SPhilip Reames store i64 %e0, ptr %dest, align 4 10817f2ee80SPhilip Reames %inc2 = getelementptr inbounds i64, ptr %dest, i64 1 10917f2ee80SPhilip Reames store i64 %e0, ptr %inc2, align 2 11017f2ee80SPhilip Reames ret void 11117f2ee80SPhilip Reames} 11217f2ee80SPhilip Reames 11317f2ee80SPhilip Reamesdefine void @splat_store_i64_zero(ptr %dest) { 11417f2ee80SPhilip Reames; CHECK-LABEL: @splat_store_i64_zero( 11517f2ee80SPhilip Reames; CHECK-NEXT: entry: 11617f2ee80SPhilip Reames; CHECK-NEXT: store i64 0, ptr [[DEST:%.*]], align 4 11717f2ee80SPhilip Reames; CHECK-NEXT: [[INC2:%.*]] = getelementptr inbounds i64, ptr [[DEST]], i64 1 11817f2ee80SPhilip Reames; CHECK-NEXT: store i64 0, ptr [[INC2]], align 2 11917f2ee80SPhilip Reames; CHECK-NEXT: ret void 12017f2ee80SPhilip Reames; 12117f2ee80SPhilip Reames; DEFAULT-LABEL: @splat_store_i64_zero( 12217f2ee80SPhilip Reames; DEFAULT-NEXT: entry: 12317f2ee80SPhilip Reames; DEFAULT-NEXT: store i64 0, ptr [[DEST:%.*]], align 4 12417f2ee80SPhilip Reames; DEFAULT-NEXT: [[INC2:%.*]] = getelementptr inbounds i64, ptr [[DEST]], i64 1 12517f2ee80SPhilip Reames; DEFAULT-NEXT: store i64 0, ptr [[INC2]], align 2 12617f2ee80SPhilip Reames; DEFAULT-NEXT: ret void 12717f2ee80SPhilip Reames; 12817f2ee80SPhilip Reamesentry: 12917f2ee80SPhilip Reames store i64 0, ptr %dest, align 4 13017f2ee80SPhilip Reames %inc2 = getelementptr inbounds i64, ptr %dest, i64 1 13117f2ee80SPhilip Reames store i64 0, ptr %inc2, align 2 13217f2ee80SPhilip Reames ret void 13317f2ee80SPhilip Reames} 13417f2ee80SPhilip Reames 13517f2ee80SPhilip Reamesdefine void @splat_store_i64_one(ptr %dest) { 13617f2ee80SPhilip Reames; CHECK-LABEL: @splat_store_i64_one( 13717f2ee80SPhilip Reames; CHECK-NEXT: entry: 13817f2ee80SPhilip Reames; CHECK-NEXT: store i64 1, ptr [[DEST:%.*]], align 4 13917f2ee80SPhilip Reames; CHECK-NEXT: [[INC2:%.*]] = getelementptr inbounds i64, ptr [[DEST]], i64 1 14017f2ee80SPhilip Reames; CHECK-NEXT: store i64 1, ptr [[INC2]], align 2 14117f2ee80SPhilip Reames; CHECK-NEXT: ret void 14217f2ee80SPhilip Reames; 14317f2ee80SPhilip Reames; DEFAULT-LABEL: @splat_store_i64_one( 14417f2ee80SPhilip Reames; DEFAULT-NEXT: entry: 14517f2ee80SPhilip Reames; DEFAULT-NEXT: store i64 1, ptr [[DEST:%.*]], align 4 14617f2ee80SPhilip Reames; DEFAULT-NEXT: [[INC2:%.*]] = getelementptr inbounds i64, ptr [[DEST]], i64 1 14717f2ee80SPhilip Reames; DEFAULT-NEXT: store i64 1, ptr [[INC2]], align 2 14817f2ee80SPhilip Reames; DEFAULT-NEXT: ret void 14917f2ee80SPhilip Reames; 15017f2ee80SPhilip Reamesentry: 15117f2ee80SPhilip Reames store i64 1, ptr %dest, align 4 15217f2ee80SPhilip Reames %inc2 = getelementptr inbounds i64, ptr %dest, i64 1 15317f2ee80SPhilip Reames store i64 1, ptr %inc2, align 2 15417f2ee80SPhilip Reames ret void 15517f2ee80SPhilip Reames} 15617f2ee80SPhilip Reames 15717f2ee80SPhilip Reamesdefine void @splat_store_i32_zero(ptr %dest) { 15817f2ee80SPhilip Reames; CHECK-LABEL: @splat_store_i32_zero( 15917f2ee80SPhilip Reames; CHECK-NEXT: entry: 16017f2ee80SPhilip Reames; CHECK-NEXT: store <4 x i32> zeroinitializer, ptr [[DEST:%.*]], align 4 16117f2ee80SPhilip Reames; CHECK-NEXT: ret void 16217f2ee80SPhilip Reames; 16317f2ee80SPhilip Reames; DEFAULT-LABEL: @splat_store_i32_zero( 16417f2ee80SPhilip Reames; DEFAULT-NEXT: entry: 1657f26c27eSPhilip Reames; DEFAULT-NEXT: store <4 x i32> zeroinitializer, ptr [[DEST:%.*]], align 4 16617f2ee80SPhilip Reames; DEFAULT-NEXT: ret void 16717f2ee80SPhilip Reames; 16817f2ee80SPhilip Reamesentry: 16917f2ee80SPhilip Reames store i32 0, ptr %dest, align 4 17017f2ee80SPhilip Reames %inc1 = getelementptr inbounds i32, ptr %dest, i64 1 17117f2ee80SPhilip Reames store i32 0, ptr %inc1, align 2 17217f2ee80SPhilip Reames %inc2 = getelementptr inbounds i32, ptr %dest, i64 2 17317f2ee80SPhilip Reames store i32 0, ptr %inc2, align 2 17417f2ee80SPhilip Reames %inc3 = getelementptr inbounds i32, ptr %dest, i64 3 17517f2ee80SPhilip Reames store i32 0, ptr %inc3, align 2 17617f2ee80SPhilip Reames ret void 17717f2ee80SPhilip Reames} 17817f2ee80SPhilip Reames 17917f2ee80SPhilip Reamesdefine void @splat_store_i32_one(ptr %dest) { 18017f2ee80SPhilip Reames; CHECK-LABEL: @splat_store_i32_one( 18117f2ee80SPhilip Reames; CHECK-NEXT: entry: 182*38fffa63SPaul Walker; CHECK-NEXT: store <4 x i32> splat (i32 1), ptr [[DEST:%.*]], align 4 18317f2ee80SPhilip Reames; CHECK-NEXT: ret void 18417f2ee80SPhilip Reames; 18517f2ee80SPhilip Reames; DEFAULT-LABEL: @splat_store_i32_one( 18617f2ee80SPhilip Reames; DEFAULT-NEXT: entry: 187*38fffa63SPaul Walker; DEFAULT-NEXT: store <4 x i32> splat (i32 1), ptr [[DEST:%.*]], align 4 18817f2ee80SPhilip Reames; DEFAULT-NEXT: ret void 18917f2ee80SPhilip Reames; 19017f2ee80SPhilip Reamesentry: 19117f2ee80SPhilip Reames store i32 1, ptr %dest, align 4 19217f2ee80SPhilip Reames %inc1 = getelementptr inbounds i32, ptr %dest, i64 1 19317f2ee80SPhilip Reames store i32 1, ptr %inc1, align 2 19417f2ee80SPhilip Reames %inc2 = getelementptr inbounds i32, ptr %dest, i64 2 19517f2ee80SPhilip Reames store i32 1, ptr %inc2, align 2 19617f2ee80SPhilip Reames %inc3 = getelementptr inbounds i32, ptr %dest, i64 3 19717f2ee80SPhilip Reames store i32 1, ptr %inc3, align 2 19817f2ee80SPhilip Reames ret void 19917f2ee80SPhilip Reames} 20017f2ee80SPhilip Reames 20117f2ee80SPhilip Reamesdefine void @store_stepvector_i32(ptr %dest) { 20217f2ee80SPhilip Reames; CHECK-LABEL: @store_stepvector_i32( 20317f2ee80SPhilip Reames; CHECK-NEXT: entry: 20402bfe2deSPhilip Reames; CHECK-NEXT: store i32 0, ptr [[DEST:%.*]], align 4 20502bfe2deSPhilip Reames; CHECK-NEXT: [[INC1:%.*]] = getelementptr inbounds i32, ptr [[DEST]], i64 1 20602bfe2deSPhilip Reames; CHECK-NEXT: store i32 1, ptr [[INC1]], align 2 20702bfe2deSPhilip Reames; CHECK-NEXT: [[INC2:%.*]] = getelementptr inbounds i32, ptr [[DEST]], i64 2 20802bfe2deSPhilip Reames; CHECK-NEXT: store i32 2, ptr [[INC2]], align 2 20902bfe2deSPhilip Reames; CHECK-NEXT: [[INC3:%.*]] = getelementptr inbounds i32, ptr [[DEST]], i64 3 21002bfe2deSPhilip Reames; CHECK-NEXT: store i32 3, ptr [[INC3]], align 2 21117f2ee80SPhilip Reames; CHECK-NEXT: ret void 21217f2ee80SPhilip Reames; 21317f2ee80SPhilip Reames; DEFAULT-LABEL: @store_stepvector_i32( 21417f2ee80SPhilip Reames; DEFAULT-NEXT: entry: 21517f2ee80SPhilip Reames; DEFAULT-NEXT: store i32 0, ptr [[DEST:%.*]], align 4 21617f2ee80SPhilip Reames; DEFAULT-NEXT: [[INC1:%.*]] = getelementptr inbounds i32, ptr [[DEST]], i64 1 21717f2ee80SPhilip Reames; DEFAULT-NEXT: store i32 1, ptr [[INC1]], align 2 21817f2ee80SPhilip Reames; DEFAULT-NEXT: [[INC2:%.*]] = getelementptr inbounds i32, ptr [[DEST]], i64 2 21917f2ee80SPhilip Reames; DEFAULT-NEXT: store i32 2, ptr [[INC2]], align 2 22017f2ee80SPhilip Reames; DEFAULT-NEXT: [[INC3:%.*]] = getelementptr inbounds i32, ptr [[DEST]], i64 3 22117f2ee80SPhilip Reames; DEFAULT-NEXT: store i32 3, ptr [[INC3]], align 2 22217f2ee80SPhilip Reames; DEFAULT-NEXT: ret void 22317f2ee80SPhilip Reames; 22417f2ee80SPhilip Reamesentry: 22517f2ee80SPhilip Reames store i32 0, ptr %dest, align 4 22617f2ee80SPhilip Reames %inc1 = getelementptr inbounds i32, ptr %dest, i64 1 22717f2ee80SPhilip Reames store i32 1, ptr %inc1, align 2 22817f2ee80SPhilip Reames %inc2 = getelementptr inbounds i32, ptr %dest, i64 2 22917f2ee80SPhilip Reames store i32 2, ptr %inc2, align 2 23017f2ee80SPhilip Reames %inc3 = getelementptr inbounds i32, ptr %dest, i64 3 23117f2ee80SPhilip Reames store i32 3, ptr %inc3, align 2 23217f2ee80SPhilip Reames ret void 23317f2ee80SPhilip Reames} 23417f2ee80SPhilip Reames 23517f2ee80SPhilip Reamesdefine void @store_arbitrary_constant_i32(ptr %dest) { 23617f2ee80SPhilip Reames; CHECK-LABEL: @store_arbitrary_constant_i32( 23717f2ee80SPhilip Reames; CHECK-NEXT: entry: 23802bfe2deSPhilip Reames; CHECK-NEXT: store i32 0, ptr [[DEST:%.*]], align 4 23902bfe2deSPhilip Reames; CHECK-NEXT: [[INC1:%.*]] = getelementptr inbounds i32, ptr [[DEST]], i64 1 24002bfe2deSPhilip Reames; CHECK-NEXT: store i32 -33, ptr [[INC1]], align 2 24102bfe2deSPhilip Reames; CHECK-NEXT: [[INC2:%.*]] = getelementptr inbounds i32, ptr [[DEST]], i64 2 24202bfe2deSPhilip Reames; CHECK-NEXT: store i32 44, ptr [[INC2]], align 2 24302bfe2deSPhilip Reames; CHECK-NEXT: [[INC3:%.*]] = getelementptr inbounds i32, ptr [[DEST]], i64 3 24402bfe2deSPhilip Reames; CHECK-NEXT: store i32 77, ptr [[INC3]], align 2 24517f2ee80SPhilip Reames; CHECK-NEXT: ret void 24617f2ee80SPhilip Reames; 24717f2ee80SPhilip Reames; DEFAULT-LABEL: @store_arbitrary_constant_i32( 24817f2ee80SPhilip Reames; DEFAULT-NEXT: entry: 24917f2ee80SPhilip Reames; DEFAULT-NEXT: store i32 0, ptr [[DEST:%.*]], align 4 25017f2ee80SPhilip Reames; DEFAULT-NEXT: [[INC1:%.*]] = getelementptr inbounds i32, ptr [[DEST]], i64 1 25117f2ee80SPhilip Reames; DEFAULT-NEXT: store i32 -33, ptr [[INC1]], align 2 25217f2ee80SPhilip Reames; DEFAULT-NEXT: [[INC2:%.*]] = getelementptr inbounds i32, ptr [[DEST]], i64 2 25317f2ee80SPhilip Reames; DEFAULT-NEXT: store i32 44, ptr [[INC2]], align 2 25417f2ee80SPhilip Reames; DEFAULT-NEXT: [[INC3:%.*]] = getelementptr inbounds i32, ptr [[DEST]], i64 3 25517f2ee80SPhilip Reames; DEFAULT-NEXT: store i32 77, ptr [[INC3]], align 2 25617f2ee80SPhilip Reames; DEFAULT-NEXT: ret void 25717f2ee80SPhilip Reames; 25817f2ee80SPhilip Reamesentry: 25917f2ee80SPhilip Reames store i32 0, ptr %dest, align 4 26017f2ee80SPhilip Reames %inc1 = getelementptr inbounds i32, ptr %dest, i64 1 26117f2ee80SPhilip Reames store i32 -33, ptr %inc1, align 2 26217f2ee80SPhilip Reames %inc2 = getelementptr inbounds i32, ptr %dest, i64 2 26317f2ee80SPhilip Reames store i32 44, ptr %inc2, align 2 26417f2ee80SPhilip Reames %inc3 = getelementptr inbounds i32, ptr %dest, i64 3 26517f2ee80SPhilip Reames store i32 77, ptr %inc3, align 2 26617f2ee80SPhilip Reames ret void 26717f2ee80SPhilip Reames} 268