[llvm] [NFC][WebAssembly] Add Fast-ISel test for load-ext (PR #181480)
via llvm-commits
llvm-commits at lists.llvm.org
Sat Feb 14 07:13:52 PST 2026
https://github.com/ParkHanbum updated https://github.com/llvm/llvm-project/pull/181480
>From e591dac4390754c73b0b0d3f31fb9a5de3973afb Mon Sep 17 00:00:00 2001
From: Hanbum Park <kese111 at gmail.com>
Date: Sat, 14 Feb 2026 23:13:05 +0900
Subject: [PATCH 1/2] [NFC][WebAssembly] Add Fast-ISEl test for load-ext
In relation to issue #179672, updating load-ext.ll to
enable testing of Fast-isel.
---
llvm/test/CodeGen/WebAssembly/load-ext.ll | 97 ++++++++++++++++++-----
1 file changed, 75 insertions(+), 22 deletions(-)
diff --git a/llvm/test/CodeGen/WebAssembly/load-ext.ll b/llvm/test/CodeGen/WebAssembly/load-ext.ll
index 290616de0fffe..686036f1af780 100644
--- a/llvm/test/CodeGen/WebAssembly/load-ext.ll
+++ b/llvm/test/CodeGen/WebAssembly/load-ext.ll
@@ -1,11 +1,20 @@
-; RUN: llc < %s --mtriple=wasm32-unknown-unknown -asm-verbose=false -disable-wasm-fallthrough-return-opt -wasm-disable-explicit-locals -wasm-keep-registers | FileCheck %s
-; RUN: llc < %s --mtriple=wasm64-unknown-unknown -asm-verbose=false -disable-wasm-fallthrough-return-opt -wasm-disable-explicit-locals -wasm-keep-registers | FileCheck %s
+; RUN: llc < %s --mtriple=wasm32-unknown-unknown -asm-verbose=false -disable-wasm-fallthrough-return-opt -wasm-disable-explicit-locals -wasm-keep-registers | FileCheck %s --check-prefixes=CHECK,SLOW
+; RUN: llc < %s --mtriple=wasm32-unknown-unknown -asm-verbose=false -disable-wasm-fallthrough-return-opt -wasm-disable-explicit-locals -wasm-keep-registers -fast-isel -fast-isel-abort=1 | FileCheck %s --check-prefixes=CHECK,FAST
+; RUN: llc < %s --mtriple=wasm64-unknown-unknown -asm-verbose=false -disable-wasm-fallthrough-return-opt -wasm-disable-explicit-locals -wasm-keep-registers | FileCheck %s --check-prefixes=CHECK,SLOW
+; RUN: llc < %s --mtriple=wasm64-unknown-unknown -asm-verbose=false -disable-wasm-fallthrough-return-opt -wasm-disable-explicit-locals -wasm-keep-registers -fast-isel -fast-isel-abort=1 | FileCheck %s --check-prefixes=CHECK,FAST
; Test that extending loads are assembled properly.
; CHECK-LABEL: sext_i8_i32:
-; CHECK: i32.load8_s $push0=, 0($0){{$}}
-; CHECK-NEXT: return $pop0{{$}}
+; SLOW: i32.load8_s $push0=, 0($0){{$}}
+; SLOW-NEXT: return $pop0{{$}}
+; FAST: i32.load8_u $push[[NUM1:[0-9]+]]=, 0($0)
+; FAST-NEXT: i32.const $push[[NUM2:[0-9]+]]=, 24
+; FAST-NEXT: i32.shl $push[[NUM3:[0-9]+]]=, $pop[[NUM1]], $pop[[NUM2]]
+; FAST-NEXT: i32.const $push[[NUM4:[0-9]+]]=, 24
+; FAST-NEXT: i32.shr_s $push[[NUM5:[0-9]+]]=, $pop[[NUM3]], $pop[[NUM4]]
+; FAST-NEXT: return $pop[[NUM5]]
+; CHECK: end_function
define i32 @sext_i8_i32(ptr %p) {
%v = load i8, ptr %p
%e = sext i8 %v to i32
@@ -13,8 +22,12 @@ define i32 @sext_i8_i32(ptr %p) {
}
; CHECK-LABEL: zext_i8_i32:
-; CHECK: i32.load8_u $push0=, 0($0){{$}}
-; CHECK-NEXT: return $pop0{{$}}
+; SLOW: i32.load8_u $push0=, 0($0){{$}}
+; SLOW-NEXT: return $pop0{{$}}
+; FAST: i32.load8_u $push[[L:[0-9]+]]=, 0($0)
+; FAST-NEXT: i32.const $push[[C:[0-9]+]]=, 255
+; FAST-NEXT: i32.and $push[[R:[0-9]+]]=, $pop[[L]], $pop[[C]]
+; FAST-NEXT: return $pop[[R]]
define i32 @zext_i8_i32(ptr %p) {
%v = load i8, ptr %p
%e = zext i8 %v to i32
@@ -22,8 +35,14 @@ define i32 @zext_i8_i32(ptr %p) {
}
; CHECK-LABEL: sext_i16_i32:
-; CHECK: i32.load16_s $push0=, 0($0){{$}}
-; CHECK-NEXT: return $pop0{{$}}
+; SLOW: i32.load16_s $push0=, 0($0){{$}}
+; SLOW-NEXT: return $pop0{{$}}
+; FAST: i32.load16_u $push[[L:[0-9]+]]=, 0($0)
+; FAST-NEXT: i32.const $push[[C1:[0-9]+]]=, 16
+; FAST-NEXT: i32.shl $push[[SHL:[0-9]+]]=, $pop[[L]], $pop[[C1]]
+; FAST-NEXT: i32.const $push[[C2:[0-9]+]]=, 16
+; FAST-NEXT: i32.shr_s $push[[SHR:[0-9]+]]=, $pop[[SHL]], $pop[[C2]]
+; FAST-NEXT: return $pop[[SHR]]
define i32 @sext_i16_i32(ptr %p) {
%v = load i16, ptr %p
%e = sext i16 %v to i32
@@ -31,8 +50,12 @@ define i32 @sext_i16_i32(ptr %p) {
}
; CHECK-LABEL: zext_i16_i32:
-; CHECK: i32.load16_u $push0=, 0($0){{$}}
-; CHECK-NEXT: return $pop0{{$}}
+; SLOW: i32.load16_u $push0=, 0($0){{$}}
+; SLOW-NEXT: return $pop0{{$}}
+; FAST: i32.load16_u $push[[L:[0-9]+]]=, 0($0)
+; FAST-NEXT: i32.const $push[[C:[0-9]+]]=, 65535
+; FAST-NEXT: i32.and $push[[R:[0-9]+]]=, $pop[[L]], $pop[[C]]
+; FAST-NEXT: return $pop[[R]]
define i32 @zext_i16_i32(ptr %p) {
%v = load i16, ptr %p
%e = zext i16 %v to i32
@@ -40,8 +63,15 @@ define i32 @zext_i16_i32(ptr %p) {
}
; CHECK-LABEL: sext_i8_i64:
-; CHECK: i64.load8_s $push0=, 0($0){{$}}
-; CHECK-NEXT: return $pop0{{$}}
+; SLOW: i64.load8_s $push0=, 0($0){{$}}
+; SLOW-NEXT: return $pop0{{$}}
+; FAST: i32.load8_u $push[[L:[0-9]+]]=, 0($0)
+; FAST-NEXT: i32.const $push[[C1:[0-9]+]]=, 24
+; FAST-NEXT: i32.shl $push[[SHL:[0-9]+]]=, $pop[[L]], $pop[[C1]]
+; FAST-NEXT: i32.const $push[[C2:[0-9]+]]=, 24
+; FAST-NEXT: i32.shr_s $push[[SHR:[0-9]+]]=, $pop[[SHL]], $pop[[C2]]
+; FAST-NEXT: i64.extend_i32_s $push[[EXT:[0-9]+]]=, $pop[[SHR]]
+; FAST-NEXT: return $pop[[EXT]]
define i64 @sext_i8_i64(ptr %p) {
%v = load i8, ptr %p
%e = sext i8 %v to i64
@@ -49,8 +79,13 @@ define i64 @sext_i8_i64(ptr %p) {
}
; CHECK-LABEL: zext_i8_i64:
-; CHECK: i64.load8_u $push0=, 0($0){{$}}
-; CHECK-NEXT: return $pop0{{$}}
+; SLOW: i64.load8_u $push0=, 0($0){{$}}
+; SLOW-NEXT: return $pop0{{$}}
+; FAST: i32.load8_u $push[[L:[0-9]+]]=, 0($0)
+; FAST-NEXT: i32.const $push[[C:[0-9]+]]=, 255
+; FAST-NEXT: i32.and $push[[AND:[0-9]+]]=, $pop[[L]], $pop[[C]]
+; FAST-NEXT: i64.extend_i32_u $push[[EXT:[0-9]+]]=, $pop[[AND]]
+; FAST-NEXT: return $pop[[EXT]]
define i64 @zext_i8_i64(ptr %p) {
%v = load i8, ptr %p
%e = zext i8 %v to i64
@@ -58,8 +93,15 @@ define i64 @zext_i8_i64(ptr %p) {
}
; CHECK-LABEL: sext_i16_i64:
-; CHECK: i64.load16_s $push0=, 0($0){{$}}
-; CHECK-NEXT: return $pop0{{$}}
+; SLOW: i64.load16_s $push0=, 0($0){{$}}
+; SLOW-NEXT: return $pop0{{$}}
+; FAST: i32.load16_u $push[[L:[0-9]+]]=, 0($0)
+; FAST-NEXT: i32.const $push[[C1:[0-9]+]]=, 16
+; FAST-NEXT: i32.shl $push[[SHL:[0-9]+]]=, $pop[[L]], $pop[[C1]]
+; FAST-NEXT: i32.const $push[[C2:[0-9]+]]=, 16
+; FAST-NEXT: i32.shr_s $push[[SHR:[0-9]+]]=, $pop[[SHL]], $pop[[C2]]
+; FAST-NEXT: i64.extend_i32_s $push[[EXT:[0-9]+]]=, $pop[[SHR]]
+; FAST-NEXT: return $pop[[EXT]]
define i64 @sext_i16_i64(ptr %p) {
%v = load i16, ptr %p
%e = sext i16 %v to i64
@@ -67,8 +109,13 @@ define i64 @sext_i16_i64(ptr %p) {
}
; CHECK-LABEL: zext_i16_i64:
-; CHECK: i64.load16_u $push0=, 0($0){{$}}
-; CHECK-NEXT: return $pop0{{$}}
+; SLOW: i64.load16_u $push0=, 0($0){{$}}
+; SLOW-NEXT: return $pop0{{$}}
+; FAST: i32.load16_u $push[[L:[0-9]+]]=, 0($0)
+; FAST-NEXT: i32.const $push[[C:[0-9]+]]=, 65535
+; FAST-NEXT: i32.and $push[[AND:[0-9]+]]=, $pop[[L]], $pop[[C]]
+; FAST-NEXT: i64.extend_i32_u $push[[EXT:[0-9]+]]=, $pop[[AND]]
+; FAST-NEXT: return $pop[[EXT]]
define i64 @zext_i16_i64(ptr %p) {
%v = load i16, ptr %p
%e = zext i16 %v to i64
@@ -76,8 +123,11 @@ define i64 @zext_i16_i64(ptr %p) {
}
; CHECK-LABEL: sext_i32_i64:
-; CHECK: i64.load32_s $push0=, 0($0){{$}}
-; CHECK-NEXT: return $pop0{{$}}
+; SLOW: i64.load32_s $push0=, 0($0){{$}}
+; SLOW-NEXT: return $pop0{{$}}
+; FAST: i32.load $push[[L:[0-9]+]]=, 0($0)
+; FAST-NEXT: i64.extend_i32_s $push[[EXT:[0-9]+]]=, $pop[[L]]
+; FAST-NEXT: return $pop[[EXT]]
define i64 @sext_i32_i64(ptr %p) {
%v = load i32, ptr %p
%e = sext i32 %v to i64
@@ -85,8 +135,11 @@ define i64 @sext_i32_i64(ptr %p) {
}
; CHECK-LABEL: zext_i32_i64:
-; CHECK: i64.load32_u $push0=, 0($0){{$}}
-; CHECK: return $pop0{{$}}
+; SLOW: i64.load32_u $push0=, 0($0){{$}}
+; SLOW-NEXT: return $pop0{{$}}
+; FAST: i32.load $push[[L:[0-9]+]]=, 0($0)
+; FAST-NEXT: i64.extend_i32_u $push[[EXT:[0-9]+]]=, $pop[[L]]
+; FAST-NEXT: return $pop[[EXT]]
define i64 @zext_i32_i64(ptr %p) {
%v = load i32, ptr %p
%e = zext i32 %v to i64
>From 0a1339d4155490954cf94f2de2fa1361304c57d7 Mon Sep 17 00:00:00 2001
From: Hanbum Park <kese111 at gmail.com>
Date: Sun, 15 Feb 2026 00:11:18 +0900
Subject: [PATCH 2/2] update recently
---
llvm/test/CodeGen/WebAssembly/load-ext.ll | 37 ++++++++---------------
1 file changed, 12 insertions(+), 25 deletions(-)
diff --git a/llvm/test/CodeGen/WebAssembly/load-ext.ll b/llvm/test/CodeGen/WebAssembly/load-ext.ll
index 686036f1af780..c2e72f95a0b0a 100644
--- a/llvm/test/CodeGen/WebAssembly/load-ext.ll
+++ b/llvm/test/CodeGen/WebAssembly/load-ext.ll
@@ -8,13 +8,9 @@
; CHECK-LABEL: sext_i8_i32:
; SLOW: i32.load8_s $push0=, 0($0){{$}}
; SLOW-NEXT: return $pop0{{$}}
-; FAST: i32.load8_u $push[[NUM1:[0-9]+]]=, 0($0)
-; FAST-NEXT: i32.const $push[[NUM2:[0-9]+]]=, 24
-; FAST-NEXT: i32.shl $push[[NUM3:[0-9]+]]=, $pop[[NUM1]], $pop[[NUM2]]
-; FAST-NEXT: i32.const $push[[NUM4:[0-9]+]]=, 24
-; FAST-NEXT: i32.shr_s $push[[NUM5:[0-9]+]]=, $pop[[NUM3]], $pop[[NUM4]]
-; FAST-NEXT: return $pop[[NUM5]]
-; CHECK: end_function
+; FAST: i32.load8_u $push[[L:[0-9]+]]=, 0($0)
+; FAST-NEXT: i32.extend8_s $push[[EXT:[0-9]+]]=, $pop[[L]]
+; FAST-NEXT: return $pop[[EXT]]
define i32 @sext_i8_i32(ptr %p) {
%v = load i8, ptr %p
%e = sext i8 %v to i32
@@ -37,12 +33,9 @@ define i32 @zext_i8_i32(ptr %p) {
; CHECK-LABEL: sext_i16_i32:
; SLOW: i32.load16_s $push0=, 0($0){{$}}
; SLOW-NEXT: return $pop0{{$}}
-; FAST: i32.load16_u $push[[L:[0-9]+]]=, 0($0)
-; FAST-NEXT: i32.const $push[[C1:[0-9]+]]=, 16
-; FAST-NEXT: i32.shl $push[[SHL:[0-9]+]]=, $pop[[L]], $pop[[C1]]
-; FAST-NEXT: i32.const $push[[C2:[0-9]+]]=, 16
-; FAST-NEXT: i32.shr_s $push[[SHR:[0-9]+]]=, $pop[[SHL]], $pop[[C2]]
-; FAST-NEXT: return $pop[[SHR]]
+; FAST: i32.load16_u $push[[L:[0-9]+]]=, 0($0)
+; FAST-NEXT: i32.extend16_s $push[[EXT:[0-9]+]]=, $pop[[L]]
+; FAST-NEXT: return $pop[[EXT]]
define i32 @sext_i16_i32(ptr %p) {
%v = load i16, ptr %p
%e = sext i16 %v to i32
@@ -66,12 +59,9 @@ define i32 @zext_i16_i32(ptr %p) {
; SLOW: i64.load8_s $push0=, 0($0){{$}}
; SLOW-NEXT: return $pop0{{$}}
; FAST: i32.load8_u $push[[L:[0-9]+]]=, 0($0)
-; FAST-NEXT: i32.const $push[[C1:[0-9]+]]=, 24
-; FAST-NEXT: i32.shl $push[[SHL:[0-9]+]]=, $pop[[L]], $pop[[C1]]
-; FAST-NEXT: i32.const $push[[C2:[0-9]+]]=, 24
-; FAST-NEXT: i32.shr_s $push[[SHR:[0-9]+]]=, $pop[[SHL]], $pop[[C2]]
-; FAST-NEXT: i64.extend_i32_s $push[[EXT:[0-9]+]]=, $pop[[SHR]]
-; FAST-NEXT: return $pop[[EXT]]
+; FAST-NEXT: i64.extend_i32_u $push[[EXT32:[0-9]+]]=, $pop[[L]]
+; FAST-NEXT: i64.extend8_s $push[[EXT8:[0-9]+]]=, $pop[[EXT32]]
+; FAST-NEXT: return $pop[[EXT8]]
define i64 @sext_i8_i64(ptr %p) {
%v = load i8, ptr %p
%e = sext i8 %v to i64
@@ -96,12 +86,9 @@ define i64 @zext_i8_i64(ptr %p) {
; SLOW: i64.load16_s $push0=, 0($0){{$}}
; SLOW-NEXT: return $pop0{{$}}
; FAST: i32.load16_u $push[[L:[0-9]+]]=, 0($0)
-; FAST-NEXT: i32.const $push[[C1:[0-9]+]]=, 16
-; FAST-NEXT: i32.shl $push[[SHL:[0-9]+]]=, $pop[[L]], $pop[[C1]]
-; FAST-NEXT: i32.const $push[[C2:[0-9]+]]=, 16
-; FAST-NEXT: i32.shr_s $push[[SHR:[0-9]+]]=, $pop[[SHL]], $pop[[C2]]
-; FAST-NEXT: i64.extend_i32_s $push[[EXT:[0-9]+]]=, $pop[[SHR]]
-; FAST-NEXT: return $pop[[EXT]]
+; FAST-NEXT: i64.extend_i32_u $push[[EXT32:[0-9]+]]=, $pop[[L]]
+; FAST-NEXT: i64.extend16_s $push[[EXT16:[0-9]+]]=, $pop[[EXT32]]
+; FAST-NEXT: return $pop[[EXT16]]
define i64 @sext_i16_i64(ptr %p) {
%v = load i16, ptr %p
%e = sext i16 %v to i64
More information about the llvm-commits
mailing list