summaryrefslogtreecommitdiff
path: root/source/slang/slang-lower-to-ir.cpp
diff options
context:
space:
mode:
authorYong He <yonghe@outlook.com>2022-08-03 12:08:37 -0700
committerGitHub <noreply@github.com>2022-08-03 12:08:37 -0700
commite81a5fe56f3177fc3c7040e2320ae083e3746eb7 (patch)
tree884c15287bc10050e7883897dd266b27e62bff66 /source/slang/slang-lower-to-ir.cpp
parent260fc5fbe58f2cf976d64993054c638769bc280f (diff)
Basic pointer usages. (#2342)
Diffstat (limited to 'source/slang/slang-lower-to-ir.cpp')
-rw-r--r--source/slang/slang-lower-to-ir.cpp38
1 files changed, 36 insertions, 2 deletions
diff --git a/source/slang/slang-lower-to-ir.cpp b/source/slang/slang-lower-to-ir.cpp
index 66f314d06..be7373d40 100644
--- a/source/slang/slang-lower-to-ir.cpp
+++ b/source/slang/slang-lower-to-ir.cpp
@@ -704,6 +704,11 @@ LoweredValInfo emitCallToDeclRef(
// so we will emit an instruction with the chosen
// opcode, and the arguments to the call as its operands.
//
+ if (intrinsicOpModifier->op == 0) // Identity, just pass operand 0 through.
+ {
+ SLANG_RELEASE_ASSERT(argCount == 1);
+ return LoweredValInfo::simple(args[0]);
+ }
auto intrinsicOp = getIntrinsicOp(funcDecl, intrinsicOpModifier);
return LoweredValInfo::simple(builder->emitIntrinsicInst(
type,
@@ -4002,6 +4007,12 @@ struct ExprLoweringVisitorBase : ExprVisitor<Derived, LoweredValInfo>
UNREACHABLE_RETURN(LoweredValInfo());
}
+ LoweredValInfo visitPointerTypeExpr(PointerTypeExpr* /*expr*/)
+ {
+ SLANG_UNIMPLEMENTED_X("'*' type expression during code generation");
+ UNREACHABLE_RETURN(LoweredValInfo());
+ }
+
LoweredValInfo visitAssocTypeDecl(AssocTypeDecl* decl)
{
SLANG_UNIMPLEMENTED_X("associatedtype expression during code generation");
@@ -4105,6 +4116,11 @@ struct ExprLoweringVisitorBase : ExprVisitor<Derived, LoweredValInfo>
context->shared->extValues.add(info);
return LoweredValInfo::extractedExistential(info);
}
+
+ LoweredValInfo visitOpenRefExpr(OpenRefExpr* expr)
+ {
+ return lowerLValueExpr(context, expr->innerExpr);
+ }
};
struct LValueExprLoweringVisitor : ExprLoweringVisitorBase<LValueExprLoweringVisitor>
@@ -4264,6 +4280,14 @@ struct RValueExprLoweringVisitor : ExprLoweringVisitorBase<RValueExprLoweringVis
return LoweredValInfo::simple(irSwizzle);
}
+
+ LoweredValInfo visitOpenRefExpr(OpenRefExpr* expr)
+ {
+ auto inner = lowerLValueExpr(context, expr->innerExpr);
+ auto builder = getBuilder();
+ auto irLoad = builder->emitLoad(inner.val);
+ return LoweredValInfo::simple(irLoad);
+ }
};
LoweredValInfo lowerLValueExpr(
@@ -4274,7 +4298,12 @@ LoweredValInfo lowerLValueExpr(
LValueExprLoweringVisitor visitor;
visitor.context = context;
- return visitor.dispatch(expr);
+ auto info = visitor.dispatch(expr);
+ if (as<RefType>(expr->type))
+ {
+ info.flavor = LoweredValInfo::Flavor::Ptr;
+ }
+ return info;
}
LoweredValInfo lowerRValueExpr(
@@ -4285,7 +4314,12 @@ LoweredValInfo lowerRValueExpr(
RValueExprLoweringVisitor visitor;
visitor.context = context;
- return visitor.dispatch(expr);
+ auto info = visitor.dispatch(expr);
+ if (as<RefType>(expr->type))
+ {
+ info.val = context->irBuilder->emitLoad(info.val);
+ }
+ return info;
}
struct StmtLoweringVisitor : StmtVisitor<StmtLoweringVisitor>