精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

【TVM 教程】向 Relay 中添加 Compiler Pass 原創

發布于 2025-8-11 15:30
瀏覽
0收藏

Apache TVM 是一個深度的深度學習編譯框架,適用于 CPU、GPU 和各種機器學習加速芯片。更多 TVM 中文文檔可訪問 →https://tvm.hyper.ai/

Compiler Pass 是擴展 Relay 功能集及優化 Relay 程序的主要接口。通過編寫 compiler pass,用戶可以基于最終目標,修改 AST 或收集 AST 相關信息。事實上,Relay 內置的一些重要特性(如自動微分和類型推斷)都“標準”的 compiler pass。

整體來看,編寫 pass 包括兩個關鍵組成部分:

  • 創建一個或多個遍歷程序的 C++ 類
  • 將遍歷實現及其在 pass manager API 中的元數據包裝,從而方便與?Pass Infrastructure?輕松交互

首先,我們將概述編寫 compiler pass 的關鍵機制。然后通過 Relay 中常量折疊 pass 的具體示例進行演示。

AST 遍歷器(Traversers)

用于遍歷 Relay 程序的基類是?ExprFunctor。它提供的公共接口是一個?VisitExpr?方法,該方法接收一個表達式以及零個或多個參數,并返回某種類型的實例。擴展此類時,可以通過覆蓋每種表達式類型的?VisitExpr_?實現,來定義 AST 遍歷模式。

VisitExpr?和?VisitExpr_?之間的關系與調度有關。每個?VisitExpr_?定義都針對特定類型的表達式,但用戶無法每次都得知要訪問的節點類型。為了解決這個問題,ExprFunctor?提供了一個?VisitExpr?函數,將給定表達式路由轉換為?VisitExpr_?實例進而解決問題。盡管 C++ 已經提供了動態調度,但?ExprFunctor?定義了自己的虛表供?VisitExp?使用。通過定義虛表可以更好地控制調度。例如,定義一個在每次訪問之前都打印 “Here” 的?PrintVisitor?遍歷器,可以覆蓋?VisitExpr

void PrintVisitor::VisitExpr(const Expr& expr) {
  std::cout << "Here" << std::endl;
  ExprFunctor::VisitExpr(expr);
}

ExprFunctor?本身是一個非常通用的類,這就是為什么更多時候你會擴展?ExprVisitor?或?ExprMutator。這些類擴展了?ExprFunctor,并提供了?VisitExpr_?的默認實現,這些實現捕獲了每種表達式類型的常見遍歷模式。有了這些默認的實現,開發者只需針對想要不同行為的表達式類型,提供覆蓋的實現。后續章節將針對每個子類進行詳細描述。

表達式訪問器(Expression Visitors)

ExprVisitor?不用于修改程序的pass,而是用于實施程序分析和收集信息的 pass。使用這個類,VisitExpr?和私有 counterparts 不會返回任何內容。此類提供的?VisitExpr_?實現只是訪問表達式的所有表達式字段。?IfNode?的默認實現如下所示:

void ExprVisitor::VisitExpr_(const IfNode* op) {
  this->VisitExpr(op->cond);
  this->VisitExpr(op->true_branch);
  this->VisitExpr(op->false_branch);
}

注意,這里調用的是?VisitExpr?而非?VisitExpr_,因此用戶可以使用?ExprFunctor?中的虛表進行路由。

如果要編寫一個?CallChecker?類來檢查程序中是否出現函數調用,只需擴展?ExprVisitor?并定義以下?VisitExpr_?方法:

void VisitExpr_(const CallNode* n) final {
  result_ = true;
}

其中?result_?是一個字段。在該示例中,無需在?CallNode?字段上進一步遞歸,因為?result_?已經為 true,原始表達式中包含一個調用。為了使該訪問器可用,可以采用以下方法:

bool Check(const Expr& expr) final {
  result_ = false;
  VisitExpr(expr);
  return result_;
}

以上就是全部操作。在調用 top-level 的遞歸之前,定義一個執行一些記錄的公有接口是很常見的操作。用戶也可以通過創建一個生成?CallChecker?實例,并在其上調用?Check?的獨立程序來進一步包裝 API,重要的是用盡可能少的資源用實現目標。

表達式修改器(Expression Mutators)

ExprMutator?用于以某種方式轉換程序的 pass。通過這個類,VisitExpr?及其對應的私有部分返回?Expr。此類提供的默認?VisitExpr_?實現訪問表達式的所有表達式字段,并將字段設置為訪問它們的結果。TupleGetItemNode?的默認實現如下所示:

