Index: llvm/trunk/lib/CodeGen/SelectionDAG/DAGCombiner.cpp =================================================================== --- llvm/trunk/lib/CodeGen/SelectionDAG/DAGCombiner.cpp +++ llvm/trunk/lib/CodeGen/SelectionDAG/DAGCombiner.cpp @@ -8261,11 +8261,11 @@ return SDValue(); // Find all FDIV users of the same divisor. - SmallVector Users; - for (auto *U : N1->uses()) { + // Use a set because duplicates may be present in the user list. + SetVector Users; + for (auto *U : N1->uses()) if (U->getOpcode() == ISD::FDIV && U->getOperand(1) == N1) - Users.push_back(U); - } + Users.insert(U); // Now that we have the actual number of divisor uses, make sure it meets // the minimum threshold specified by the target. Index: llvm/trunk/test/CodeGen/X86/fdiv-combine.ll =================================================================== --- llvm/trunk/test/CodeGen/X86/fdiv-combine.ll +++ llvm/trunk/test/CodeGen/X86/fdiv-combine.ll @@ -44,5 +44,24 @@ ret double %ret } +define void @PR24141() #0 { +; CHECK-LABEL: PR24141: +; CHECK: callq +; CHECK-NEXT: divsd +; CHECK-NEXT: jmp +entry: + br label %while.body + +while.body: + %x.0 = phi double [ undef, %entry ], [ %div, %while.body ] + %call = call { double, double } @g(double %x.0) + %xv0 = extractvalue { double, double } %call, 0 + %xv1 = extractvalue { double, double } %call, 1 + %div = fdiv double %xv0, %xv1 + br label %while.body +} + +declare { double, double } @g(double) + ; FIXME: If the backend understands 'arcp', then this attribute is unnecessary. attributes #0 = { "unsafe-fp-math"="true" }