153afdb71SLuke Lau; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --version 2 253afdb71SLuke Lau; RUN: opt -S -mtriple=riscv64 -mattr=+v -riscv-v-slp-max-vf=0 -passes=slp-vectorizer -pass-remarks-output=%t < %s | FileCheck %s 353afdb71SLuke Lau; RUN: FileCheck --input-file=%t --check-prefix=YAML %s 453afdb71SLuke Lau 553afdb71SLuke Lau; Because all of these addresses are foldable, the scalar cost should be 0 when 653afdb71SLuke Lau; computing the pointers chain cost. 753afdb71SLuke Lau; 853afdb71SLuke Lau; TODO: These are currently costed as free the indices are all constants, but we 953afdb71SLuke Lau; should check if the constants are actually foldable 1053afdb71SLuke Laudefine void @f(ptr %dest, i64 %i) { 1153afdb71SLuke Lau; CHECK-LABEL: define void @f 1253afdb71SLuke Lau; CHECK-SAME: (ptr [[DEST:%.*]], i64 [[I:%.*]]) #[[ATTR0:[0-9]+]] { 1353afdb71SLuke Lau; CHECK-NEXT: entry: 1453afdb71SLuke Lau; CHECK-NEXT: [[P1:%.*]] = getelementptr i32, ptr [[DEST]], i32 0 15*38fffa63SPaul Walker; CHECK-NEXT: store <4 x i32> splat (i32 1), ptr [[P1]], align 4 1653afdb71SLuke Lau; CHECK-NEXT: ret void 1753afdb71SLuke Lau; 1853afdb71SLuke Lauentry: 1953afdb71SLuke Lau; YAML: Pass: slp-vectorizer 2053afdb71SLuke Lau; YAML-NEXT: Name: StoresVectorized 2153afdb71SLuke Lau; YAML-NEXT: Function: f 2253afdb71SLuke Lau; YAML-NEXT: Args: 2353afdb71SLuke Lau; YAML-NEXT: - String: 'Stores SLP vectorized with cost ' 2453afdb71SLuke Lau; YAML-NEXT: - Cost: '-2' 2553afdb71SLuke Lau; YAML-NEXT: - String: ' and with tree size ' 2653afdb71SLuke Lau; YAML-NEXT: - TreeSize: '2' 2753afdb71SLuke Lau %p1 = getelementptr i32, ptr %dest, i32 0 2853afdb71SLuke Lau store i32 1, ptr %p1 2953afdb71SLuke Lau %p2 = getelementptr i32, ptr %dest, i32 1 3053afdb71SLuke Lau store i32 1, ptr %p2 3153afdb71SLuke Lau %p3 = getelementptr i32, ptr %dest, i32 2 3253afdb71SLuke Lau store i32 1, ptr %p3 3353afdb71SLuke Lau %p4 = getelementptr i32, ptr %dest, i32 3 3453afdb71SLuke Lau store i32 1, ptr %p4 3553afdb71SLuke Lau ret void 3653afdb71SLuke Lau} 3753afdb71SLuke Lau 3853afdb71SLuke Lau; When computing the scalar pointers chain cost here, there is a cost of 1 for 3953afdb71SLuke Lau; the base pointer, and the rest can be folded in, so the scalar cost should be 4053afdb71SLuke Lau; 1. 4153afdb71SLuke Lau; 4253afdb71SLuke Lau; TODO: These are currently costed as free the indices are all constants, but we 4353afdb71SLuke Lau; should check if the constants are actually foldable 4453afdb71SLuke Laudefine void @g(ptr %dest, i64 %i) { 4553afdb71SLuke Lau; CHECK-LABEL: define void @g 4653afdb71SLuke Lau; CHECK-SAME: (ptr [[DEST:%.*]], i64 [[I:%.*]]) #[[ATTR0]] { 4753afdb71SLuke Lau; CHECK-NEXT: entry: 4853afdb71SLuke Lau; CHECK-NEXT: [[P1:%.*]] = getelementptr i32, ptr [[DEST]], i32 2048 49*38fffa63SPaul Walker; CHECK-NEXT: store <4 x i32> splat (i32 1), ptr [[P1]], align 4 5053afdb71SLuke Lau; CHECK-NEXT: ret void 5153afdb71SLuke Lau; 5253afdb71SLuke Lauentry: 5353afdb71SLuke Lau; YAML: Pass: slp-vectorizer 5453afdb71SLuke Lau; YAML-NEXT: Name: StoresVectorized 5553afdb71SLuke Lau; YAML-NEXT: Function: g 5653afdb71SLuke Lau; YAML-NEXT: Args: 5753afdb71SLuke Lau; YAML-NEXT: - String: 'Stores SLP vectorized with cost ' 5853afdb71SLuke Lau; YAML-NEXT: - Cost: '-2' 5953afdb71SLuke Lau; YAML-NEXT: - String: ' and with tree size ' 6053afdb71SLuke Lau; YAML-NEXT: - TreeSize: '2' 6153afdb71SLuke Lau %p1 = getelementptr i32, ptr %dest, i32 2048 6253afdb71SLuke Lau store i32 1, ptr %p1 6353afdb71SLuke Lau %p2 = getelementptr i32, ptr %dest, i32 2049 6453afdb71SLuke Lau store i32 1, ptr %p2 6553afdb71SLuke Lau %p3 = getelementptr i32, ptr %dest, i32 2050 6653afdb71SLuke Lau store i32 1, ptr %p3 6753afdb71SLuke Lau %p4 = getelementptr i32, ptr %dest, i32 2051 6853afdb71SLuke Lau store i32 1, ptr %p4 6953afdb71SLuke Lau ret void 7053afdb71SLuke Lau} 7153afdb71SLuke Lau 72c27a0b21SLuke Lau; When computing the scalar pointers chain cost here, there is a cost of 7353afdb71SLuke Lau; 1 for the base pointer, and the rest can be folded in, so the scalar cost 7453afdb71SLuke Lau; should be 1. 7553afdb71SLuke Laudefine void @h(ptr %dest, i32 %i) { 7653afdb71SLuke Lau; CHECK-LABEL: define void @h 7753afdb71SLuke Lau; CHECK-SAME: (ptr [[DEST:%.*]], i32 [[I:%.*]]) #[[ATTR0]] { 7853afdb71SLuke Lau; CHECK-NEXT: entry: 7953afdb71SLuke Lau; CHECK-NEXT: [[P1:%.*]] = getelementptr [4 x i32], ptr [[DEST]], i32 [[I]], i32 0 80*38fffa63SPaul Walker; CHECK-NEXT: store <4 x i32> splat (i32 1), ptr [[P1]], align 4 8153afdb71SLuke Lau; CHECK-NEXT: ret void 8253afdb71SLuke Lau; 8353afdb71SLuke Lauentry: 8453afdb71SLuke Lau; YAML: Pass: slp-vectorizer 8553afdb71SLuke Lau; YAML-NEXT: Name: StoresVectorized 8653afdb71SLuke Lau; YAML-NEXT: Function: h 8753afdb71SLuke Lau; YAML-NEXT: Args: 8853afdb71SLuke Lau; YAML-NEXT: - String: 'Stores SLP vectorized with cost ' 89c27a0b21SLuke Lau; YAML-NEXT: - Cost: '-2' 9053afdb71SLuke Lau; YAML-NEXT: - String: ' and with tree size ' 9153afdb71SLuke Lau; YAML-NEXT: - TreeSize: '2' 9253afdb71SLuke Lau %p1 = getelementptr [4 x i32], ptr %dest, i32 %i, i32 0 9353afdb71SLuke Lau store i32 1, ptr %p1 9453afdb71SLuke Lau %p2 = getelementptr [4 x i32], ptr %dest, i32 %i, i32 1 9553afdb71SLuke Lau store i32 1, ptr %p2 9653afdb71SLuke Lau %p3 = getelementptr [4 x i32], ptr %dest, i32 %i, i32 2 9753afdb71SLuke Lau store i32 1, ptr %p3 9853afdb71SLuke Lau %p4 = getelementptr [4 x i32], ptr %dest, i32 %i, i32 3 9953afdb71SLuke Lau store i32 1, ptr %p4 10053afdb71SLuke Lau ret void 10153afdb71SLuke Lau} 102