Commit 08898ecb authored by 李晓奇's avatar 李晓奇

now shuold pass loop3!

parent b1f2b21d
...@@ -69,6 +69,8 @@ class ConstantExpression : public Expression { ...@@ -69,6 +69,8 @@ class ConstantExpression : public Expression {
} }
ConstantExpression(Constant *c) : Expression(e_constant), c_(c) {} ConstantExpression(Constant *c) : Expression(e_constant), c_(c) {}
Constant *get_val() { return c_; }
private: private:
Constant *c_; Constant *c_;
}; };
...@@ -199,20 +201,24 @@ class GEPExpression : public Expression { ...@@ -199,20 +201,24 @@ class GEPExpression : public Expression {
// unique expression: not equal to any one else // unique expression: not equal to any one else
class UniqueExpression : public Expression { class UniqueExpression : public Expression {
public: public:
static std::shared_ptr<UniqueExpression> create(Instruction *instr) { static std::shared_ptr<UniqueExpression> create(Instruction *instr,
return std::make_shared<UniqueExpression>(instr); size_t index) {
return std::make_shared<UniqueExpression>(instr, index);
} }
virtual std::string print() { return "(UNIQUE " + instr_->print() + ")"; } // virtual std::string print() { return "(UNIQUE " + instr_->print() + ")";
// }
virtual std::string print() { return "v" + std::to_string(index_); }
bool equiv(const UniqueExpression *other) const { bool equiv(const UniqueExpression *other) const {
return instr_ == other->instr_; return instr_ == other->instr_;
} }
UniqueExpression(Instruction *instr) UniqueExpression(Instruction *instr, size_t index)
: Expression(e_unique), instr_(instr) {} : Expression(e_unique), instr_(instr), index_(index) {}
private: private:
Instruction *instr_; Instruction *instr_;
size_t index_;
}; };
} // namespace GVNExpression } // namespace GVNExpression
...@@ -276,7 +282,8 @@ class GVN : public Pass { ...@@ -276,7 +282,8 @@ class GVN : public Pass {
partitions transferFunction(BasicBlock *bb); partitions transferFunction(BasicBlock *bb);
std::shared_ptr<GVNExpression::PhiExpression> valuePhiFunc( std::shared_ptr<GVNExpression::PhiExpression> valuePhiFunc(
std::shared_ptr<GVNExpression::Expression>, std::shared_ptr<GVNExpression::Expression>,
BasicBlock *bb); BasicBlock *bb,
Instruction *instr);
std::shared_ptr<GVNExpression::Expression> valueExpr( std::shared_ptr<GVNExpression::Expression> valueExpr(
Instruction *instr, Instruction *instr,
const partitions &part); const partitions &part);
...@@ -308,6 +315,7 @@ class GVN : public Pass { ...@@ -308,6 +315,7 @@ class GVN : public Pass {
std::map<BasicBlock *, bool> _TOP; std::map<BasicBlock *, bool> _TOP;
partitions join_helper(BasicBlock *pre1, BasicBlock *pre2); partitions join_helper(BasicBlock *pre1, BasicBlock *pre2);
BasicBlock *curr_bb; BasicBlock *curr_bb;
std::map<std::pair<Instruction *, Value *>, size_t> start_idx_;
// //
// self add function // self add function
// //
...@@ -317,11 +325,17 @@ class GVN : public Pass { ...@@ -317,11 +325,17 @@ class GVN : public Pass {
Value *v, Value *v,
const partitions &part); const partitions &part);
std::vector<std::shared_ptr<GVNExpression::Expression>> core_( std::vector<std::shared_ptr<GVNExpression::Expression>> valueExpr_core_(
Instruction *instr, Instruction *instr,
const partitions &part, const partitions &part,
size_t count, const size_t count,
bool fold_ = true); bool fold_ = true);
Constant *constFold_core(const size_t count,
const partitions &part,
Instruction *instr,
const std::vector<Value *> &operands);
void assign_start_idx_();
void dump_tmp(Function &);
}; };
bool operator==(const GVN::partitions &p1, const GVN::partitions &p2); bool operator==(const GVN::partitions &p1, const GVN::partitions &p2);
This diff is collapsed.
rm -rf *.ll rm -rf *.ll
rm -rf gvn.json rm -rf gvn.json
rm -rf `ls | grep -v "\."` rm -rf `ls | grep -v "\."`
rm -rf tmp*
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment