diff --git a/llvm/lib/Target/PowerPC/PPCInstrInfo.cpp b/llvm/lib/Target/PowerPC/PPCInstrInfo.cpp --- a/llvm/lib/Target/PowerPC/PPCInstrInfo.cpp +++ b/llvm/lib/Target/PowerPC/PPCInstrInfo.cpp @@ -248,10 +248,11 @@ // This function does not list all associative and commutative operations, but // only those worth feeding through the machine combiner in an attempt to // reduce the critical path. Mostly, this means floating-point operations, -// because they have high latencies (compared to other operations, such and +// because they have high latencies(>=5) (compared to other operations, such as // and/or, which are also associative and commutative, but have low latencies). bool PPCInstrInfo::isAssociativeAndCommutative(const MachineInstr &Inst) const { switch (Inst.getOpcode()) { + // Floating point: // FP Add: case PPC::FADD: case PPC::FADDS: @@ -280,6 +281,13 @@ case PPC::QVFMULSs: return Inst.getFlag(MachineInstr::MIFlag::FmReassoc) && Inst.getFlag(MachineInstr::MIFlag::FmNsz); + // Fixed point: + // Multiply: + case PPC::MULHD: + case PPC::MULLD: + case PPC::MULHW: + case PPC::MULLW: + return true; default: return false; } diff --git a/llvm/test/CodeGen/PowerPC/machine-combiner.ll b/llvm/test/CodeGen/PowerPC/machine-combiner.ll --- a/llvm/test/CodeGen/PowerPC/machine-combiner.ll +++ b/llvm/test/CodeGen/PowerPC/machine-combiner.ll @@ -189,9 +189,9 @@ define i32 @reassociate_mullw(i32 %x0, i32 %x1, i32 %x2, i32 %x3) { ; FIXPOINT-LABEL: reassociate_mullw: ; FIXPOINT: # %bb.0: -; FIXPOINT: mullw 3, 3, 4 -; FIXPOINT: mullw 3, 3, 5 -; FIXPOINT: mullw 3, 3, 6 +; FIXPOINT: mullw [[REG0:[0-9]+]], 3, 4 +; FIXPOINT: mullw [[REG1:[0-9]+]], 5, 6 +; FIXPOINT: mullw 3, [[REG0]], [[REG1]] ; FIXPOINT-NEXT: blr %t0 = mul i32 %x0, %x1 @@ -203,9 +203,9 @@ define i64 @reassociate_mulld(i64 %x0, i64 %x1, i64 %x2, i64 %x3) { ; FIXPOINT-LABEL: reassociate_mulld: ; FIXPOINT: # %bb.0: -; FIXPOINT: mulld 3, 3, 4 -; FIXPOINT: mulld 3, 3, 5 -; FIXPOINT: mulld 3, 3, 6 +; FIXPOINT: mulld [[REG0:[0-9]+]], 3, 4 +; FIXPOINT: mulld [[REG1:[0-9]+]], 5, 6 +; FIXPOINT: mulld 3, [[REG0]], [[REG1]] ; FIXPOINT-NEXT: blr %t0 = mul i64 %x0, %x1