<div dir="ltr"><div><div><div>Hi,<br></div>Please find enclosed a patch to resolve PR20018. According to the x86-64 ABI, structures with both floating point and integer members are split between floating-point and general purpose registers, and consecutive 32-bit floats can be packed into a single floating point register. In variadic functions, clang writes out the state of the GP registers and FP registers to different regions in memory. A bug in the TargetInfo logic is causing llvm to try to read floating point arguments from the FP region of the stack. Specifically:<br>
<br>02593     llvm::Value *RegLoAddr = TyLo->isFloatingPointTy() ? FPAddr : GPAddr;<br>02594     llvm::Value *RegHiAddr = TyLo->isFloatingPointTy() ? GPAddr : FPAddr;<br><br></div>Are checking if TyLo is a floating point type, however, two consecutive floating point fields will be represented as an floating point vector. Consequently, the correct code should be:<br>
<br>02593    llvm::Value *RegLoAddr = TyLo->isFPOrFPVectorTy() ? FPAddr : GPAddr;<br>02594    llvm::Value *RegHiAddr = TyLo->isFPOrFPVectorTy() ? GPAddr : FPAddr;<br><br></div>The code on line 2623 is already checking for floating point vectors appropriately. I have also attached a simple test case named gpfpTest.c. Thanks.<br>
Tom<br></div>