================
@@ -44,6 +68,15 @@ void ComplexExprEmitter::emitStoreOfComplex(mlir::Location 
loc, mlir::Value val,
   builder.createStore(loc, val, destAddr);
 }
 
+mlir::Value ComplexExprEmitter::VisitCallExpr(const CallExpr *e) {
+  if (e->getCallReturnType(cgf.getContext())->isReferenceType())
+    return emitLoadOfLValue(e);
+
+  mlir::Location loc = cgf.getLoc(e->getExprLoc());
+  auto complex = cgf.emitCallExpr(e).getComplexVal();
+  return builder.createComplexCreate(loc, complex.first, complex.second);
----------------
Lancern wrote:

Call to functions that returns a complex value should result in a single 
`mlir::Value` that represents the complex value. #142779 modifies `RValue` and 
uses two `mlir::Value`s to represent a complex rvalue, which could result in 
unnecessary complex unpacking and packing operations.

I suggest we follow the incubator's approach and update the definition of 
`RValue`. Instead of using two `mlir::Value`s to represent a complex rvalue, 
use just one `mlir::Value` (just like how it represents a regular scalar value).

https://github.com/llvm/llvm-project/pull/144225
_______________________________________________
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits

Reply via email to