@@ -19448,23 +19448,15 @@ Value *CodeGenFunction::EmitHLSLBuiltinExpr(unsigned BuiltinID,
1944819448 case Builtin::BI__builtin_hlsl_adduint64: {
1944919449 Value *OpA = EmitScalarExpr(E->getArg(0));
1945019450 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() &&
1945319456 "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");
1946619459
19467- llvm::Value *Result = PoisonValue::get(OpA->getType());
1946819460 llvm::Value *LowA;
1946919461 llvm::Value *HighA;
1947019462 llvm::Value *LowB;
@@ -19496,17 +19488,17 @@ Value *CodeGenFunction::EmitHLSLBuiltinExpr(unsigned BuiltinID,
1949619488 llvm::Value *HighSumPlusCarry =
1949719489 Builder.CreateAdd(HighSum, ZExtCarry, "HighSumPlusCarry");
1949819490
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,
1950719493 ArrayRef<int>{0, 2, 1, 3},
1950819494 "hlsl.AddUint64");
1950919495 }
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");
1951019502 return Result;
1951119503 }
1951219504 case Builtin::BI__builtin_hlsl_resource_getpointer: {
0 commit comments