[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