xref: /llvm-project/llvm/test/Transforms/SLPVectorizer/RISCV/getpointerschaincost.ll (revision 38fffa630ee80163dc65e759392ad29798905679)
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