SelectionDAG::getNode() canonicalises constants to the RHS if the operation is commutative, but it doesn't do so for constant splat vectors. Doing this early helps making certain folds on vector types, simplifying the code required for target DAGCombines that are enabled before Type legalization. Somewhat to my surprise, DAGCombine doesn't seem to traverse the DAG in a post-order DFS, so at the time of doing some custom fold where the input is a MUL, DAGCombiner::visitMUL hasn't yet reordered the constant splat to the RHS. This patch leads to a few improvements, but also a few minor regressions, which I traced down to D46492. When I tried reverting this change to see if the changes were still necessary, I ran into some segfaults. Not sure if there is some latent bug there. Reviewed By: craig.topper Differential Revision: https://reviews.llvm.org/D117794
30 lines
1.3 KiB
LLVM
30 lines
1.3 KiB
LLVM
; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
|
|
; RUN: llc < %s -mtriple=powerpc64le-unknown-unknown | FileCheck %s
|
|
|
|
; Infinite loop identified in D62963.
|
|
define <4 x double> @fneg_fdiv_splat(double %a0, <4 x double> %a1) {
|
|
; CHECK-LABEL: fneg_fdiv_splat:
|
|
; CHECK: # %bb.0: # %entry
|
|
; CHECK-NEXT: addis 3, 2, .LCPI0_0@toc@ha
|
|
; CHECK-NEXT: # kill: def $f1 killed $f1 def $vsl1
|
|
; CHECK-NEXT: xxspltd 0, 1, 0
|
|
; CHECK-NEXT: addi 3, 3, .LCPI0_0@toc@l
|
|
; CHECK-NEXT: lxvd2x 1, 0, 3
|
|
; CHECK-NEXT: xvredp 2, 0
|
|
; CHECK-NEXT: xxswapd 1, 1
|
|
; CHECK-NEXT: xxlor 3, 1, 1
|
|
; CHECK-NEXT: xvnmsubadp 3, 0, 2
|
|
; CHECK-NEXT: xvmaddadp 2, 2, 3
|
|
; CHECK-NEXT: xvnmsubadp 1, 0, 2
|
|
; CHECK-NEXT: xvnmaddadp 2, 2, 1
|
|
; CHECK-NEXT: xvmuldp 34, 34, 2
|
|
; CHECK-NEXT: xvmuldp 35, 35, 2
|
|
; CHECK-NEXT: blr
|
|
entry:
|
|
%splat.splatinsert = insertelement <4 x double> undef, double %a0, i32 0
|
|
%splat.splat = shufflevector <4 x double> %splat.splatinsert, <4 x double> undef, <4 x i32> zeroinitializer
|
|
%div = fdiv contract reassoc nsz arcp ninf <4 x double> %a1, %splat.splat
|
|
%sub = fsub contract reassoc nsz <4 x double> <double 0.000000e+00, double 0.000000e+00, double 0.000000e+00, double 0.000000e+00>, %div
|
|
ret <4 x double> %sub
|
|
}
|