static void AliasesOneBlock(BLOCK *b) { QUAD *head = b->head; while (head != b->tail->fwd) { switch(head->dc.opcode) { case i_assnblock: HandleAssnBlock(head); break; case i_parmblock: HandleParmBlock(head); break; case i_parm: HandleParm(head); break; case i_phi: HandlePhi(head); break; case i_assn: HandleAssn(head); break; case i_add: case i_sub: HandleAdd(head); break; default: break; } head = head->fwd; } }
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Operand* Peephole::Simplify(Instruction* instr) { // Set the insertion point for new instructions; all new instructions // after the current one, in the order they are created. irGen_.SetInsertionPoint(instr); switch(instr->GetOpcode()) { case Instr_Add: { return PreserveUSO(instr, HandleAdd(instr->GetSourceOp(0), instr->GetSourceOp(1), instr->ParentBlock())); } case Instr_Sub: { return PreserveUSO(instr, HandleSub(instr->GetSourceOp(0), instr->GetSourceOp(1), instr->ParentBlock())); } case Instr_Mul: { return PreserveUSO(instr, HandleMul(instr->GetSourceOp(0), instr->GetSourceOp(1), instr->ParentBlock())); } case Instr_Div: { auto arithInstr = instr->As<ArithmeticInstr>(); return PreserveUSO(instr, HandleDiv(arithInstr->LeftOp(), arithInstr->RightOp(), instr->ParentBlock(), arithInstr->HasNoRemainder())); } case Instr_Udiv: { return PreserveUSO(instr, HandleUdiv(instr->GetSourceOp(0), instr->GetSourceOp(1), instr->ParentBlock())); } case Instr_Mod: { return PreserveUSO(instr, HandleMod(instr->GetSourceOp(0), instr->GetSourceOp(1), instr->ParentBlock())); } case Instr_Umod: { return PreserveUSO(instr, HandleUmod(instr->GetSourceOp(0), instr->GetSourceOp(1), instr->ParentBlock())); } case Instr_Fadd: { auto arithInstr = instr->As<ArithmeticInstr>(); return HandleFadd(arithInstr->LeftOp(), arithInstr->RightOp(), arithInstr->GetFPMode()); } case Instr_Fsub: { auto arithInstr = instr->As<ArithmeticInstr>(); return HandleFsub(arithInstr->LeftOp(), arithInstr->RightOp(), arithInstr->GetFPMode()); } case Instr_Fmul: { auto arithInstr = instr->As<ArithmeticInstr>(); return HandleFmul(arithInstr->LeftOp(), arithInstr->RightOp(), arithInstr->GetFPMode()); } case Instr_Fdiv: { auto arithInstr = instr->As<ArithmeticInstr>(); return HandleFdiv(arithInstr->LeftOp(), arithInstr->RightOp(), arithInstr->GetFPMode()); } case Instr_And: return HandleAnd(instr->GetSourceOp(0), instr->GetSourceOp(1), instr->ParentBlock()); case Instr_Or: return HandleOr(instr->GetSourceOp(0), instr->GetSourceOp(1), instr->ParentBlock()); case Instr_Xor: return HandleXor(instr->GetSourceOp(0), instr->GetSourceOp(1), instr->ParentBlock()); case Instr_Shl: return HandleShl(instr->As<ShlInstr>()); case Instr_Shr: return HandleShr(instr->As<ShrInstr>()); case Instr_Ushr: return HandleUshr(instr->As<UshrInstr>()); case Instr_Cmp: return HandleCmp(instr->As<CmpInstr>()); case Instr_Ucmp: return HandleUcmp(instr->As<UcmpInstr>()); case Instr_Fcmp: return HandleFcmp(instr->As<FcmpInstr>()); case Instr_Trunc: return HandleTrunc(instr->As<TruncInstr>()); case Instr_Sext: return HandleSext(instr->As<SextInstr>()); case Instr_Zext: return HandleZext(instr->As<ZextInstr>()); case Instr_Ftrunc: return HandleFtrunc(instr->As<FtruncInstr>()); case Instr_Fext: return HandleFext(instr->As<FextInstr>()); case Instr_Ftoi: return HandleFtoi(instr->As<FtoiInstr>()); case Instr_Ftoui: return HandleFtoui(instr->As<FtouiInstr>()); case Instr_Itof: return HandleItof(instr->As<ItofInstr>()); case Instr_Itop: return HandleItop(instr->As<ItopInstr>()); case Instr_Ptoi: return HandlePtoi(instr->As<PtoiInstr>()); case Instr_Ptop: return HandlePtop(instr->As<PtopInstr>()); case Instr_Uitof: return HandleUitof(instr->As<UitofInstr>()); case Instr_Call: return HandleCall(instr->As<CallInstr>()); case Instr_Address: return HandleAddress(instr->As<AddressInstr>()); case Instr_Index: return HandleIndex(instr->As<IndexInstr>()); case Instr_Element: return HandleElement(instr->As<ElementInstr>()); case Instr_Load: return HandleLoad(instr->As<LoadInstr>()); case Instr_Store: return HandleStore(instr->As<StoreInstr>()); case Instr_Question: return HandleQuestion(instr->As<QuestionInstr>()); case Instr_Phi: return HandlePhi(instr->As<PhiInstr>()); } // This is an instruction that is not supported. return nullptr; }