@@ -13754,60 +13754,28 @@ SpirvEmitter::processSpvIntrinsicCallExpr(const CallExpr *expr) {
13754
13754
/*isInstr*/ true, expr->getExprLoc());
13755
13755
}
13756
13756
13757
- uint32_t SpirvEmitter::getAlignmentForRawBufferLoad(const CallExpr *callExpr) {
13758
- if (callExpr->getNumArgs() == 1)
13759
- return 4;
13760
-
13761
- if (callExpr->getNumArgs() > 2) {
13762
- emitError("number of arguments for vk::RawBufferLoad() must be 1 or 2",
13763
- callExpr->getExprLoc());
13764
- return 0;
13757
+ uint32_t SpirvEmitter::getRawBufferAlignment(const Expr *expr) {
13758
+ llvm::APSInt value;
13759
+ if (expr->EvaluateAsInt(value, astContext) && value.isNonNegative()) {
13760
+ return static_cast<uint32_t>(value.getZExtValue());
13765
13761
}
13766
13762
13767
- const Expr *alignmentArgExpr = callExpr->getArg(1);
13768
- if (const auto *templateParmExpr =
13769
- dyn_cast<SubstNonTypeTemplateParmExpr>(alignmentArgExpr)) {
13770
- alignmentArgExpr = templateParmExpr->getReplacement();
13771
- }
13772
- const auto *intLiteral =
13773
- dyn_cast<IntegerLiteral>(alignmentArgExpr->IgnoreImplicit());
13774
- if (intLiteral == nullptr) {
13775
- emitError("alignment argument of vk::RawBufferLoad() must be a constant "
13776
- "integer",
13777
- callExpr->getArg(1)->getExprLoc());
13778
- return 0;
13779
- }
13780
- return static_cast<uint32_t>(intLiteral->getValue().getZExtValue());
13763
+ // Unable to determine a valid alignment at compile time
13764
+ emitError("alignment argument must be a constant unsigned integer",
13765
+ expr->getExprLoc());
13766
+ return 0;
13781
13767
}
13782
13768
13783
- uint32_t SpirvEmitter::getAlignmentForRawBufferStore(const CallExpr *callExpr) {
13784
- if (callExpr->getNumArgs() == 2)
13785
- return 4;
13786
-
13787
- if (callExpr->getNumArgs() != 2 && callExpr->getNumArgs() != 3) {
13788
- emitError("number of arguments for vk::RawBufferStore() must be 2 or 3",
13769
+ SpirvInstruction *SpirvEmitter::processRawBufferLoad(const CallExpr *callExpr) {
13770
+ if (callExpr->getNumArgs() > 2) {
13771
+ emitError("number of arguments for vk::RawBufferLoad() must be 1 or 2",
13789
13772
callExpr->getExprLoc());
13790
- return 0;
13791
- }
13792
-
13793
- const Expr *alignmentArgExpr = callExpr->getArg(2);
13794
- if (const auto *templateParmExpr =
13795
- dyn_cast<SubstNonTypeTemplateParmExpr>(alignmentArgExpr)) {
13796
- alignmentArgExpr = templateParmExpr->getReplacement();
13797
- }
13798
- const auto *intLiteral =
13799
- dyn_cast<IntegerLiteral>(alignmentArgExpr->IgnoreImplicit());
13800
- if (intLiteral == nullptr) {
13801
- emitError("alignment argument of vk::RawBufferStore() must be a constant "
13802
- "integer",
13803
- callExpr->getArg(2)->getExprLoc());
13804
- return 0;
13773
+ return nullptr;
13805
13774
}
13806
- return static_cast<uint32_t>(intLiteral->getValue().getZExtValue());
13807
- }
13808
13775
13809
- SpirvInstruction *SpirvEmitter::processRawBufferLoad(const CallExpr *callExpr) {
13810
- uint32_t alignment = getAlignmentForRawBufferLoad(callExpr);
13776
+ uint32_t alignment = callExpr->getNumArgs() == 1
13777
+ ? 4
13778
+ : getRawBufferAlignment(callExpr->getArg(1));
13811
13779
if (alignment == 0)
13812
13780
return nullptr;
13813
13781
@@ -13900,7 +13868,15 @@ SpirvEmitter::storeDataToRawAddress(SpirvInstruction *addressInUInt64,
13900
13868
13901
13869
SpirvInstruction *
13902
13870
SpirvEmitter::processRawBufferStore(const CallExpr *callExpr) {
13903
- uint32_t alignment = getAlignmentForRawBufferStore(callExpr);
13871
+ if (callExpr->getNumArgs() != 2 && callExpr->getNumArgs() != 3) {
13872
+ emitError("number of arguments for vk::RawBufferStore() must be 2 or 3",
13873
+ callExpr->getExprLoc());
13874
+ return nullptr;
13875
+ }
13876
+
13877
+ uint32_t alignment = callExpr->getNumArgs() == 2
13878
+ ? 4
13879
+ : getRawBufferAlignment(callExpr->getArg(2));
13904
13880
if (alignment == 0)
13905
13881
return nullptr;
13906
13882
0 commit comments