diff options
| author | Valentin Clement <clementval@gmail.com> | 2022-02-08 21:26:16 +0100 |
|---|---|---|
| committer | Valentin Clement <clementval@gmail.com> | 2022-02-08 21:26:38 +0100 |
| commit | 9b5bb511adac5fc624dcaa8e25d0a09ad23577c3 (patch) | |
| tree | 4afdc1f7216fbd73821154a7ad32079d62b05db4 /flang/lib/Optimizer/CodeGen/TargetRewrite.cpp | |
| parent | 817d897b57c7f37d04c2a28153316efe3ae59ada (diff) | |
[flang][codegen] Keep primitive type for extractvalue and insertvalue
llvm.insertvalue and llvm.extractvalue need LLVM primitive type
for the indexing operands. While upstreaming the TargetRewrite pass the change
was made from i32 to index without knowing this restriction. This patch reverts
back the types used for indexing in the two ops created in this pass.
the error you will receive when lowering to LLVM IR with the current code
is the following:
```
'llvm.insertvalue' op operand #1 must be primitive LLVM type, but got 'index'
```
Reviewed By: jeanPerier, schweitz
Differential Revision: https://reviews.llvm.org/D119253
Diffstat (limited to 'flang/lib/Optimizer/CodeGen/TargetRewrite.cpp')
| -rw-r--r-- | flang/lib/Optimizer/CodeGen/TargetRewrite.cpp | 8 |
1 files changed, 5 insertions, 3 deletions
diff --git a/flang/lib/Optimizer/CodeGen/TargetRewrite.cpp b/flang/lib/Optimizer/CodeGen/TargetRewrite.cpp index d4659c1150bc..f1c7ee668fda 100644 --- a/flang/lib/Optimizer/CodeGen/TargetRewrite.cpp +++ b/flang/lib/Optimizer/CodeGen/TargetRewrite.cpp @@ -171,11 +171,12 @@ public: } else { assert(m.size() == 2); // COMPLEX is split into 2 separate arguments + auto iTy = rewriter->getIntegerType(32); for (auto e : llvm::enumerate(m)) { auto &tup = e.value(); auto ty = std::get<mlir::Type>(tup); auto index = e.index(); - auto idx = rewriter->getIntegerAttr(rewriter->getIndexType(), index); + auto idx = rewriter->getIntegerAttr(iTy, index); auto val = rewriter->create<ExtractValueOp>( loc, ty, oper, rewriter->getArrayAttr(idx)); newInTys.push_back(ty); @@ -633,8 +634,9 @@ public: rewriter->setInsertionPointToStart(&func.front()); auto cplxTy = oldArgTys[fixup.index - offset - fixup.second]; auto undef = rewriter->create<UndefOp>(loc, cplxTy); - auto zero = rewriter->getIntegerAttr(rewriter->getIndexType(), 0); - auto one = rewriter->getIntegerAttr(rewriter->getIndexType(), 1); + auto iTy = rewriter->getIntegerType(32); + auto zero = rewriter->getIntegerAttr(iTy, 0); + auto one = rewriter->getIntegerAttr(iTy, 1); auto cplx1 = rewriter->create<InsertValueOp>( loc, cplxTy, undef, func.front().getArgument(fixup.index - 1), rewriter->getArrayAttr(zero)); |
