Skip to content

Commit c0c56f4

Browse files
authored
[SLP][NFC] Add precommit test for unprofitable ordered fadd reductions (llvm#199428)
Adds a test case reproducing a scenario where the cost model incorrectly evaluates an unprofitable ordered fadd reduction chain as profitable. Further details can be found on this issue: llvm#199267
1 parent 852a20e commit c0c56f4

1 file changed

Lines changed: 78 additions & 0 deletions

File tree

Lines changed: 78 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,78 @@
1+
; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --version 6
2+
; RUN: opt -S --passes=slp-vectorizer -mtriple=riscv64-unknown-linux-gnu -mattr="+v" < %s | FileCheck %s
3+
4+
target triple = "riscv64-unknown-linux-gnu"
5+
6+
define void @test1(ptr %arrayidx.i60, ptr %24, ptr %arrayidx44.i61, double %.pre117.i70, double %.pre116.i68, double %.pre115.i67, double %.pre114.i65, double %.pre113.i64, double %.pre.i62) {
7+
; CHECK-LABEL: define void @test1(
8+
; CHECK-SAME: ptr [[ARRAYIDX_I60:%.*]], ptr [[TMP0:%.*]], ptr [[ARRAYIDX44_I61:%.*]], double [[DOTPRE117_I70:%.*]], double [[DOTPRE116_I68:%.*]], double [[DOTPRE115_I67:%.*]], double [[DOTPRE114_I65:%.*]], double [[DOTPRE113_I64:%.*]], double [[DOTPRE_I62:%.*]]) #[[ATTR0:[0-9]+]] {
9+
; CHECK-NEXT: [[FOR_COND_PREHEADER:.*]]:
10+
; CHECK-NEXT: br label %[[FOR_BODY:.*]]
11+
; CHECK: [[FOR_BODY]]:
12+
; CHECK-NEXT: [[TMP1:%.*]] = phi double [ [[DOTPRE117_I70]], %[[FOR_COND_PREHEADER]] ], [ [[TMP9:%.*]], %[[FOR_BODY]] ]
13+
; CHECK-NEXT: [[TMP2:%.*]] = phi double [ [[DOTPRE116_I68]], %[[FOR_COND_PREHEADER]] ], [ [[TMP1]], %[[FOR_BODY]] ]
14+
; CHECK-NEXT: [[TMP3:%.*]] = phi double [ [[DOTPRE115_I67]], %[[FOR_COND_PREHEADER]] ], [ [[TMP8:%.*]], %[[FOR_BODY]] ]
15+
; CHECK-NEXT: [[TMP4:%.*]] = phi double [ [[DOTPRE114_I65]], %[[FOR_COND_PREHEADER]] ], [ [[DIV_I86:%.*]], %[[FOR_BODY]] ]
16+
; CHECK-NEXT: [[TMP5:%.*]] = phi double [ [[DOTPRE113_I64]], %[[FOR_COND_PREHEADER]] ], [ [[TMP7:%.*]], %[[FOR_BODY]] ]
17+
; CHECK-NEXT: [[TMP6:%.*]] = phi double [ [[DOTPRE_I62]], %[[FOR_COND_PREHEADER]] ], [ [[TMP5]], %[[FOR_BODY]] ]
18+
; CHECK-NEXT: [[INDVARS_IV_I72:%.*]] = phi i64 [ 1, %[[FOR_COND_PREHEADER]] ], [ [[INDVARS_IV_NEXT_I74:%.*]], %[[FOR_BODY]] ]
19+
; CHECK-NEXT: [[ADD_I73:%.*]] = fadd double [[TMP5]], [[TMP6]]
20+
; CHECK-NEXT: [[INDVARS_IV_NEXT_I74]] = add nuw nsw i64 [[INDVARS_IV_I72]], 1
21+
; CHECK-NEXT: [[ARRAYIDX23_I75:%.*]] = getelementptr inbounds nuw [8 x i8], ptr [[ARRAYIDX_I60]], i64 [[INDVARS_IV_NEXT_I74]]
22+
; CHECK-NEXT: [[TMP7]] = load double, ptr [[ARRAYIDX23_I75]], align 8
23+
; CHECK-NEXT: [[ARRAYIDX34_I78:%.*]] = getelementptr inbounds nuw [8 x i8], ptr [[TMP0]], i64 [[INDVARS_IV_I72]]
24+
; CHECK-NEXT: [[ARRAYIDX40_I80:%.*]] = getelementptr inbounds nuw [8 x i8], ptr [[TMP0]], i64 [[INDVARS_IV_NEXT_I74]]
25+
; CHECK-NEXT: [[TMP8]] = load double, ptr [[ARRAYIDX40_I80]], align 8
26+
; CHECK-NEXT: [[ARRAYIDX60_I84:%.*]] = getelementptr inbounds nuw [8 x i8], ptr [[ARRAYIDX44_I61]], i64 [[INDVARS_IV_NEXT_I74]]
27+
; CHECK-NEXT: [[TMP9]] = load double, ptr [[ARRAYIDX60_I84]], align 8
28+
; CHECK-NEXT: [[TMP10:%.*]] = insertelement <8 x double> poison, double [[TMP7]], i32 0
29+
; CHECK-NEXT: [[TMP11:%.*]] = insertelement <8 x double> [[TMP10]], double [[ADD_I73]], i32 1
30+
; CHECK-NEXT: [[TMP12:%.*]] = insertelement <8 x double> [[TMP11]], double [[TMP4]], i32 2
31+
; CHECK-NEXT: [[TMP13:%.*]] = insertelement <8 x double> [[TMP12]], double [[TMP3]], i32 3
32+
; CHECK-NEXT: [[TMP14:%.*]] = insertelement <8 x double> [[TMP13]], double [[TMP8]], i32 4
33+
; CHECK-NEXT: [[TMP15:%.*]] = insertelement <8 x double> [[TMP14]], double [[TMP2]], i32 5
34+
; CHECK-NEXT: [[TMP16:%.*]] = insertelement <8 x double> [[TMP15]], double [[TMP1]], i32 6
35+
; CHECK-NEXT: [[TMP17:%.*]] = insertelement <8 x double> [[TMP16]], double [[TMP9]], i32 7
36+
; CHECK-NEXT: [[TMP18:%.*]] = call double @llvm.vector.reduce.fadd.v8f64(double -0.000000e+00, <8 x double> [[TMP17]])
37+
; CHECK-NEXT: [[DIV_I86]] = fdiv double [[TMP18]], 9.000000e+00
38+
; CHECK-NEXT: store double [[DIV_I86]], ptr [[ARRAYIDX34_I78]], align 8
39+
; CHECK-NEXT: [[EXITCOND_NOT_I87:%.*]] = icmp eq i64 [[INDVARS_IV_NEXT_I74]], 1999
40+
; CHECK-NEXT: br i1 [[EXITCOND_NOT_I87]], label %[[FOR_END:.*]], label %[[FOR_BODY]]
41+
; CHECK: [[FOR_END]]:
42+
; CHECK-NEXT: ret void
43+
;
44+
for.cond.preheader:
45+
br label %for.body
46+
47+
for.body:
48+
%25 = phi double [ %.pre117.i70, %for.cond.preheader ], [ %33, %for.body ]
49+
%26 = phi double [ %.pre116.i68, %for.cond.preheader ], [ %25, %for.body ]
50+
%27 = phi double [ %.pre115.i67, %for.cond.preheader ], [ %32, %for.body ]
51+
%28 = phi double [ %.pre114.i65, %for.cond.preheader ], [ %div.i86, %for.body ]
52+
%29 = phi double [ %.pre113.i64, %for.cond.preheader ], [ %31, %for.body ]
53+
%30 = phi double [ %.pre.i62, %for.cond.preheader ], [ %29, %for.body ]
54+
%indvars.iv.i72 = phi i64 [ 1, %for.cond.preheader ], [ %indvars.iv.next.i74, %for.body ]
55+
%add.i73 = fadd double %29, %30
56+
%indvars.iv.next.i74 = add nuw nsw i64 %indvars.iv.i72, 1
57+
%arrayidx23.i75 = getelementptr inbounds nuw [8 x i8], ptr %arrayidx.i60, i64 %indvars.iv.next.i74
58+
%31 = load double, ptr %arrayidx23.i75, align 8
59+
%add24.i76 = fadd double %add.i73, %31
60+
%add30.i77 = fadd double %28, %add24.i76
61+
%arrayidx34.i78 = getelementptr inbounds nuw [8 x i8], ptr %24, i64 %indvars.iv.i72
62+
%add35.i79 = fadd double %27, %add30.i77
63+
%arrayidx40.i80 = getelementptr inbounds nuw [8 x i8], ptr %24, i64 %indvars.iv.next.i74
64+
%32 = load double, ptr %arrayidx40.i80, align 8
65+
%add41.i81 = fadd double %32, %add35.i79
66+
%add48.i82 = fadd double %26, %add41.i81
67+
%add54.i83 = fadd double %25, %add48.i82
68+
%arrayidx60.i84 = getelementptr inbounds nuw [8 x i8], ptr %arrayidx44.i61, i64 %indvars.iv.next.i74
69+
%33 = load double, ptr %arrayidx60.i84, align 8
70+
%add61.i85 = fadd double %33, %add54.i83
71+
%div.i86 = fdiv double %add61.i85, 9.000000e+00
72+
store double %div.i86, ptr %arrayidx34.i78, align 8
73+
%exitcond.not.i87 = icmp eq i64 %indvars.iv.next.i74, 1999
74+
br i1 %exitcond.not.i87, label %for.end, label %for.body
75+
76+
for.end:
77+
ret void
78+
}

0 commit comments

Comments
 (0)