From 05b95b7fa63d713dd2e7d696ae7f7e898a277594 Mon Sep 17 00:00:00 2001 From: Yan Da Date: Wed, 9 Dec 2020 12:35:24 +0800 Subject: [PATCH 1/4] [LANG] Add support for PREFIX_INC and PREFIX_DEC. --- include/triton/lang/code_gen.h | 1 + lib/lang/code_gen.cc | 37 ++++++++++++++++++++++++++++++---- 2 files changed, 34 insertions(+), 4 deletions(-) diff --git a/include/triton/lang/code_gen.h b/include/triton/lang/code_gen.h index 5347421bb..531da19c5 100644 --- a/include/triton/lang/code_gen.h +++ b/include/triton/lang/code_gen.h @@ -48,6 +48,7 @@ protected: void set_ret(ir::value* value); ir::value *GenUnaryMinus(ir::value* arg); + ir::value *GenUnaryInc(UnaryOp* arg, bool is_postfix, bool is_inc); public: Generator(Parser* parser) : parser_(parser) {} diff --git a/lib/lang/code_gen.cc b/lib/lang/code_gen.cc index 2d72e1794..5ac843b86 100644 --- a/lib/lang/code_gen.cc +++ b/lib/lang/code_gen.cc @@ -182,6 +182,35 @@ ir::value* Generator::GenUnaryMinus(ir::value* arg) { return bld_->create_sub(_0, arg); } +ir::value* Generator::GenUnaryInc(UnaryOp* expr, bool is_postfix, + bool is_inc) { + Visit(expr->operand_); + ir::value* arg = ret_; + + ir::value *_1 = nullptr; + if (arg->get_type()->is_half_ty() || + arg->get_type()->is_float_ty() || + arg->get_type()->is_double_ty()) + _1 = ir::constant_fp::get(arg->get_type(), 1.0); + else if (arg->get_type()->is_integer_ty()) + _1 = ir::constant_int::get(arg->get_type(), 1); + else + error_not_implemented("data type not supported for unary inc"); + + if (is_postfix) { + error_not_implemented("postfix inc not implemented"); + return nullptr; + } else { + ir::value *instr = nullptr; + if (is_inc) + instr = bld_->create_add(arg, _1); + else + instr = bld_->create_sub(arg, _1); + mod_->set_value(arg->get_name(), instr); + return instr; + } +} + void Generator::VisitUnaryOp(UnaryOp* unary) { // recursion Visit(unary->operand_); @@ -190,10 +219,10 @@ void Generator::VisitUnaryOp(UnaryOp* unary) { ir::type *arg_scal_ty = arg_ty->get_scalar_ty(); // return switch (unary->op_) { - case Token::PREFIX_INC: return error_not_implemented("prefix increment not implemented"); - case Token::PREFIX_DEC: return error_not_implemented("prefix decrement not implemented"); - case Token::POSTFIX_INC: return error_not_implemented("postfix increment not implemented"); - case Token::POSTFIX_DEC: return error_not_implemented("postfix decrement not implemented"); + case Token::PREFIX_INC: return set_ret(GenUnaryInc(unary, false, true)); + case Token::PREFIX_DEC: return set_ret(GenUnaryInc(unary, false, false)); + case Token::POSTFIX_INC: return set_ret(GenUnaryInc(unary, true, true)); + case Token::POSTFIX_DEC: return set_ret(GenUnaryInc(unary, true, false)); case Token::ADDR: return error_not_implemented("unary & not implemented"); case Token::DEREF: return set_ret(bld_->create_load(arg)); case Token::PLUS: return error_not_implemented("unary + not implemented"); From e9b2335224453468d8d2495234079777ef54285b Mon Sep 17 00:00:00 2001 From: Yan Da Date: Wed, 9 Dec 2020 13:42:21 +0800 Subject: [PATCH 2/4] [LANG] Add support for POSTFIX_INC and POSTFIX_DEC, and pointer type --- lib/lang/code_gen.cc | 38 ++++++++++++++++++++++++-------------- 1 file changed, 24 insertions(+), 14 deletions(-) diff --git a/lib/lang/code_gen.cc b/lib/lang/code_gen.cc index 5ac843b86..647742ea0 100644 --- a/lib/lang/code_gen.cc +++ b/lib/lang/code_gen.cc @@ -188,27 +188,37 @@ ir::value* Generator::GenUnaryInc(UnaryOp* expr, bool is_postfix, ir::value* arg = ret_; ir::value *_1 = nullptr; - if (arg->get_type()->is_half_ty() || - arg->get_type()->is_float_ty() || - arg->get_type()->is_double_ty()) + ir::value *instr = nullptr; + + if (arg->get_type()->is_floating_point_ty()) { _1 = ir::constant_fp::get(arg->get_type(), 1.0); - else if (arg->get_type()->is_integer_ty()) + if (is_inc) + instr = bld_->create_fadd(arg, _1); + else + instr = bld_->create_fsub(arg, _1); + } else if (arg->get_type()->is_integer_ty()) { _1 = ir::constant_int::get(arg->get_type(), 1); - else - error_not_implemented("data type not supported for unary inc"); - - if (is_postfix) { - error_not_implemented("postfix inc not implemented"); - return nullptr; - } else { - ir::value *instr = nullptr; if (is_inc) instr = bld_->create_add(arg, _1); else instr = bld_->create_sub(arg, _1); - mod_->set_value(arg->get_name(), instr); + } else if (arg->get_type()->is_pointer_ty()) { + _1 = ir::constant_int::get(arg->get_type(), 1); + if (is_inc) + instr = bld_->create_gep(arg, {_1}); + else { + ir::value *neg_1 = ir::constant_int::get(arg->get_type(), -1); + instr = bld_->create_gep(arg, {neg_1}); + } + } else + error_not_implemented("data type not supported for unary inc"); + + mod_->set_value(arg->get_name(), instr); + + if (is_postfix) + return arg; + else return instr; - } } void Generator::VisitUnaryOp(UnaryOp* unary) { From 01ef691b842db30951d4c554ca3045420f58bab2 Mon Sep 17 00:00:00 2001 From: Yan Da Date: Wed, 9 Dec 2020 14:36:00 +0800 Subject: [PATCH 3/4] [LANG] Fix gep bug in INC --- lib/lang/code_gen.cc | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/lib/lang/code_gen.cc b/lib/lang/code_gen.cc index 647742ea0..6de85ea25 100644 --- a/lib/lang/code_gen.cc +++ b/lib/lang/code_gen.cc @@ -203,11 +203,12 @@ ir::value* Generator::GenUnaryInc(UnaryOp* expr, bool is_postfix, else instr = bld_->create_sub(arg, _1); } else if (arg->get_type()->is_pointer_ty()) { - _1 = ir::constant_int::get(arg->get_type(), 1); + ir::type *ty = ir::type::get_int64_ty(*ctx_); + _1 = ir::constant_int::get(ty, 1); if (is_inc) instr = bld_->create_gep(arg, {_1}); else { - ir::value *neg_1 = ir::constant_int::get(arg->get_type(), -1); + ir::value *neg_1 = ir::constant_int::get(ty, -1); instr = bld_->create_gep(arg, {neg_1}); } } else From 27dc7808716e0f9db7bcaac304774968c03e18cf Mon Sep 17 00:00:00 2001 From: Yan Da Date: Wed, 9 Dec 2020 15:10:19 +0800 Subject: [PATCH 4/4] [IR] Check constant_int type --- lib/ir/constant.cc | 2 ++ 1 file changed, 2 insertions(+) diff --git a/lib/ir/constant.cc b/lib/ir/constant.cc index 825a130f4..3a7aabf9e 100644 --- a/lib/ir/constant.cc +++ b/lib/ir/constant.cc @@ -43,6 +43,8 @@ constant_int::constant_int(type *ty, uint64_t value) : constant(ty, 0), value_(value){ } constant_int *constant_int::get(type *ty, uint64_t value) { + if (!ty->is_integer_ty()) + throw std::runtime_error("Cannot create constant_int with non integer ty"); context_impl *impl = ty->get_context().p_impl.get(); constant_int *& cst = impl->int_constants_[std::make_pair(ty, value)]; if(cst == nullptr)