|
1 | | -; RUN: llc < %s -asm-verbose=false -disable-wasm-fallthrough-return-opt -wasm-keep-registers -mattr=+sign-ext,+simd128 | FileCheck --check-prefixes=CHECK,NO-TAIL %s |
2 | | -; RUN: llc < %s -asm-verbose=false -disable-wasm-fallthrough-return-opt -wasm-keep-registers -fast-isel -fast-isel-abort=1 -mattr=+sign-ext,+simd128 | FileCheck --check-prefixes=CHECK,NO-TAIL %s |
| 1 | +; RUN: llc < %s -asm-verbose=false -disable-wasm-fallthrough-return-opt -wasm-keep-registers -mattr=+sign-ext,+simd128 | FileCheck --check-prefixes=CHECK,SLOW,NO-TAIL %s |
| 2 | +; RUN: llc < %s -asm-verbose=false -disable-wasm-fallthrough-return-opt -wasm-keep-registers -fast-isel -fast-isel-abort=1 -mattr=+sign-ext,+simd128 | FileCheck --check-prefixes=CHECK,FAST,NO-TAIL %s |
3 | 3 | ; RUN: llc < %s -asm-verbose=false -disable-wasm-fallthrough-return-opt -wasm-keep-registers -mattr=+sign-ext,+simd128,+tail-call | FileCheck --check-prefixes=CHECK,SLOW-TAIL %s |
4 | 4 | ; RUN: llc < %s -asm-verbose=false -disable-wasm-fallthrough-return-opt -wasm-keep-registers -fast-isel -fast-isel-abort=1 -mattr=+sign-ext,+simd128,+tail-call | FileCheck --check-prefixes=CHECK,FAST-TAIL %s |
5 | 5 |
|
@@ -251,6 +251,46 @@ entry: |
251 | 251 | ret void |
252 | 252 | } |
253 | 253 |
|
| 254 | +; Calling non-functional globals should be lowered to call_indirects. |
| 255 | +; CHECK-LABEL: call_indirect_int: |
| 256 | +; CHECK: i32.const $push[[L0:[0-9]+]]=, global_i8 |
| 257 | +; CHECK-NEXT: call_indirect $pop[[L0]] |
| 258 | +; CHECK-NEXT: i32.const $push[[L1:[0-9]+]]=, global_i32 |
| 259 | +; CHECK-NEXT: call_indirect $pop[[L1]] |
| 260 | +@global_i8 = global i8 0 |
| 261 | +@global_i32 = global i32 0 |
| 262 | +define void @call_indirect_int() { |
| 263 | + call void @global_i8() |
| 264 | + call void @global_i32() |
| 265 | + ret void |
| 266 | +} |
| 267 | + |
| 268 | +; Calling aliases of non-functional globals should be lowered to call_indirects. |
| 269 | +; CHECK-LABEL: call_indirect_int_alias: |
| 270 | +; CHECK: i32.const $push[[L0:[0-9]+]]=, global_i8_alias |
| 271 | +; CHECK-NEXT: call_indirect $pop[[L0]] |
| 272 | +; CHECK-NEXT: i32.const $push[[L1:[0-9]+]]=, global_i32_alias |
| 273 | +; CHECK-NEXT: call_indirect $pop[[L1]] |
| 274 | +@global_i8_alias = alias i8, ptr @global_i8 |
| 275 | +@global_i32_alias = alias i32, ptr @global_i32 |
| 276 | +define void @call_indirect_int_alias() { |
| 277 | + call void @global_i8_alias() |
| 278 | + call void @global_i32_alias() |
| 279 | + ret void |
| 280 | +} |
| 281 | + |
| 282 | +; Ideally calling aliases of functions should be lowered to direct calls. We |
| 283 | +; support this in the normal (=slow) isel. |
| 284 | +; CHECK-LABEL: call_func_alias: |
| 285 | +; SLOW: call func_alias |
| 286 | +; FAST: i32.const $push[[L0:[0-9]+]]=, func_alias |
| 287 | +; FAST-NEXT: call_indirect $pop[[L0]] |
| 288 | +@func_alias = alias void (), ptr @call_void_nullary |
| 289 | +define void @call_func_alias() { |
| 290 | + call void @func_alias() |
| 291 | + ret void |
| 292 | +} |
| 293 | + |
254 | 294 | ; TODO: test the following: |
255 | 295 | ; - More argument combinations. |
256 | 296 | ; - Tail call. |
|
0 commit comments