[llvm] [SLP][NFC]Add tests for fptrunc-fpext-based reductions, NFC (PR #215534)
via llvm-commits
llvm-commits at lists.llvm.org
Tue Aug 11 05:16:44 PDT 2026
llvmorg-github-actions[bot] wrote:
<!--LLVM PR SUMMARY COMMENT-->
@llvm/pr-subscribers-llvm-transforms
Author: Alexey Bataev (alexey-bataev)
<details>
<summary>Changes</summary>
---
Patch is 30.98 KiB, truncated to 20.00 KiB below, full version: https://github.com/llvm/llvm-project/pull/215534.diff
2 Files Affected:
- (modified) llvm/test/Transforms/SLPVectorizer/X86/reduction-fadd-reassoc.ll (+332)
- (modified) llvm/test/Transforms/SLPVectorizer/X86/reduction-ordered-fadd.ll (+243)
``````````diff
diff --git a/llvm/test/Transforms/SLPVectorizer/X86/reduction-fadd-reassoc.ll b/llvm/test/Transforms/SLPVectorizer/X86/reduction-fadd-reassoc.ll
index 9cd95683d0264..e2af602cc86cd 100644
--- a/llvm/test/Transforms/SLPVectorizer/X86/reduction-fadd-reassoc.ll
+++ b/llvm/test/Transforms/SLPVectorizer/X86/reduction-fadd-reassoc.ll
@@ -113,3 +113,335 @@ entry:
%c7 = fadd double %c6, %l7
ret double %c7
}
+
+define double @fadd_fptrunc_fpext_links_fast(ptr %x) {
+; CHECK-LABEL: define double @fadd_fptrunc_fpext_links_fast(
+; CHECK-SAME: ptr [[X:%.*]]) #[[ATTR0]] {
+; CHECK-NEXT: [[TMP2:%.*]] = load double, ptr [[X]], align 8
+; CHECK-NEXT: [[OP_RDX:%.*]] = fadd fast double [[TMP2]], 1.000000e+00
+; CHECK-NEXT: [[T15:%.*]] = fptrunc fast double [[OP_RDX]] to float
+; CHECK-NEXT: [[E15:%.*]] = fpext fast float [[T15]] to double
+; CHECK-NEXT: [[P1:%.*]] = getelementptr inbounds i8, ptr [[X]], i64 8
+; CHECK-NEXT: [[L1:%.*]] = load double, ptr [[P1]], align 8
+; CHECK-NEXT: [[A1:%.*]] = fadd fast double [[L1]], [[E15]]
+; CHECK-NEXT: [[T1:%.*]] = fptrunc fast double [[A1]] to float
+; CHECK-NEXT: [[E1:%.*]] = fpext fast float [[T1]] to double
+; CHECK-NEXT: [[P2:%.*]] = getelementptr inbounds i8, ptr [[X]], i64 16
+; CHECK-NEXT: [[L2:%.*]] = load double, ptr [[P2]], align 8
+; CHECK-NEXT: [[A2:%.*]] = fadd fast double [[L2]], [[E1]]
+; CHECK-NEXT: [[T2:%.*]] = fptrunc fast double [[A2]] to float
+; CHECK-NEXT: [[E2:%.*]] = fpext fast float [[T2]] to double
+; CHECK-NEXT: [[P3:%.*]] = getelementptr inbounds i8, ptr [[X]], i64 24
+; CHECK-NEXT: [[L3:%.*]] = load double, ptr [[P3]], align 8
+; CHECK-NEXT: [[A3:%.*]] = fadd fast double [[L3]], [[E2]]
+; CHECK-NEXT: [[T3:%.*]] = fptrunc fast double [[A3]] to float
+; CHECK-NEXT: [[E3:%.*]] = fpext fast float [[T3]] to double
+; CHECK-NEXT: [[P4:%.*]] = getelementptr inbounds i8, ptr [[X]], i64 32
+; CHECK-NEXT: [[L4:%.*]] = load double, ptr [[P4]], align 8
+; CHECK-NEXT: [[A4:%.*]] = fadd fast double [[L4]], [[E3]]
+; CHECK-NEXT: [[T4:%.*]] = fptrunc fast double [[A4]] to float
+; CHECK-NEXT: [[E4:%.*]] = fpext fast float [[T4]] to double
+; CHECK-NEXT: [[P5:%.*]] = getelementptr inbounds i8, ptr [[X]], i64 40
+; CHECK-NEXT: [[L5:%.*]] = load double, ptr [[P5]], align 8
+; CHECK-NEXT: [[A5:%.*]] = fadd fast double [[L5]], [[E4]]
+; CHECK-NEXT: [[T5:%.*]] = fptrunc fast double [[A5]] to float
+; CHECK-NEXT: [[E5:%.*]] = fpext fast float [[T5]] to double
+; CHECK-NEXT: [[P6:%.*]] = getelementptr inbounds i8, ptr [[X]], i64 48
+; CHECK-NEXT: [[L6:%.*]] = load double, ptr [[P6]], align 8
+; CHECK-NEXT: [[A6:%.*]] = fadd fast double [[L6]], [[E5]]
+; CHECK-NEXT: [[T6:%.*]] = fptrunc fast double [[A6]] to float
+; CHECK-NEXT: [[E6:%.*]] = fpext fast float [[T6]] to double
+; CHECK-NEXT: [[P7:%.*]] = getelementptr inbounds i8, ptr [[X]], i64 56
+; CHECK-NEXT: [[L7:%.*]] = load double, ptr [[P7]], align 8
+; CHECK-NEXT: [[A7:%.*]] = fadd fast double [[L7]], [[E6]]
+; CHECK-NEXT: [[T7:%.*]] = fptrunc fast double [[A7]] to float
+; CHECK-NEXT: [[E7:%.*]] = fpext fast float [[T7]] to double
+; CHECK-NEXT: [[P8:%.*]] = getelementptr inbounds i8, ptr [[X]], i64 64
+; CHECK-NEXT: [[L8:%.*]] = load double, ptr [[P8]], align 8
+; CHECK-NEXT: [[A8:%.*]] = fadd fast double [[L8]], [[E7]]
+; CHECK-NEXT: [[T8:%.*]] = fptrunc fast double [[A8]] to float
+; CHECK-NEXT: [[E8:%.*]] = fpext fast float [[T8]] to double
+; CHECK-NEXT: [[P9:%.*]] = getelementptr inbounds i8, ptr [[X]], i64 72
+; CHECK-NEXT: [[L9:%.*]] = load double, ptr [[P9]], align 8
+; CHECK-NEXT: [[A9:%.*]] = fadd fast double [[L9]], [[E8]]
+; CHECK-NEXT: [[T9:%.*]] = fptrunc fast double [[A9]] to float
+; CHECK-NEXT: [[E9:%.*]] = fpext fast float [[T9]] to double
+; CHECK-NEXT: [[P10:%.*]] = getelementptr inbounds i8, ptr [[X]], i64 80
+; CHECK-NEXT: [[L10:%.*]] = load double, ptr [[P10]], align 8
+; CHECK-NEXT: [[A10:%.*]] = fadd fast double [[L10]], [[E9]]
+; CHECK-NEXT: [[T10:%.*]] = fptrunc fast double [[A10]] to float
+; CHECK-NEXT: [[E10:%.*]] = fpext fast float [[T10]] to double
+; CHECK-NEXT: [[P11:%.*]] = getelementptr inbounds i8, ptr [[X]], i64 88
+; CHECK-NEXT: [[L11:%.*]] = load double, ptr [[P11]], align 8
+; CHECK-NEXT: [[A11:%.*]] = fadd fast double [[L11]], [[E10]]
+; CHECK-NEXT: [[T11:%.*]] = fptrunc fast double [[A11]] to float
+; CHECK-NEXT: [[E11:%.*]] = fpext fast float [[T11]] to double
+; CHECK-NEXT: [[P12:%.*]] = getelementptr inbounds i8, ptr [[X]], i64 96
+; CHECK-NEXT: [[L12:%.*]] = load double, ptr [[P12]], align 8
+; CHECK-NEXT: [[A12:%.*]] = fadd fast double [[L12]], [[E11]]
+; CHECK-NEXT: [[T12:%.*]] = fptrunc fast double [[A12]] to float
+; CHECK-NEXT: [[E12:%.*]] = fpext fast float [[T12]] to double
+; CHECK-NEXT: [[P13:%.*]] = getelementptr inbounds i8, ptr [[X]], i64 104
+; CHECK-NEXT: [[L13:%.*]] = load double, ptr [[P13]], align 8
+; CHECK-NEXT: [[A13:%.*]] = fadd fast double [[L13]], [[E12]]
+; CHECK-NEXT: [[T13:%.*]] = fptrunc fast double [[A13]] to float
+; CHECK-NEXT: [[E13:%.*]] = fpext fast float [[T13]] to double
+; CHECK-NEXT: [[P14:%.*]] = getelementptr inbounds i8, ptr [[X]], i64 112
+; CHECK-NEXT: [[L14:%.*]] = load double, ptr [[P14]], align 8
+; CHECK-NEXT: [[A14:%.*]] = fadd fast double [[L14]], [[E13]]
+; CHECK-NEXT: [[T14:%.*]] = fptrunc fast double [[A14]] to float
+; CHECK-NEXT: [[E14:%.*]] = fpext fast float [[T14]] to double
+; CHECK-NEXT: [[P15:%.*]] = getelementptr inbounds i8, ptr [[X]], i64 120
+; CHECK-NEXT: [[L15:%.*]] = load double, ptr [[P15]], align 8
+; CHECK-NEXT: [[A15:%.*]] = fadd fast double [[L15]], [[E14]]
+; CHECK-NEXT: [[T16:%.*]] = fptrunc fast double [[A15]] to float
+; CHECK-NEXT: [[E16:%.*]] = fpext fast float [[T16]] to double
+; CHECK-NEXT: ret double [[E16]]
+;
+ %l0 = load double, ptr %x, align 8
+ %a0 = fadd fast double %l0, 1.000000e+00
+ %t0 = fptrunc fast double %a0 to float
+ %e0 = fpext fast float %t0 to double
+ %p1 = getelementptr inbounds i8, ptr %x, i64 8
+ %l1 = load double, ptr %p1, align 8
+ %a1 = fadd fast double %l1, %e0
+ %t1 = fptrunc fast double %a1 to float
+ %e1 = fpext fast float %t1 to double
+ %p2 = getelementptr inbounds i8, ptr %x, i64 16
+ %l2 = load double, ptr %p2, align 8
+ %a2 = fadd fast double %l2, %e1
+ %t2 = fptrunc fast double %a2 to float
+ %e2 = fpext fast float %t2 to double
+ %p3 = getelementptr inbounds i8, ptr %x, i64 24
+ %l3 = load double, ptr %p3, align 8
+ %a3 = fadd fast double %l3, %e2
+ %t3 = fptrunc fast double %a3 to float
+ %e3 = fpext fast float %t3 to double
+ %p4 = getelementptr inbounds i8, ptr %x, i64 32
+ %l4 = load double, ptr %p4, align 8
+ %a4 = fadd fast double %l4, %e3
+ %t4 = fptrunc fast double %a4 to float
+ %e4 = fpext fast float %t4 to double
+ %p5 = getelementptr inbounds i8, ptr %x, i64 40
+ %l5 = load double, ptr %p5, align 8
+ %a5 = fadd fast double %l5, %e4
+ %t5 = fptrunc fast double %a5 to float
+ %e5 = fpext fast float %t5 to double
+ %p6 = getelementptr inbounds i8, ptr %x, i64 48
+ %l6 = load double, ptr %p6, align 8
+ %a6 = fadd fast double %l6, %e5
+ %t6 = fptrunc fast double %a6 to float
+ %e6 = fpext fast float %t6 to double
+ %p7 = getelementptr inbounds i8, ptr %x, i64 56
+ %l7 = load double, ptr %p7, align 8
+ %a7 = fadd fast double %l7, %e6
+ %t7 = fptrunc fast double %a7 to float
+ %e7 = fpext fast float %t7 to double
+ %p8 = getelementptr inbounds i8, ptr %x, i64 64
+ %l8 = load double, ptr %p8, align 8
+ %a8 = fadd fast double %l8, %e7
+ %t8 = fptrunc fast double %a8 to float
+ %e8 = fpext fast float %t8 to double
+ %p9 = getelementptr inbounds i8, ptr %x, i64 72
+ %l9 = load double, ptr %p9, align 8
+ %a9 = fadd fast double %l9, %e8
+ %t9 = fptrunc fast double %a9 to float
+ %e9 = fpext fast float %t9 to double
+ %p10 = getelementptr inbounds i8, ptr %x, i64 80
+ %l10 = load double, ptr %p10, align 8
+ %a10 = fadd fast double %l10, %e9
+ %t10 = fptrunc fast double %a10 to float
+ %e10 = fpext fast float %t10 to double
+ %p11 = getelementptr inbounds i8, ptr %x, i64 88
+ %l11 = load double, ptr %p11, align 8
+ %a11 = fadd fast double %l11, %e10
+ %t11 = fptrunc fast double %a11 to float
+ %e11 = fpext fast float %t11 to double
+ %p12 = getelementptr inbounds i8, ptr %x, i64 96
+ %l12 = load double, ptr %p12, align 8
+ %a12 = fadd fast double %l12, %e11
+ %t12 = fptrunc fast double %a12 to float
+ %e12 = fpext fast float %t12 to double
+ %p13 = getelementptr inbounds i8, ptr %x, i64 104
+ %l13 = load double, ptr %p13, align 8
+ %a13 = fadd fast double %l13, %e12
+ %t13 = fptrunc fast double %a13 to float
+ %e13 = fpext fast float %t13 to double
+ %p14 = getelementptr inbounds i8, ptr %x, i64 112
+ %l14 = load double, ptr %p14, align 8
+ %a14 = fadd fast double %l14, %e13
+ %t14 = fptrunc fast double %a14 to float
+ %e14 = fpext fast float %t14 to double
+ %p15 = getelementptr inbounds i8, ptr %x, i64 120
+ %l15 = load double, ptr %p15, align 8
+ %a15 = fadd fast double %l15, %e14
+ %t15 = fptrunc fast double %a15 to float
+ %e15 = fpext fast float %t15 to double
+ ret double %e15
+}
+
+define double @fadd_fptrunc_fpext_links_no_contract(ptr %x) {
+; CHECK-LABEL: define double @fadd_fptrunc_fpext_links_no_contract(
+; CHECK-SAME: ptr [[X:%.*]]) #[[ATTR0]] {
+; CHECK-NEXT: [[L0:%.*]] = load double, ptr [[X]], align 8
+; CHECK-NEXT: [[A0:%.*]] = fadd fast double [[L0]], 1.000000e+00
+; CHECK-NEXT: [[T0:%.*]] = fptrunc nnan ninf double [[A0]] to float
+; CHECK-NEXT: [[E0:%.*]] = fpext nnan ninf float [[T0]] to double
+; CHECK-NEXT: [[P1:%.*]] = getelementptr inbounds i8, ptr [[X]], i64 8
+; CHECK-NEXT: [[L1:%.*]] = load double, ptr [[P1]], align 8
+; CHECK-NEXT: [[A1:%.*]] = fadd fast double [[L1]], [[E0]]
+; CHECK-NEXT: [[T1:%.*]] = fptrunc nnan ninf double [[A1]] to float
+; CHECK-NEXT: [[E1:%.*]] = fpext nnan ninf float [[T1]] to double
+; CHECK-NEXT: [[P2:%.*]] = getelementptr inbounds i8, ptr [[X]], i64 16
+; CHECK-NEXT: [[L2:%.*]] = load double, ptr [[P2]], align 8
+; CHECK-NEXT: [[A2:%.*]] = fadd fast double [[L2]], [[E1]]
+; CHECK-NEXT: [[T2:%.*]] = fptrunc nnan ninf double [[A2]] to float
+; CHECK-NEXT: [[E2:%.*]] = fpext nnan ninf float [[T2]] to double
+; CHECK-NEXT: [[P3:%.*]] = getelementptr inbounds i8, ptr [[X]], i64 24
+; CHECK-NEXT: [[L3:%.*]] = load double, ptr [[P3]], align 8
+; CHECK-NEXT: [[A3:%.*]] = fadd fast double [[L3]], [[E2]]
+; CHECK-NEXT: [[T3:%.*]] = fptrunc nnan ninf double [[A3]] to float
+; CHECK-NEXT: [[E3:%.*]] = fpext nnan ninf float [[T3]] to double
+; CHECK-NEXT: [[P4:%.*]] = getelementptr inbounds i8, ptr [[X]], i64 32
+; CHECK-NEXT: [[L4:%.*]] = load double, ptr [[P4]], align 8
+; CHECK-NEXT: [[A4:%.*]] = fadd fast double [[L4]], [[E3]]
+; CHECK-NEXT: [[T4:%.*]] = fptrunc nnan ninf double [[A4]] to float
+; CHECK-NEXT: [[E4:%.*]] = fpext nnan ninf float [[T4]] to double
+; CHECK-NEXT: [[P5:%.*]] = getelementptr inbounds i8, ptr [[X]], i64 40
+; CHECK-NEXT: [[L5:%.*]] = load double, ptr [[P5]], align 8
+; CHECK-NEXT: [[A5:%.*]] = fadd fast double [[L5]], [[E4]]
+; CHECK-NEXT: [[T5:%.*]] = fptrunc nnan ninf double [[A5]] to float
+; CHECK-NEXT: [[E5:%.*]] = fpext nnan ninf float [[T5]] to double
+; CHECK-NEXT: [[P6:%.*]] = getelementptr inbounds i8, ptr [[X]], i64 48
+; CHECK-NEXT: [[L6:%.*]] = load double, ptr [[P6]], align 8
+; CHECK-NEXT: [[A6:%.*]] = fadd fast double [[L6]], [[E5]]
+; CHECK-NEXT: [[T6:%.*]] = fptrunc nnan ninf double [[A6]] to float
+; CHECK-NEXT: [[E6:%.*]] = fpext nnan ninf float [[T6]] to double
+; CHECK-NEXT: [[P7:%.*]] = getelementptr inbounds i8, ptr [[X]], i64 56
+; CHECK-NEXT: [[L7:%.*]] = load double, ptr [[P7]], align 8
+; CHECK-NEXT: [[A7:%.*]] = fadd fast double [[L7]], [[E6]]
+; CHECK-NEXT: [[T7:%.*]] = fptrunc nnan ninf double [[A7]] to float
+; CHECK-NEXT: [[E7:%.*]] = fpext nnan ninf float [[T7]] to double
+; CHECK-NEXT: [[P8:%.*]] = getelementptr inbounds i8, ptr [[X]], i64 64
+; CHECK-NEXT: [[L8:%.*]] = load double, ptr [[P8]], align 8
+; CHECK-NEXT: [[A8:%.*]] = fadd fast double [[L8]], [[E7]]
+; CHECK-NEXT: [[T8:%.*]] = fptrunc nnan ninf double [[A8]] to float
+; CHECK-NEXT: [[E8:%.*]] = fpext nnan ninf float [[T8]] to double
+; CHECK-NEXT: [[P9:%.*]] = getelementptr inbounds i8, ptr [[X]], i64 72
+; CHECK-NEXT: [[L9:%.*]] = load double, ptr [[P9]], align 8
+; CHECK-NEXT: [[A9:%.*]] = fadd fast double [[L9]], [[E8]]
+; CHECK-NEXT: [[T9:%.*]] = fptrunc nnan ninf double [[A9]] to float
+; CHECK-NEXT: [[E9:%.*]] = fpext nnan ninf float [[T9]] to double
+; CHECK-NEXT: [[P10:%.*]] = getelementptr inbounds i8, ptr [[X]], i64 80
+; CHECK-NEXT: [[L10:%.*]] = load double, ptr [[P10]], align 8
+; CHECK-NEXT: [[A10:%.*]] = fadd fast double [[L10]], [[E9]]
+; CHECK-NEXT: [[T10:%.*]] = fptrunc nnan ninf double [[A10]] to float
+; CHECK-NEXT: [[E10:%.*]] = fpext nnan ninf float [[T10]] to double
+; CHECK-NEXT: [[P11:%.*]] = getelementptr inbounds i8, ptr [[X]], i64 88
+; CHECK-NEXT: [[L11:%.*]] = load double, ptr [[P11]], align 8
+; CHECK-NEXT: [[A11:%.*]] = fadd fast double [[L11]], [[E10]]
+; CHECK-NEXT: [[T11:%.*]] = fptrunc nnan ninf double [[A11]] to float
+; CHECK-NEXT: [[E11:%.*]] = fpext nnan ninf float [[T11]] to double
+; CHECK-NEXT: [[P12:%.*]] = getelementptr inbounds i8, ptr [[X]], i64 96
+; CHECK-NEXT: [[L12:%.*]] = load double, ptr [[P12]], align 8
+; CHECK-NEXT: [[A12:%.*]] = fadd fast double [[L12]], [[E11]]
+; CHECK-NEXT: [[T12:%.*]] = fptrunc nnan ninf double [[A12]] to float
+; CHECK-NEXT: [[E12:%.*]] = fpext nnan ninf float [[T12]] to double
+; CHECK-NEXT: [[P13:%.*]] = getelementptr inbounds i8, ptr [[X]], i64 104
+; CHECK-NEXT: [[L13:%.*]] = load double, ptr [[P13]], align 8
+; CHECK-NEXT: [[A13:%.*]] = fadd fast double [[L13]], [[E12]]
+; CHECK-NEXT: [[T13:%.*]] = fptrunc nnan ninf double [[A13]] to float
+; CHECK-NEXT: [[E13:%.*]] = fpext nnan ninf float [[T13]] to double
+; CHECK-NEXT: [[P14:%.*]] = getelementptr inbounds i8, ptr [[X]], i64 112
+; CHECK-NEXT: [[L14:%.*]] = load double, ptr [[P14]], align 8
+; CHECK-NEXT: [[A14:%.*]] = fadd fast double [[L14]], [[E13]]
+; CHECK-NEXT: [[T14:%.*]] = fptrunc nnan ninf double [[A14]] to float
+; CHECK-NEXT: [[E14:%.*]] = fpext nnan ninf float [[T14]] to double
+; CHECK-NEXT: [[P15:%.*]] = getelementptr inbounds i8, ptr [[X]], i64 120
+; CHECK-NEXT: [[L15:%.*]] = load double, ptr [[P15]], align 8
+; CHECK-NEXT: [[A15:%.*]] = fadd fast double [[L15]], [[E14]]
+; CHECK-NEXT: [[T15:%.*]] = fptrunc nnan ninf double [[A15]] to float
+; CHECK-NEXT: [[E15:%.*]] = fpext nnan ninf float [[T15]] to double
+; CHECK-NEXT: ret double [[E15]]
+;
+ %l0 = load double, ptr %x, align 8
+ %a0 = fadd fast double %l0, 1.000000e+00
+ %t0 = fptrunc nnan ninf double %a0 to float
+ %e0 = fpext nnan ninf float %t0 to double
+ %p1 = getelementptr inbounds i8, ptr %x, i64 8
+ %l1 = load double, ptr %p1, align 8
+ %a1 = fadd fast double %l1, %e0
+ %t1 = fptrunc nnan ninf double %a1 to float
+ %e1 = fpext nnan ninf float %t1 to double
+ %p2 = getelementptr inbounds i8, ptr %x, i64 16
+ %l2 = load double, ptr %p2, align 8
+ %a2 = fadd fast double %l2, %e1
+ %t2 = fptrunc nnan ninf double %a2 to float
+ %e2 = fpext nnan ninf float %t2 to double
+ %p3 = getelementptr inbounds i8, ptr %x, i64 24
+ %l3 = load double, ptr %p3, align 8
+ %a3 = fadd fast double %l3, %e2
+ %t3 = fptrunc nnan ninf double %a3 to float
+ %e3 = fpext nnan ninf float %t3 to double
+ %p4 = getelementptr inbounds i8, ptr %x, i64 32
+ %l4 = load double, ptr %p4, align 8
+ %a4 = fadd fast double %l4, %e3
+ %t4 = fptrunc nnan ninf double %a4 to float
+ %e4 = fpext nnan ninf float %t4 to double
+ %p5 = getelementptr inbounds i8, ptr %x, i64 40
+ %l5 = load double, ptr %p5, align 8
+ %a5 = fadd fast double %l5, %e4
+ %t5 = fptrunc nnan ninf double %a5 to float
+ %e5 = fpext nnan ninf float %t5 to double
+ %p6 = getelementptr inbounds i8, ptr %x, i64 48
+ %l6 = load double, ptr %p6, align 8
+ %a6 = fadd fast double %l6, %e5
+ %t6 = fptrunc nnan ninf double %a6 to float
+ %e6 = fpext nnan ninf float %t6 to double
+ %p7 = getelementptr inbounds i8, ptr %x, i64 56
+ %l7 = load double, ptr %p7, align 8
+ %a7 = fadd fast double %l7, %e6
+ %t7 = fptrunc nnan ninf double %a7 to float
+ %e7 = fpext nnan ninf float %t7 to double
+ %p8 = getelementptr inbounds i8, ptr %x, i64 64
+ %l8 = load double, ptr %p8, align 8
+ %a8 = fadd fast double %l8, %e7
+ %t8 = fptrunc nnan ninf double %a8 to float
+ %e8 = fpext nnan ninf float %t8 to double
+ %p9 = getelementptr inbounds i8, ptr %x, i64 72
+ %l9 = load double, ptr %p9, align 8
+ %a9 = fadd fast double %l9, %e8
+ %t9 = fptrunc nnan ninf double %a9 to float
+ %e9 = fpext nnan ninf float %t9 to double
+ %p10 = getelementptr inbounds i8, ptr %x, i64 80
+ %l10 = load double, ptr %p10, align 8
+ %a10 = fadd fast double %l10, %e9
+ %t10 = fptrunc nnan ninf double %a10 to float
+ %e10 = fpext nnan ninf float %t10 to double
+ %p11 = getelementptr inbounds i8, ptr %x, i64 88
+ %l11 = load double, ptr %p11, align 8
+ %a11 = fadd fast double %l11, %e10
+ %t11 = fptrunc nnan ninf double %a11 to float
+ %e11 = fpext nnan ninf float %t11 to double
+ %p12 = getelementptr inbounds i8, ptr %x, i64 96
+ %l12 = load double, ptr %p12, align 8
+ %a12 = fadd fast double %l12, %e11
+ %t12 = fptrunc nnan ninf double %a12 to float
+ %e12 = fpext nnan ninf float %t12 to double
+ %p13 = getelementptr inbounds i8, ptr %x, i64 104
+ %l13 = load double, ptr %p13, align 8
+ %a13 = fadd fast double %l13, %e12
+ %t13 = fptrunc nnan ninf double %a13 to float
+ %e13 = fpext nnan ninf float %t13 to double
+ %p14 = getelementptr inbounds i8, ptr %x, i64 112
+ %l14 = load double, ptr %p14, align 8
+ %a14 = fadd fast double %l14, %e13
+ %t14 = fptrunc nnan ninf double %a14 to float
+ %e14 = fpext nnan ninf float %t14 to double
+ %p15 = getelementptr inbounds i8, ptr %x, i64 120
+ %l15 = load double, ptr %p15, align 8
+ %a15 = fadd fast double %l15, %e14
+ %t15 = fptrunc nnan ninf double %a15 to float
+ %e15 = fpext nnan ninf float %t15 to double
+ ret double %e15
+}
diff --git a/llvm/test/Transforms/SLPVectorizer/X86/reduction-ordered-fadd.ll b/llvm/test/Transforms/SLPVectorizer/X86/reduction-ordered-fadd.ll
index 0ce19e482d072..a0702a186f41b 100644
--- a/llvm/test/Transforms/SLPVectorizer/X86/reduction-ordered-fadd.ll
+++ b/llvm/test/Transforms/SLPVectorizer/X86/reduction-ordered-fadd.ll
@@ -163,3 +163,246 @@ entry:
%r6 = fadd reassoc float %r5, %l7
ret float %r6
}
+
+
+define double @ordered_fadd_fptrunc_fpext_links(ptr %x) {
+; CHECK-LABEL: define double @ordered_fadd_fptrunc_fpext_links(
+; CHECK-SAME: ptr [[X:%.*]]) #[[ATTR0]] {
+; CHECK-NEXT: [[L0:%.*]] = load double, ptr [[X]], align 8
+; CHECK-NEXT: [[A0:%.*]] = fadd double [[L0]], 1.000000e+00
+; CHECK-NEXT: [[T0:%.*]] = fptrunc double [[A0]] to float
+; CHECK-NEXT: [[TMP12:%.*]] = fpext float [[T0]] to double
+; CHECK-NEXT: [[P1:%.*]] = getelementptr inbounds i8, ptr [[X]], i64 8
+; CHECK-NEXT: [[TMP11:%.*]] = load double, ptr [[P1]], align 8
+; CHECK-NEXT: [[OP_RDX1:%.*]] = fadd double [[TMP11]], [[TMP12]]
+; CHECK-NEXT: [[TMP13:%.*]] = fptrunc double [[OP_RDX1]] to float
+; CHECK-NEXT: [[TMP15:%.*]] = fpext float [[TMP13]] to double
+; CHECK-NEXT: [[P2:%.*]] = getelementptr inbounds i8, ptr [[X]], i64 16
+; CHECK-NEXT: [[TMP14:%.*]] = load double, ptr [[P2]], align 8
+; CHECK-NEXT: [[OP_RDX2:%.*]] = fadd double [[TMP14]], [[TMP15]]
+; CHECK-NEXT: [[TMP16:%.*]] = fptrunc double [[OP_RDX2]] to float
+; CHECK-NEXT: [[TMP18:%.*]] = fpext float [[TMP16]] to double
+; CHECK-NEXT: [[P3:%.*]] = getelementptr inbounds i8, ptr [[X]], i64 24
+; CHECK-NEXT: [[TMP17:%.*]] = load double, ptr [[P3]], align 8
+; CHECK-NEXT: [[OP_RDX3:%.*]] = fadd double [[TMP17]], [[TMP18]]
+; CHECK-NEXT: [[TMP19:%.*]] = fptrunc double [[OP_RDX3]] to float
+; CHECK-NEXT: [[TMP21:%.*]] = fpext float [[TMP19]] to double
+; CHECK-NEXT: [[P4:%.*]] =...
[truncated]
``````````
</details>
https://github.com/llvm/llvm-project/pull/215534
More information about the llvm-commits
mailing list