@@ -853,10 +853,8 @@ static bool CanCoerceMustAliasedValueToLoad(Value *StoredVal,
853853 StoredVal->getType ()->isArrayTy ())
854854 return false ;
855855
856- // HLSL Change Begin - Don't coerce min precision vector types where
857- // getTypeSizeInBits uses padded element sizes (e.g., <3 x half> = 96 bits)
858- // but getPrimitiveSizeInBits returns the unpadded width (48 bits).
859- // The coercion would create a bitcast between these mismatched sizes.
856+ // HLSL Change Begin - Reject types where padded and primitive sizes differ.
857+ // Coercion would create bitcasts between mismatched sizes.
860858 Type *StoredValTy = StoredVal->getType ();
861859 uint64_t StoredPrimBits = StoredValTy->getPrimitiveSizeInBits ();
862860 uint64_t LoadPrimBits = LoadTy->getPrimitiveSizeInBits ();
@@ -1955,13 +1953,8 @@ bool GVN::processLoad(LoadInst *L) {
19551953 if (StoreInst *DepSI = dyn_cast<StoreInst>(DepInst)) {
19561954 Value *StoredVal = DepSI->getValueOperand ();
19571955
1958- // HLSL Change Begin - Don't forward stores of padded types when the load
1959- // type differs (e.g., min precision vectors where i16:32/f16:32 means
1960- // elements are padded to 32 bits). BasicAA returns MustAlias at offset 0
1961- // regardless of access sizes, so a partial element store can appear as a
1962- // Def to MemoryDependence. CanCoerceMustAliasedValueToLoad catches this,
1963- // but we add a defense-in-depth check here for cross-type forwarding of
1964- // padded types. Same-type forwarding is always safe.
1956+ // HLSL Change Begin - Defense-in-depth: skip cross-type forwarding for
1957+ // padded types (e.g., min precision vectors).
19651958 if (StoredVal->getType () != L->getType ()) {
19661959 Type *StoredTy = StoredVal->getType ();
19671960 uint64_t StoredPrimBits = StoredTy->getPrimitiveSizeInBits ();
0 commit comments