Expr ExprMutator::VisitExpr_(const TupleGetItemNode* g) {
  auto t = this->Mutate(g->tuple);
  if (g->tuple == t) {
    return GetRef<Expr>(g);
  } else {
    return TupleGetItem(t, g->index);
  }
}

這里有幾點需要注意。首先,Mutate?是?ExprMutator?中?VisitExpr?的別名。其次,如果對?Mutate?的調用修改了?tuple?字段,則只返回一個新節點。這種更新的方法稱為功能更新,這樣做可以避免不必要的分配。

ExprMutator?有、而?ExprVisitor?沒有的一個功能,是用于緩存結果的內置?memo_?字段。ExprMutator?有一個記憶器(memoizer)這是合理的,因為用戶知道正在緩存哪些類型的結果(即?Expr),而?ExprVisitor?的訪問方法不返回任何內容。通常,當用戶要在?ExprVisitor?的子類中緩存結果時,需要自行定義緩存。

如果希望編寫一個?IfCollapser?類,用它的真實分支替換每個 if 語句,用戶將為?IfNode?覆蓋?VisitExpr_

Expr ExprMutator::VisitExpr_(const IfNode* op) {
  return this->Mutate(op->true_branch);
}

注意:返回的表達式不一定是?IfNode,這是正常的,因為返回類型是?Expr。接下來創建一個公有接口:

Expr CollapseIfs(const Expr& expr) final {
  return this->Mutate(expr);
}

雖然使用這個修改器無需做任何記錄,但仍然鼓勵用戶將描述性方法作為接口。

示例:常量折疊

為了更好地理解編寫 pass 的過程,本部分將以常量折疊 pass(可在?src/relay/transforms/fold_constant.cc?中找到)作為示例進行講解。常量折疊 pass 相對簡單,且包含兩種類型的遍歷。

常量折疊涉及只包含常量的程序評估表達式(evaluating expression),然后用評估它們的結果替換這些表達式。此過程的目的是預加載可以進行的所有計算。為了實現這一點,常量折疊 pass 使用了一個訪問器(ConstantChecker)和一個修改器(ConstantFolder)。

ConstantChecker?訪問器

此訪問器用于檢查表達式是否為常量。在 Relay 中,用戶將?ConstantNode?或者只有常量字段的?TupleNode?的表達式定義為常量。

使用?memo_?字段從節點映射到它們是否為常量,并緩存這些結果。下面是?ConstantChecker?中的?VisitExpr_?定義。

void VisitExpr_(const ConstantNode* n) final {
  memo_[GetRef<Constant>(n)] = true;
}

void VisitExpr_(const TupleNode* n) final {
  bool result = true;
  for (const auto& field : n->fields) {
    if (!Check(field)) {
      result = false;
      break;
    }
  }
  memo_[GetRef<Tuple>(n)] = result;
}

用于協調這些定義的記錄是一個?Check?方法,它返回給定的表達式是否被認定為常量。

bool Check(const Expr& expr) {
  const auto it = memo_.find(expr);
  if (it != memo_.end())
    return it->second;
  VisitExpr(expr);
  return memo_[expr];
}

并不是所有遇到的節點都要修改?memo_;相反,用戶只有在遇到的節點有可能是常數時,才修改?memo_。當?memo_?不包含?expr?時,需要依賴默認的 false 值。

ConstantFolder?修改器

這個修改器執行了大部分的常量折疊過程,并在內部使用?ConstantChecker。在 Relay 中,常量折疊涉及三種節點類型:LetNodeTupleItemGetNode?和?CallNode。后續段落中將進行詳細講解。

Expr VisitExpr_(const LetNode* op) final {
  Expr value = this->Mutate(op->value);
  if (value.as<ConstantNode>()) {
    memo_[op->var] = value;
    return this->Mutate(op->body);
  } else {
    Var var = Downcast<Var>(this->Mutate(op->var));
    Expr body = this->Mutate(op->body);
    if (var.same_as(op->var) &&
        value.same_as(op->value) &&
        body.same_as(op->body)) {
      return GetRef<Expr>(op);
    } else {
      return Let(var, value, body);
    }
  }
}

在?LetNode?示例里,首先嘗試常量折疊綁定在表達式的值。如果可以,填充?memo_?并返回訪問主體的結果——本質上是將綁定的值傳到主體中的使用點。如果無法常量折疊綁定的值,可以參照默認的實現方法:

