Skip to content

Commit 3af4590

Browse files
rainerzufalldererstegoldsteinn
authored andcommitted
[InstCombine] Contracting x^2 + 2*x*y + y^2 to (x + y)^2 (float)
Resolves #61296 if https://reviews.llvm.org/D156026 didn't suffice. Reviewed By: goldstein.w.n Differential Revision: https://reviews.llvm.org/D158079
1 parent b1012e6 commit 3af4590

File tree

3 files changed

+85
-99
lines changed

3 files changed

+85
-99
lines changed

llvm/lib/Transforms/InstCombine/InstCombineAddSub.cpp

Lines changed: 57 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -995,37 +995,66 @@ Instruction *InstCombinerImpl::foldAddWithConstant(BinaryOperator &Add) {
995995
return nullptr;
996996
}
997997

998-
// Fold variations of a^2 + 2*a*b + b^2 -> (a + b)^2
999-
Instruction *InstCombinerImpl::foldSquareSumInts(BinaryOperator &I) {
1000-
Value *A, *B;
1001-
1002-
// (a * a) + (((a << 1) + b) * b)
1003-
bool Matches = match(
1004-
&I, m_c_Add(m_OneUse(m_Mul(m_Value(A), m_Deferred(A))),
1005-
m_OneUse(m_Mul(m_c_Add(m_Shl(m_Deferred(A), m_SpecificInt(1)),
1006-
m_Value(B)),
1007-
m_Deferred(B)))));
998+
// match variations of a^2 + 2*a*b + b^2
999+
//
1000+
// to reuse the code between the FP and Int versions, the instruction OpCodes
1001+
// and constant types have been turned into template parameters.
1002+
//
1003+
// Mul2Rhs: The constant to perform the multiplicative equivalent of X*2 with;
1004+
// should be `m_SpecificFP(2.0)` for FP and `m_SpecificInt(1)` for Int
1005+
// (we're matching `X<<1` instead of `X*2` for Int)
1006+
template <bool FP, typename Mul2Rhs>
1007+
static bool matchesSquareSum(BinaryOperator &I, Mul2Rhs M2Rhs, Value *&A,
1008+
Value *&B) {
1009+
constexpr unsigned MulOp = FP ? Instruction::FMul : Instruction::Mul;
1010+
constexpr unsigned AddOp = FP ? Instruction::FAdd : Instruction::Add;
1011+
constexpr unsigned Mul2Op = FP ? Instruction::FMul : Instruction::Shl;
1012+
1013+
// (a * a) + (((a * 2) + b) * b)
1014+
if (match(&I, m_c_BinOp(
1015+
AddOp, m_OneUse(m_BinOp(MulOp, m_Value(A), m_Deferred(A))),
1016+
m_OneUse(m_BinOp(
1017+
MulOp,
1018+
m_c_BinOp(AddOp, m_BinOp(Mul2Op, m_Deferred(A), M2Rhs),
1019+
m_Value(B)),
1020+
m_Deferred(B))))))
1021+
return true;
10081022

1009-
// ((a * b) << 1) or ((a << 1) * b)
1023+
// ((a * b) * 2) or ((a * 2) * b)
10101024
// +
10111025
// (a * a + b * b) or (b * b + a * a)
1012-
if (!Matches) {
1013-
Matches = match(
1014-
&I,
1015-
m_c_Add(m_CombineOr(m_OneUse(m_Shl(m_Mul(m_Value(A), m_Value(B)),
1016-
m_SpecificInt(1))),
1017-
m_OneUse(m_Mul(m_Shl(m_Value(A), m_SpecificInt(1)),
1018-
m_Value(B)))),
1019-
m_OneUse(m_c_Add(m_Mul(m_Deferred(A), m_Deferred(A)),
1020-
m_Mul(m_Deferred(B), m_Deferred(B))))));
1021-
}
1022-
1023-
// if one of them matches: -> (a + b)^2
1024-
if (Matches) {
1026+
return match(
1027+
&I,
1028+
m_c_BinOp(AddOp,
1029+
m_CombineOr(
1030+
m_OneUse(m_BinOp(
1031+
Mul2Op, m_BinOp(MulOp, m_Value(A), m_Value(B)), M2Rhs)),
1032+
m_OneUse(m_BinOp(MulOp, m_BinOp(Mul2Op, m_Value(A), M2Rhs),
1033+
m_Value(B)))),
1034+
m_OneUse(m_c_BinOp(
1035+
AddOp, m_BinOp(MulOp, m_Deferred(A), m_Deferred(A)),
1036+
m_BinOp(MulOp, m_Deferred(B), m_Deferred(B))))));
1037+
}
1038+
1039+
// Fold integer variations of a^2 + 2*a*b + b^2 -> (a + b)^2
1040+
Instruction *InstCombinerImpl::foldSquareSumInt(BinaryOperator &I) {
1041+
Value *A, *B;
1042+
if (matchesSquareSum</*FP*/ false>(I, m_SpecificInt(1), A, B)) {
10251043
Value *AB = Builder.CreateAdd(A, B);
10261044
return BinaryOperator::CreateMul(AB, AB);
10271045
}
1046+
return nullptr;
1047+
}
10281048

1049+
// Fold floating point variations of a^2 + 2*a*b + b^2 -> (a + b)^2
1050+
// Requires `nsz` and `reassoc`.
1051+
Instruction *InstCombinerImpl::foldSquareSumFP(BinaryOperator &I) {
1052+
assert(I.hasAllowReassoc() && I.hasNoSignedZeros() && "Assumption mismatch");
1053+
Value *A, *B;
1054+
if (matchesSquareSum</*FP*/ true>(I, m_SpecificFP(2.0), A, B)) {
1055+
Value *AB = Builder.CreateFAddFMF(A, B, &I);
1056+
return BinaryOperator::CreateFMulFMF(AB, AB, &I);
1057+
}
10291058
return nullptr;
10301059
}
10311060

@@ -1667,7 +1696,7 @@ Instruction *InstCombinerImpl::visitAdd(BinaryOperator &I) {
16671696
I, Builder.CreateIntrinsic(Intrinsic::ctpop, {I.getType()},
16681697
{Builder.CreateOr(A, B)}));
16691698

1670-
if (Instruction *Res = foldSquareSumInts(I))
1699+
if (Instruction *Res = foldSquareSumInt(I))
16711700
return Res;
16721701

16731702
if (Instruction *Res = foldBinOpOfDisplacedShifts(I))
@@ -1849,6 +1878,9 @@ Instruction *InstCombinerImpl::visitFAdd(BinaryOperator &I) {
18491878
if (Instruction *F = factorizeFAddFSub(I, Builder))
18501879
return F;
18511880

1881+
if (Instruction *F = foldSquareSumFP(I))
1882+
return F;
1883+
18521884
// Try to fold fadd into start value of reduction intrinsic.
18531885
if (match(&I, m_c_FAdd(m_OneUse(m_Intrinsic<Intrinsic::vector_reduce_fadd>(
18541886
m_AnyZeroFP(), m_Value(X))),

llvm/lib/Transforms/InstCombine/InstCombineInternal.h

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -563,7 +563,8 @@ class LLVM_LIBRARY_VISIBILITY InstCombinerImpl final
563563

564564
Instruction *foldAddWithConstant(BinaryOperator &Add);
565565

566-
Instruction *foldSquareSumInts(BinaryOperator &I);
566+
Instruction *foldSquareSumInt(BinaryOperator &I);
567+
Instruction *foldSquareSumFP(BinaryOperator &I);
567568

568569
/// Try to rotate an operation below a PHI node, using PHI nodes for
569570
/// its operands.

llvm/test/Transforms/InstCombine/fadd.ll

Lines changed: 26 additions & 73 deletions
Original file line numberDiff line numberDiff line change
@@ -620,11 +620,8 @@ define float @fadd_fneg_commute0(float %x, float %y, float %z) {
620620

621621
define float @fadd_reduce_sqr_sum_varA(float %a, float %b) {
622622
; CHECK-LABEL: @fadd_reduce_sqr_sum_varA(
623-
; CHECK-NEXT: [[A_SQ:%.*]] = fmul float [[A:%.*]], [[A]]
624-
; CHECK-NEXT: [[TWO_A:%.*]] = fmul float [[A]], 2.000000e+00
625-
; CHECK-NEXT: [[TWO_A_PLUS_B:%.*]] = fadd float [[TWO_A]], [[B:%.*]]
626-
; CHECK-NEXT: [[MUL:%.*]] = fmul float [[TWO_A_PLUS_B]], [[B]]
627-
; CHECK-NEXT: [[ADD:%.*]] = fadd reassoc nsz float [[MUL]], [[A_SQ]]
623+
; CHECK-NEXT: [[TMP1:%.*]] = fadd reassoc nsz float [[A:%.*]], [[B:%.*]]
624+
; CHECK-NEXT: [[ADD:%.*]] = fmul reassoc nsz float [[TMP1]], [[TMP1]]
628625
; CHECK-NEXT: ret float [[ADD]]
629626
;
630627
%a_sq = fmul float %a, %a
@@ -637,11 +634,8 @@ define float @fadd_reduce_sqr_sum_varA(float %a, float %b) {
637634

638635
define float @fadd_reduce_sqr_sum_varA_order2(float %a, float %b) {
639636
; CHECK-LABEL: @fadd_reduce_sqr_sum_varA_order2(
640-
; CHECK-NEXT: [[A_SQ:%.*]] = fmul float [[A:%.*]], [[A]]
641-
; CHECK-NEXT: [[TWO_A:%.*]] = fmul float [[A]], 2.000000e+00
642-
; CHECK-NEXT: [[TWO_A_PLUS_B:%.*]] = fadd float [[TWO_A]], [[B:%.*]]
643-
; CHECK-NEXT: [[MUL:%.*]] = fmul float [[TWO_A_PLUS_B]], [[B]]
644-
; CHECK-NEXT: [[ADD:%.*]] = fadd reassoc nsz float [[A_SQ]], [[MUL]]
637+
; CHECK-NEXT: [[TMP1:%.*]] = fadd reassoc nsz float [[A:%.*]], [[B:%.*]]
638+
; CHECK-NEXT: [[ADD:%.*]] = fmul reassoc nsz float [[TMP1]], [[TMP1]]
645639
; CHECK-NEXT: ret float [[ADD]]
646640
;
647641
%a_sq = fmul float %a, %a
@@ -654,11 +648,8 @@ define float @fadd_reduce_sqr_sum_varA_order2(float %a, float %b) {
654648

655649
define float @fadd_reduce_sqr_sum_varA_order3(float %a, float %b) {
656650
; CHECK-LABEL: @fadd_reduce_sqr_sum_varA_order3(
657-
; CHECK-NEXT: [[A_SQ:%.*]] = fmul float [[A:%.*]], [[A]]
658-
; CHECK-NEXT: [[TWO_A:%.*]] = fmul float [[A]], 2.000000e+00
659-
; CHECK-NEXT: [[TWO_A_PLUS_B:%.*]] = fadd float [[TWO_A]], [[B:%.*]]
660-
; CHECK-NEXT: [[MUL:%.*]] = fmul float [[TWO_A_PLUS_B]], [[B]]
661-
; CHECK-NEXT: [[ADD:%.*]] = fadd reassoc nsz float [[MUL]], [[A_SQ]]
651+
; CHECK-NEXT: [[TMP1:%.*]] = fadd reassoc nsz float [[A:%.*]], [[B:%.*]]
652+
; CHECK-NEXT: [[ADD:%.*]] = fmul reassoc nsz float [[TMP1]], [[TMP1]]
662653
; CHECK-NEXT: ret float [[ADD]]
663654
;
664655
%a_sq = fmul float %a, %a
@@ -671,11 +662,8 @@ define float @fadd_reduce_sqr_sum_varA_order3(float %a, float %b) {
671662

672663
define float @fadd_reduce_sqr_sum_varA_order4(float %a, float %b) {
673664
; CHECK-LABEL: @fadd_reduce_sqr_sum_varA_order4(
674-
; CHECK-NEXT: [[A_SQ:%.*]] = fmul float [[A:%.*]], [[A]]
675-
; CHECK-NEXT: [[TWO_A:%.*]] = fmul float [[A]], 2.000000e+00
676-
; CHECK-NEXT: [[TWO_A_PLUS_B:%.*]] = fadd float [[TWO_A]], [[B:%.*]]
677-
; CHECK-NEXT: [[MUL:%.*]] = fmul float [[TWO_A_PLUS_B]], [[B]]
678-
; CHECK-NEXT: [[ADD:%.*]] = fadd reassoc nsz float [[MUL]], [[A_SQ]]
665+
; CHECK-NEXT: [[TMP1:%.*]] = fadd reassoc nsz float [[A:%.*]], [[B:%.*]]
666+
; CHECK-NEXT: [[ADD:%.*]] = fmul reassoc nsz float [[TMP1]], [[TMP1]]
679667
; CHECK-NEXT: ret float [[ADD]]
680668
;
681669
%a_sq = fmul float %a, %a
@@ -688,11 +676,8 @@ define float @fadd_reduce_sqr_sum_varA_order4(float %a, float %b) {
688676

689677
define float @fadd_reduce_sqr_sum_varA_order5(float %a, float %b) {
690678
; CHECK-LABEL: @fadd_reduce_sqr_sum_varA_order5(
691-
; CHECK-NEXT: [[A_SQ:%.*]] = fmul float [[A:%.*]], [[A]]
692-
; CHECK-NEXT: [[TWO_A:%.*]] = fmul float [[A]], 2.000000e+00
693-
; CHECK-NEXT: [[TWO_A_PLUS_B:%.*]] = fadd float [[TWO_A]], [[B:%.*]]
694-
; CHECK-NEXT: [[MUL:%.*]] = fmul float [[TWO_A_PLUS_B]], [[B]]
695-
; CHECK-NEXT: [[ADD:%.*]] = fadd reassoc nsz float [[MUL]], [[A_SQ]]
679+
; CHECK-NEXT: [[TMP1:%.*]] = fadd reassoc nsz float [[A:%.*]], [[B:%.*]]
680+
; CHECK-NEXT: [[ADD:%.*]] = fmul reassoc nsz float [[TMP1]], [[TMP1]]
696681
; CHECK-NEXT: ret float [[ADD]]
697682
;
698683
%a_sq = fmul float %a, %a
@@ -705,12 +690,8 @@ define float @fadd_reduce_sqr_sum_varA_order5(float %a, float %b) {
705690

706691
define float @fadd_reduce_sqr_sum_varB(float %a, float %b) {
707692
; CHECK-LABEL: @fadd_reduce_sqr_sum_varB(
708-
; CHECK-NEXT: [[A_B:%.*]] = fmul float [[A:%.*]], [[B:%.*]]
709-
; CHECK-NEXT: [[A_B_2:%.*]] = fmul float [[A_B]], 2.000000e+00
710-
; CHECK-NEXT: [[A_SQ:%.*]] = fmul float [[A]], [[A]]
711-
; CHECK-NEXT: [[B_SQ:%.*]] = fmul float [[B]], [[B]]
712-
; CHECK-NEXT: [[A_SQ_B_SQ:%.*]] = fadd float [[A_SQ]], [[B_SQ]]
713-
; CHECK-NEXT: [[ADD:%.*]] = fadd reassoc nsz float [[A_B_2]], [[A_SQ_B_SQ]]
693+
; CHECK-NEXT: [[TMP1:%.*]] = fadd reassoc nsz float [[A:%.*]], [[B:%.*]]
694+
; CHECK-NEXT: [[ADD:%.*]] = fmul reassoc nsz float [[TMP1]], [[TMP1]]
714695
; CHECK-NEXT: ret float [[ADD]]
715696
;
716697
%a_b = fmul float %a, %b
@@ -724,12 +705,8 @@ define float @fadd_reduce_sqr_sum_varB(float %a, float %b) {
724705

725706
define float @fadd_reduce_sqr_sum_varB_order1(float %a, float %b) {
726707
; CHECK-LABEL: @fadd_reduce_sqr_sum_varB_order1(
727-
; CHECK-NEXT: [[A_B:%.*]] = fmul float [[A:%.*]], [[B:%.*]]
728-
; CHECK-NEXT: [[A_B_2:%.*]] = fmul float [[A_B]], 2.000000e+00
729-
; CHECK-NEXT: [[A_SQ:%.*]] = fmul float [[A]], [[A]]
730-
; CHECK-NEXT: [[B_SQ:%.*]] = fmul float [[B]], [[B]]
731-
; CHECK-NEXT: [[A_SQ_B_SQ:%.*]] = fadd float [[A_SQ]], [[B_SQ]]
732-
; CHECK-NEXT: [[ADD:%.*]] = fadd reassoc nsz float [[A_SQ_B_SQ]], [[A_B_2]]
708+
; CHECK-NEXT: [[TMP1:%.*]] = fadd reassoc nsz float [[A:%.*]], [[B:%.*]]
709+
; CHECK-NEXT: [[ADD:%.*]] = fmul reassoc nsz float [[TMP1]], [[TMP1]]
733710
; CHECK-NEXT: ret float [[ADD]]
734711
;
735712
%a_b = fmul float %a, %b
@@ -743,12 +720,8 @@ define float @fadd_reduce_sqr_sum_varB_order1(float %a, float %b) {
743720

744721
define float @fadd_reduce_sqr_sum_varB_order2(float %a, float %b) {
745722
; CHECK-LABEL: @fadd_reduce_sqr_sum_varB_order2(
746-
; CHECK-NEXT: [[A_B:%.*]] = fmul float [[A:%.*]], [[B:%.*]]
747-
; CHECK-NEXT: [[A_B_2:%.*]] = fmul float [[A_B]], 2.000000e+00
748-
; CHECK-NEXT: [[A_SQ:%.*]] = fmul float [[A]], [[A]]
749-
; CHECK-NEXT: [[B_SQ:%.*]] = fmul float [[B]], [[B]]
750-
; CHECK-NEXT: [[A_SQ_B_SQ:%.*]] = fadd float [[B_SQ]], [[A_SQ]]
751-
; CHECK-NEXT: [[ADD:%.*]] = fadd reassoc nsz float [[A_B_2]], [[A_SQ_B_SQ]]
723+
; CHECK-NEXT: [[TMP1:%.*]] = fadd reassoc nsz float [[A:%.*]], [[B:%.*]]
724+
; CHECK-NEXT: [[ADD:%.*]] = fmul reassoc nsz float [[TMP1]], [[TMP1]]
752725
; CHECK-NEXT: ret float [[ADD]]
753726
;
754727
%a_b = fmul float %a, %b
@@ -762,12 +735,8 @@ define float @fadd_reduce_sqr_sum_varB_order2(float %a, float %b) {
762735

763736
define float @fadd_reduce_sqr_sum_varB_order3(float %a, float %b) {
764737
; CHECK-LABEL: @fadd_reduce_sqr_sum_varB_order3(
765-
; CHECK-NEXT: [[A_B:%.*]] = fmul float [[B:%.*]], [[A:%.*]]
766-
; CHECK-NEXT: [[A_B_2:%.*]] = fmul float [[A_B]], 2.000000e+00
767-
; CHECK-NEXT: [[A_SQ:%.*]] = fmul float [[A]], [[A]]
768-
; CHECK-NEXT: [[B_SQ:%.*]] = fmul float [[B]], [[B]]
769-
; CHECK-NEXT: [[A_SQ_B_SQ:%.*]] = fadd float [[A_SQ]], [[B_SQ]]
770-
; CHECK-NEXT: [[ADD:%.*]] = fadd reassoc nsz float [[A_B_2]], [[A_SQ_B_SQ]]
738+
; CHECK-NEXT: [[TMP1:%.*]] = fadd reassoc nsz float [[B:%.*]], [[A:%.*]]
739+
; CHECK-NEXT: [[ADD:%.*]] = fmul reassoc nsz float [[TMP1]], [[TMP1]]
771740
; CHECK-NEXT: ret float [[ADD]]
772741
;
773742
%a_b = fmul float %b, %a
@@ -781,12 +750,8 @@ define float @fadd_reduce_sqr_sum_varB_order3(float %a, float %b) {
781750

782751
define float @fadd_reduce_sqr_sum_varB2(float %a, float %b) {
783752
; CHECK-LABEL: @fadd_reduce_sqr_sum_varB2(
784-
; CHECK-NEXT: [[A_2:%.*]] = fmul float [[A:%.*]], 2.000000e+00
785-
; CHECK-NEXT: [[A_B_2:%.*]] = fmul float [[A_2]], [[B:%.*]]
786-
; CHECK-NEXT: [[A_SQ:%.*]] = fmul float [[A]], [[A]]
787-
; CHECK-NEXT: [[B_SQ:%.*]] = fmul float [[B]], [[B]]
788-
; CHECK-NEXT: [[A_SQ_B_SQ:%.*]] = fadd float [[A_SQ]], [[B_SQ]]
789-
; CHECK-NEXT: [[ADD:%.*]] = fadd reassoc nsz float [[A_B_2]], [[A_SQ_B_SQ]]
753+
; CHECK-NEXT: [[TMP1:%.*]] = fadd reassoc nsz float [[A:%.*]], [[B:%.*]]
754+
; CHECK-NEXT: [[ADD:%.*]] = fmul reassoc nsz float [[TMP1]], [[TMP1]]
790755
; CHECK-NEXT: ret float [[ADD]]
791756
;
792757
%a_2 = fmul float %a, 2.0
@@ -800,12 +765,8 @@ define float @fadd_reduce_sqr_sum_varB2(float %a, float %b) {
800765

801766
define float @fadd_reduce_sqr_sum_varB2_order1(float %a, float %b) {
802767
; CHECK-LABEL: @fadd_reduce_sqr_sum_varB2_order1(
803-
; CHECK-NEXT: [[A_2:%.*]] = fmul float [[A:%.*]], 2.000000e+00
804-
; CHECK-NEXT: [[A_B_2:%.*]] = fmul float [[A_2]], [[B:%.*]]
805-
; CHECK-NEXT: [[A_SQ:%.*]] = fmul float [[A]], [[A]]
806-
; CHECK-NEXT: [[B_SQ:%.*]] = fmul float [[B]], [[B]]
807-
; CHECK-NEXT: [[A_SQ_B_SQ:%.*]] = fadd float [[A_SQ]], [[B_SQ]]
808-
; CHECK-NEXT: [[ADD:%.*]] = fadd reassoc nsz float [[A_SQ_B_SQ]], [[A_B_2]]
768+
; CHECK-NEXT: [[TMP1:%.*]] = fadd reassoc nsz float [[A:%.*]], [[B:%.*]]
769+
; CHECK-NEXT: [[ADD:%.*]] = fmul reassoc nsz float [[TMP1]], [[TMP1]]
809770
; CHECK-NEXT: ret float [[ADD]]
810771
;
811772
%a_2 = fmul float %a, 2.0
@@ -819,12 +780,8 @@ define float @fadd_reduce_sqr_sum_varB2_order1(float %a, float %b) {
819780

820781
define float @fadd_reduce_sqr_sum_varB2_order2(float %a, float %b) {
821782
; CHECK-LABEL: @fadd_reduce_sqr_sum_varB2_order2(
822-
; CHECK-NEXT: [[A_2:%.*]] = fmul float [[A:%.*]], 2.000000e+00
823-
; CHECK-NEXT: [[A_B_2:%.*]] = fmul float [[A_2]], [[B:%.*]]
824-
; CHECK-NEXT: [[A_SQ:%.*]] = fmul float [[A]], [[A]]
825-
; CHECK-NEXT: [[B_SQ:%.*]] = fmul float [[B]], [[B]]
826-
; CHECK-NEXT: [[A_SQ_B_SQ:%.*]] = fadd float [[A_SQ]], [[B_SQ]]
827-
; CHECK-NEXT: [[ADD:%.*]] = fadd reassoc nsz float [[A_B_2]], [[A_SQ_B_SQ]]
783+
; CHECK-NEXT: [[TMP1:%.*]] = fadd reassoc nsz float [[A:%.*]], [[B:%.*]]
784+
; CHECK-NEXT: [[ADD:%.*]] = fmul reassoc nsz float [[TMP1]], [[TMP1]]
828785
; CHECK-NEXT: ret float [[ADD]]
829786
;
830787
%a_2 = fmul float %a, 2.0
@@ -838,12 +795,8 @@ define float @fadd_reduce_sqr_sum_varB2_order2(float %a, float %b) {
838795

839796
define float @fadd_reduce_sqr_sum_varB2_order3(float %a, float %b) {
840797
; CHECK-LABEL: @fadd_reduce_sqr_sum_varB2_order3(
841-
; CHECK-NEXT: [[A_2:%.*]] = fmul float [[A:%.*]], 2.000000e+00
842-
; CHECK-NEXT: [[A_B_2:%.*]] = fmul float [[A_2]], [[B:%.*]]
843-
; CHECK-NEXT: [[A_SQ:%.*]] = fmul float [[A]], [[A]]
844-
; CHECK-NEXT: [[B_SQ:%.*]] = fmul float [[B]], [[B]]
845-
; CHECK-NEXT: [[A_SQ_B_SQ:%.*]] = fadd float [[A_SQ]], [[B_SQ]]
846-
; CHECK-NEXT: [[ADD:%.*]] = fadd reassoc nsz float [[A_B_2]], [[A_SQ_B_SQ]]
798+
; CHECK-NEXT: [[TMP1:%.*]] = fadd reassoc nsz float [[A:%.*]], [[B:%.*]]
799+
; CHECK-NEXT: [[ADD:%.*]] = fmul reassoc nsz float [[TMP1]], [[TMP1]]
847800
; CHECK-NEXT: ret float [[ADD]]
848801
;
849802
%a_2 = fmul float 2.0, %a

0 commit comments

Comments
 (0)