[WebAssembly] Look through freeze nodes when folding vector load + ext (#185143)

When folding loads with extensions, the extension operand can be a freeze node
in addition to a load. We can look through it to do the desirability check.

Fixes #184676
This commit is contained in:
Derek Schuff 2026-03-10 19:15:53 -07:00 committed by GitHub
parent 53a2fd99aa
commit e950a806f0
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
2 changed files with 23 additions and 1 deletions

View file

@ -1044,7 +1044,13 @@ bool WebAssemblyTargetLowering::isIntDivCheap(EVT VT,
bool WebAssemblyTargetLowering::isVectorLoadExtDesirable(SDValue ExtVal) const {
EVT ExtT = ExtVal.getValueType();
EVT MemT = cast<LoadSDNode>(ExtVal->getOperand(0))->getValueType(0);
SDValue N0 = ExtVal->getOperand(0);
if (N0.getOpcode() == ISD::FREEZE)
N0 = N0.getOperand(0);
auto *Load = dyn_cast<LoadSDNode>(N0);
if (!Load)
return false;
EVT MemT = Load->getValueType(0);
return (ExtT == MVT::v8i16 && MemT == MVT::v8i8) ||
(ExtT == MVT::v4i32 && MemT == MVT::v4i16) ||
(ExtT == MVT::v2i64 && MemT == MVT::v2i32);

View file

@ -3644,3 +3644,19 @@ define void @store_v2f64_to_global_address(<2 x double> %v) {
store <2 x double> %v , ptr @gv_v2f64
ret void
}
; Test that load extends can fold through freeze nodes
define <4 x i16> @test_freeze_zext(ptr %in) {
; CHECK-LABEL: test_freeze_zext:
; CHECK: .functype test_freeze_zext (i32) -> (v128)
; CHECK-NEXT: # %bb.0: # %entry
; CHECK-NEXT: local.get 0
; CHECK-NEXT: v128.load32_zero 0:p2align=0
; CHECK-NEXT: i16x8.extend_low_i8x16_u
; CHECK-NEXT: # fallthrough-return
entry:
%t = load <4 x i8>, ptr %in, align 1
%t.fr = freeze <4 x i8> %t
%w = zext <4 x i8> %t.fr to <4 x i16>
ret <4 x i16> %w
}