Expr VisitExpr_(const TupleGetItemNode* op) final {
  Expr res = ExprMutator::VisitExpr_(op);
  op = res.as<TupleGetItemNode>();
  if (const auto* tuple = op->tuple.as<TupleNode>()) {
    return tuple->fields[op->index];
  } else {
    return res;
  }
}

在?TupleItemGetNode?的例子里,需要檢查?op->tuple?字段是否為?TupleNode。如果是,我們將 get 元組替換為?op->index?指向的元組的字段。這樣做的原因是因為?op->tuple?可能被錯誤評估為一個元組。

Expr VisitExpr_(const CallNode* call) final {
  static auto op_stateful = Op::GetAttrMap<TOpIsStateful>("TOpIsStateful");
  Expr res = ExprMutator::VisitExpr_(call);
  call = res.as<CallNode>();
  // 我們不使用零參數的常量折疊函數。
  // 這是一個很有用的啟發式方法。
  // 例如折疊那些 shape=(4, 5) 是有害的。
  if (call->args.size() == 0) return res;
  const OpNode* op = call->op.as<OpNode>();
  if (op == nullptr) return res;
  // 跳過有狀態的算子。
  if (op_stateful.get(GetRef<Op>(op), false)) return res;
  bool all_const_args = true;
  for (Expr arg : call->args) {
    if (!checker_.Check(arg)) {
      all_const_args = false;
    }
  }
  if (all_const_args) {
    return ConstEvaluate(res);
  } else {
    return res;
  }
}

在?CallNode?示例中,首先使用?ExprMutator?的?VisitExpr_?來訪問調用,它將調用的所有字段都常量折疊了。之所以使用?ExprMutator::VisitExpr_?而不是?VisitExpr,是因為我們想要繞過虛表(以避免死循環)并使用?ExprMutator?提供的默認實現。只有當所有參數都是常量時,才評估調用(使用?ConstantChecker)。評估調用會產生一個,因此這里使用輔助方法?ValueToExpr?,將評估的表達式放回 AST 中。

現在,我們為常量文件夾構造了一個更方便的接口?FoldConstant。FoldConstant?是?ConstantFolder?類之外的一個獨立函數,它負責接收表達式并在內部創建和使用?ConstantFolder?實例(其完整的定義在?src/relay/transforms/fold_constant.cc?中)。

用 Pass Manager 注冊 Pass

*注意:更多詳情請參閱?Pass Infrastructure?中的文檔。

編寫 AST 遍歷器后,用以下代碼可將 pass 注冊為 TVM API 端點:

namespace transform {

Pass FoldConstant() {
  runtime::TypedPackedFunc<Function(Function, Module, PassContext)> pass_func =
    [=](Function f, Module m, PassContext pc) {
      return Downcast<Function>(FoldConstant(f));
  };
  return CreateFunctionPass(pass_func, 2, "FoldConstant", {});
}

}  // 命名空間轉換

將上述代碼生成的?Pass?對象提供給 pass 基礎架構,可以使得 AST 遍歷應用于給定 Relay 模塊中的所有函數,這是常量折疊過程預期的行為(它應該盡可能折疊所有常量)。

函數?CreateFunctionPass?允許注冊 pass 的優化級別(在本例中為 2),可用于根據 pass 的一般實用性、 pass 名稱和 pass 中的任何依賴項將 pass 組合在一起。pass 的依賴項以列表形式給出,羅列了當前 pass 運行所必需的所有 pass 的結果。FoldConstant?沒有任何依賴,但是很多 Relay pass 確實依賴有類型信息,所以?InferType?是一個常見的依賴;其他的可能依賴于程序為 A-范式,通過?ToANormalForm?pass。

注意,PassContext?對象包含 pass 用于錯誤報告和配置選項的信息;?FoldConstant?不需要此信息,但其他 pass 可能會引用它們的?PassContext?對象。

現在可以通過 pass 基礎結構調用 pass 了,推薦為 pass 添加 Python 綁定,如以下代碼片段所示:

TVM_REGISTER_GLOBAL("relay._transform.FoldConstant")
.set_body_typed(FoldConstant);

通過以上方法定義了?Pass?對象后,就可以用 pass 基礎架構的?Sequential?結構來調用了。?Sequential?接收一個 pass 列表,并將其按順序應用于 Relay 模塊,從而獲得轉換后的模塊。例如,下面的代碼將?FoldConstant?和?ToANormalForm?pass 逐一應用于?mod?中的每個函數,并獲得一個新模塊。

