@@ -19448,23 +19448,15 @@ Value *CodeGenFunction::EmitHLSLBuiltinExpr(unsigned BuiltinID,
19448
19448
case Builtin::BI__builtin_hlsl_adduint64: {
19449
19449
Value *OpA = EmitScalarExpr(E->getArg(0));
19450
19450
Value *OpB = EmitScalarExpr(E->getArg(1));
19451
- assert(E->getArg(0)->getType()->hasIntegerRepresentation() &&
19452
- E->getArg(1)->getType()->hasIntegerRepresentation() &&
19451
+ QualType Arg0Ty = E->getArg(0)->getType();
19452
+ uint64_t NumElements = Arg0Ty->castAs<VectorType>()->getNumElements();
19453
+ assert(Arg0Ty == E->getArg(1)->getType() &&
19454
+ "AddUint64 operand types must match");
19455
+ assert(Arg0Ty->hasIntegerRepresentation() &&
19453
19456
"AddUint64 operands must have an integer representation");
19454
- assert(((E->getArg(0)->getType()->castAs<VectorType>()->getNumElements() ==
19455
- 2 &&
19456
- E->getArg(1)->getType()->castAs<VectorType>()->getNumElements() ==
19457
- 2) ||
19458
- (E->getArg(0)->getType()->castAs<VectorType>()->getNumElements() ==
19459
- 4 &&
19460
- E->getArg(1)->getType()->castAs<VectorType>()->getNumElements() ==
19461
- 4)) &&
19462
- "input vectors must have 2 or 4 elements each");
19463
-
19464
- uint64_t NumElements =
19465
- E->getArg(0)->getType()->castAs<VectorType>()->getNumElements();
19457
+ assert((NumElements == 2 || NumElements == 4) &&
19458
+ "AddUint64 operands must have 2 or 4 elements");
19466
19459
19467
- llvm::Value *Result = PoisonValue::get(OpA->getType());
19468
19460
llvm::Value *LowA;
19469
19461
llvm::Value *HighA;
19470
19462
llvm::Value *LowB;
@@ -19496,17 +19488,17 @@ Value *CodeGenFunction::EmitHLSLBuiltinExpr(unsigned BuiltinID,
19496
19488
llvm::Value *HighSumPlusCarry =
19497
19489
Builder.CreateAdd(HighSum, ZExtCarry, "HighSumPlusCarry");
19498
19490
19499
- // Insert the low and high word sums into the result vector
19500
- if (NumElements == 2) {
19501
- Result = Builder.CreateInsertElement(Result, LowSum, (uint64_t)0,
19502
- "hlsl.AddUint64.upto0");
19503
- Result = Builder.CreateInsertElement(Result, HighSumPlusCarry,
19504
- (uint64_t)1, "hlsl.AddUint64");
19505
- } else { /* NumElements == 4 */
19506
- Result = Builder.CreateShuffleVector(LowSum, HighSumPlusCarry,
19491
+ if (NumElements == 4) {
19492
+ return Builder.CreateShuffleVector(LowSum, HighSumPlusCarry,
19507
19493
ArrayRef<int>{0, 2, 1, 3},
19508
19494
"hlsl.AddUint64");
19509
19495
}
19496
+
19497
+ llvm::Value *Result = PoisonValue::get(OpA->getType());
19498
+ Result = Builder.CreateInsertElement(Result, LowSum, (uint64_t)0,
19499
+ "hlsl.AddUint64.upto0");
19500
+ Result = Builder.CreateInsertElement(Result, HighSumPlusCarry, (uint64_t)1,
19501
+ "hlsl.AddUint64");
19510
19502
return Result;
19511
19503
}
19512
19504
case Builtin::BI__builtin_hlsl_resource_getpointer: {
0 commit comments