@@ -84,6 +84,16 @@ static Instruction::BinaryOps mapBinOpcode(unsigned Opcode) {
8484 }
8585}
8686
87+ // Instruction order - return deterministic order suitable as set
88+ // order for EquivalenceClasses.
89+ unsigned int Float2IntPass::insOrder (Instruction* I) {
90+ static unsigned int order = 0 ;
91+ if (InstructionOrders.find (I) != InstructionOrders.end ())
92+ return InstructionOrders[I];
93+ InstructionOrders[I] = order++;
94+ return order - 1 ;
95+ }
96+
8797// Find the roots - instructions that convert from the FP domain to
8898// integer domain.
8999void Float2IntPass::findRoots (Function &F, const DominatorTree &DT) {
@@ -191,7 +201,7 @@ void Float2IntPass::walkBackwards() {
191201 for (Value *O : I->operands ()) {
192202 if (Instruction *OI = dyn_cast<Instruction>(O)) {
193203 // Unify def-use chains if they interfere.
194- ECs.unionSets (I, OI );
204+ ECs.unionSets (OrderedInstruction ( I, insOrder (I)), OrderedInstruction (OI, insOrder (OI)) );
195205 if (SeenInsts.find (I)->second != badRange ())
196206 Worklist.push_back (OI);
197207 } else if (!isa<ConstantFP>(O)) {
@@ -323,7 +333,8 @@ bool Float2IntPass::validateAndTransform(const DataLayout &DL) {
323333 // For every member of the partition, union all the ranges together.
324334 for (auto MI = ECs.member_begin (It), ME = ECs.member_end ();
325335 MI != ME; ++MI) {
326- Instruction *I = *MI;
336+ OrderedInstruction OMI = *MI;
337+ Instruction *I = OMI.getInstruction ();
327338 auto SeenI = SeenInsts.find (I);
328339 if (SeenI == SeenInsts.end ())
329340 continue ;
@@ -392,9 +403,10 @@ bool Float2IntPass::validateAndTransform(const DataLayout &DL) {
392403 }
393404 }
394405
395- for (auto MI = ECs.member_begin (It), ME = ECs.member_end ();
396- MI != ME; ++MI)
397- convert (*MI, Ty);
406+ for (auto MI = ECs.member_begin (It), ME = ECs.member_end (); MI != ME; ++MI) {
407+ OrderedInstruction OMI = *MI;
408+ convert (OMI.getInstruction (), Ty);
409+ }
398410 MadeChange = true ;
399411 }
400412
@@ -485,8 +497,9 @@ void Float2IntPass::cleanup() {
485497bool Float2IntPass::runImpl (Function &F, const DominatorTree &DT) {
486498 LLVM_DEBUG (dbgs () << " F2I: Looking at function " << F.getName () << " \n " );
487499 // Clear out all state.
488- ECs = EquivalenceClasses<Instruction* >();
500+ ECs = EquivalenceClasses<OrderedInstruction, OrderedInstructionLess<OrderedInstruction> >();
489501 SeenInsts.clear ();
502+ InstructionOrders.clear ();
490503 ConvertedInsts.clear ();
491504 Roots.clear ();
492505
0 commit comments