seq = transform.Sequential([
    relay.transform.FoldConstant(),
    relay.transform.ToANormalForm()
])
new_mod = seq(mod)

更多注冊相關的內容,請查看?TVM Runtime 系統;pass 管理器接口相關的更多信息,請查看?Pass 基礎架構; Relay 的標準 pass 列表及實現方式,請分別查看?include/tvm/relay/transform.h?及?src/relay/transforms/。

?著作權歸作者所有,如需轉載,請注明出處,否則將追究法律責任
收藏
回復
舉報
回復
相關推薦
久久精品一区二区三| 欧美日韩精品在线一区二区| 国产一区二区小视频| 在线中文一区| 亚洲老板91色精品久久| a在线观看免费视频| av中文字幕在线播放| 99视频国产精品| 91精品久久久久久久久久入口| 麻豆一区二区三区精品视频| 国内精品视频在线观看| 欧美不卡一二三| 亚洲无吗一区二区三区| 丁香影院在线| 国产精品久久久久国产精品日日| 国产精品久久久一区二区三区| 亚洲精品一区二区二区| 一区精品久久| 久久精品国产精品亚洲| 中文字幕xxx| 亚洲经典视频| 777久久久精品| 午夜激情福利在线| 国产在线美女| 亚洲免费大片在线观看| 亚洲免费在线电影| 欧美最猛性xxxxx免费| 亚洲色婷婷一区二区三区| 国产日产精品一区二区三区四区的观看方式 | 午夜欧美一区二区三区免费观看| 国产91久久久| 国产最新精品免费| 国产精品美乳在线观看| 亚洲精品男人天堂| 亚洲国产高清一区| 欧美激情精品久久久久久免费印度| av片在线免费看| 国产精品片aa在线观看| 亚洲国产精品va在线| 又大又长粗又爽又黄少妇视频| 欧美网站免费| 在线观看日产精品| 国内外免费激情视频| 黄色小说在线播放| 亚洲综合色在线| 久久久天堂国产精品| av在线导航| 亚洲乱码中文字幕| 亚洲国产一二三精品无码| 超碰在线观看免费| 一区二区三区国产精品| 日本a级片在线观看| 国产成人高清精品| 亚洲女人****多毛耸耸8| 亚洲无玛一区| 免费a级人成a大片在线观看| 亚洲欧美自拍偷拍| 久久久久亚洲av无码专区喷水| 久久久久久久久免费视频| 中文字幕一区在线| 狠狠干视频网站| 金瓶狂野欧美性猛交xxxx| 亚洲影院在线观看| 国产主播自拍av| 亚洲黄色中文字幕| 精品视频一区二区不卡| 三年中文在线观看免费大全中国| 欧美亚洲黄色| 精品久久国产字幕高潮| 精品无码人妻少妇久久久久久| 国产在线播放精品| 亚洲香蕉成人av网站在线观看 | 一级精品视频在线观看宜春院| 天天综合中文字幕| 深夜国产在线播放| 欧美日韩一区二区在线播放| 999精品网站| 国产不卡精品在线| 亚洲成人在线网| 高清国产在线观看| 欧美一区视频| 欧美主播福利视频| 一起草av在线| www.日本不卡| 亚洲 国产 欧美一区| 污污网站在线看| 欧美视频一区二区三区…| 亚洲精品久久久中文字幕| 欧美一区在线观看视频| 日韩精品免费观看| 色婷婷粉嫩av| 亚洲伦伦在线| 国产日韩精品在线观看| 好男人www在线视频| 久久精品亚洲精品国产欧美kt∨| 中国一级黄色录像| 午夜av不卡| 91精品国产高清一区二区三区蜜臀| japan高清日本乱xxxxx| 免费成人网www| 欧美理论片在线观看| 中文字幕黄色片| 国产精品亚洲第一区在线暖暖韩国 | 在线国产精品播放| 久久久久久福利| 人人超碰91尤物精品国产| 成人午夜影院在线观看| av资源网站在线观看| 亚洲大尺度视频在线观看| 高清av免费看| 国产影视精品一区二区三区| 欧美国产极速在线| 一级黄色片网站| 久久综合九色综合久久久精品综合| 91社在线播放| 欧美大片1688网站| 精品亚洲国产成av人片传媒 | 婷婷激情综合网| 日本高清免费在线视频| 国内精品伊人久久久| 97在线视频国产| www.午夜激情| 中文字幕亚洲电影| 青青青在线视频免费观看| 日韩高清一级| 久久人91精品久久久久久不卡| 亚洲综合精品在线| 国产亚洲短视频| 北条麻妃在线视频观看| 51精品国产| 久久香蕉国产线看观看av| 久草热在线观看| 久久久不卡网国产精品二区| 国产毛片视频网站| 9l亚洲国产成人精品一区二三| 久久久精品在线观看| 亚洲综合一区中| 国产精品水嫩水嫩| 中国黄色片免费看| 成人vr资源| 国产精品九九久久久久久久| 男女污视频在线观看| 欧美日韩国产精品| 亚洲观看黄色网| 亚洲专区欧美专区| 欧美日韩天天操| 性感美女一区二区在线观看| 亚洲人成欧美中文字幕| 波多野结衣一二区| 国产精品萝li| 手机精品视频在线| 欧美黄色一区二区| 成人免费看片网站| 金瓶狂野欧美性猛交xxxx | 美女搡bbb又爽又猛又黄www| 狠狠入ady亚洲精品| 国内视频一区| 黄色亚洲网站| 中文字幕日韩欧美| 国产精品久久影视| 亚洲国产精品久久不卡毛片 | 国产精品女同一区二区三区| 国产一级片自拍| 一本一道久久综合狠狠老| 亚洲一区二区免费在线| 美女尤物在线视频| 日韩av在线资源| 波多野结衣电车痴汉| 国产精品久久久久久久久免费桃花| 国产九九热视频| 欧美freesex交免费视频| 国产精品手机在线| 亚洲精品mv| 色偷偷噜噜噜亚洲男人| 99在线小视频| 欧美午夜www高清视频| 中国一区二区三区| 国产男女激情视频| 18岁成人毛片| 不卡的av中国片| 激情综合在线观看| 成人中文在线| 粉嫩精品一区二区三区在线观看| 精精国产xxxx视频在线野外| 亚洲一区二区国产| www.爱爱.com| 日韩欧美亚洲国产一区| 羞羞在线观看视频| 成人av网站大全| 午夜激情av在线| 激情综合自拍| 亚洲欧洲精品一区| 国产欧美一区二区三区米奇| 国产精品久久久久久久久免费| 97影院秋霞午夜在线观看| 日韩精品免费在线视频观看| 一区二区三区www污污污网站| 亚洲自拍偷拍麻豆| 欧美成人另类视频| 成人国产亚洲欧美成人综合网| 久久久久久香蕉| 国产综合激情| 国产91av视频在线观看| 日韩福利视频一区| 91嫩草国产在线观看| 国产精品成人国产| 国内精品久久久久| 国产高清一区二区三区视频| 亚洲日本中文字幕免费在线不卡| 国内精品久久久久久久久久| 欧美无乱码久久久免费午夜一区| 日韩av在线天堂| 亚洲乱码国产乱码精品精可以看| 日本欧美一区二区三区不卡视频| 成人精品鲁一区一区二区| 在线能看的av网站| 噜噜噜久久亚洲精品国产品小说| 日韩在线观看a| 欧美aaaa视频| 任我爽在线视频精品一| 狼人天天伊人久久| 99久久精品免费看国产四区| 久久av影院| 国产精品高精视频免费| 国产在线天堂www网在线观看| 欧美成人中文字幕| 精品国产丝袜高跟鞋| 中文字幕综合在线| 粉嫩一区二区三区国产精品| 精品亚洲男同gayvideo网站| 欧美一级淫片aaaaaa| 日韩一区二区三区三四区视频在线观看 | 日韩久久电影| 日韩av在线电影观看| 伊人久久大香线蕉综合网站| 精品视频第一区| 精品精品精品| 国产精品久久久久久久久久久久冷| 国产精品一区二区三区四区在线观看| 国产精品一二区| 国产精品麻豆成人av电影艾秋| 国产福利精品视频| av成人亚洲| 国产精品视频99| 国产亚洲人成a在线v网站| 国产精品老女人视频| 免费在线成人激情电影| 国产精品亚洲综合天堂夜夜| 四虎精品在线观看| 亚洲专区在线视频| 视频精品二区| 国产一区二区三区无遮挡| 美女呻吟一区| 麻豆亚洲一区| av一区二区高清| 亚洲一区三区电影在线观看| 999精品色在线播放| 男人天堂成人网| 欧美视频在线观看| 波多野结衣之无限发射| 免费亚洲网站| 色播五月综合网| 国产一区二区视频在线| 成人在线观看一区二区| 成人aa视频在线观看| 久久中文字幕人妻| 国产精品少妇自拍| 免费在线观看h片| 亚洲成人在线观看视频| 欧美一区二区激情视频| 欧美亚洲精品一区| 99久久精品国产色欲| 精品电影一区二区三区| 欧美偷拍视频| 主播福利视频一区| a'aaa级片在线观看| 日本久久久a级免费| 精品国产黄a∨片高清在线| 亚洲精品日产aⅴ| 免费成人蒂法| 国产精品家庭影院| 精品视频—区二区三区免费| aaaa黄色片| www激情久久| 亚洲欧美日韩第一页| 国产成人av电影在线| 亚洲影院在线看| 999久久精品| 日本一区二区三区视频在线播放| 日韩国产一区| 丁香花在线影院观看在线播放| 日日夜夜一区二区| 麻豆传媒在线看| 久久香蕉国产线看观看99| 四虎884aa成人精品| 午夜成人在线视频| 国产精品毛片久久久久久久av| 亚洲精品成人网| 黄色网页网址在线免费| 45www国产精品网站| 精品视频一区二区三区| 久久亚洲一区二区| 午夜久久影院| 少妇一级淫免费放| av成人免费在线观看| 欧美手机在线观看| 一本一道久久a久久精品综合蜜臀| 国产美女自慰在线观看| 亚洲天堂网站在线观看视频| 人妖欧美1区| 国产欧美一区二区| 一道本一区二区三区| 久久综合久久久久| 久久99最新地址| 国产男女猛烈无遮挡a片漫画| 一区二区三区四区激情| 中文区中文字幕免费看| 国产丝袜一区视频在线观看| 手机在线免费av| 91精品啪在线观看麻豆免费| 成人嘿咻视频免费看| 欧美韩国日本在线| www.亚洲人| 国产无码精品在线播放| 欧美一区二区三区男人的天堂| 日韩在线观看www| 国产成人综合亚洲| 蜜桃a∨噜噜一区二区三区| 性一交一乱一伧国产女士spa| 国产一区二区三区免费看| 五月天婷婷丁香网| 在线观看视频一区二区| 韩日视频在线| 国产成人久久久精品一区| 伊人精品一区| 欧美aⅴ在线观看| 久久综合九色综合97婷婷女人 | 嫩草精品影院| 日本91av在线播放| 亚洲精品456| 黄色片一级视频| 久久久久久免费网| 无码免费一区二区三区| 亚洲午夜av久久乱码| 惠美惠精品网| 天堂资源在线亚洲资源| 日本欧美一区二区三区乱码| 亚洲高潮女人毛茸茸| 欧美视频一二三区| 天堂а√在线资源在线| 国产欧美日韩高清| 香蕉av一区二区| 欧美xxxx日本和非洲| 亚洲一级二级三级| 亚洲av激情无码专区在线播放| 91精品国产电影| 综合色就爱涩涩涩综合婷婷| 欧美污视频网站| 国产欧美综合色| 国产人妻精品一区二区三| 久国内精品在线| 奇米影视777在线欧美电影观看| 成人免费观看视频在线观看| 91麻豆精品秘密| 中文字幕+乱码+中文字幕明步| 丝袜亚洲另类欧美重口| 久久爱www.| www.日本在线播放| 久久久久久久久久电影| 在线观看国产黄| 九九热r在线视频精品| 久久男人av| 三年中国国语在线播放免费| 亚洲色图制服丝袜| 日本精品久久久久| 国产精品大陆在线观看| 99久久夜色精品国产亚洲1000部 | 91在线视频网址| 中文字幕一区二区三区波野结 | 午夜精品区一区二区三| 国产一区二区成人久久免费影院| 国产污片在线观看| 亚洲一二三在线| 日韩中文字幕一区二区高清99| 1024av视频| 中文字幕一区二区三区av| 手机看片福利在线| 国产日韩精品一区二区| 亚洲国产高清一区二区三区| 国产真人真事毛片视频| 精品久久国产97色综合| 成人av色网站| 久久国产精品网| 国产精品毛片a∨一区二区三区| 国产91免费在线观看| 国产精品色婷婷视频| 亚洲巨乳在线| 久久一级免费视频| 亚洲精品久久7777777| 91丨精品丨国产|