aboutsummaryrefslogtreecommitdiff
path: root/llvm/test/Transforms/InstSimplify/ConstProp/WebAssembly/dot.ll
blob: b537b7bccf861028528efd2747de897d50daa4df (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --version 5

; RUN: opt -passes=instsimplify -S < %s | FileCheck %s

; Test that intrinsics wasm dot call are constant folded

target triple = "wasm32-unknown-unknown"


define <4 x i32> @dot_zero() {
; CHECK-LABEL: define <4 x i32> @dot_zero() {
; CHECK-NEXT:    ret <4 x i32> zeroinitializer
;
  %res = tail call <4 x i32> @llvm.wasm.dot(<8 x i16> zeroinitializer, <8 x i16> zeroinitializer)
  ret <4 x i32> %res
}

; a               =   1    2    3    4    5    6    7    8
; b               =   1    2    3    4    5    6    7    8
; k1|k2 = a * b   =   1    4    9   16   25   36   49   64
; k1 + k2         =   (1+4) |  (9 + 16) | (25 + 36)  | (49 + 64)
; result          =    5    |   25    |   61    |   113
define <4 x i32> @dot_nonzero() {
; CHECK-LABEL: define <4 x i32> @dot_nonzero() {
; CHECK-NEXT:    ret <4 x i32> <i32 5, i32 25, i32 61, i32 113>
;
  %res = tail call <4 x i32> @llvm.wasm.dot(<8 x i16> <i16 1, i16 2, i16 3, i16 4, i16 5, i16 6, i16 7, i16 8>, <8 x i16> <i16 1, i16 2, i16 3, i16 4, i16 5, i16 6, i16 7, i16 8>)
  ret <4 x i32> %res
}

define <4 x i32> @dot_doubly_negative() {
; CHECK-LABEL: define <4 x i32> @dot_doubly_negative() {
; CHECK-NEXT:    ret <4 x i32> splat (i32 2)
;
  %res = tail call <4 x i32> @llvm.wasm.dot(<8 x i16> <i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1>, <8 x i16> <i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1>)
  ret <4 x i32> %res
}

; Tests that i16 max signed values fit in i32
define <4 x i32> @dot_follow_modulo_spec_1() {
; CHECK-LABEL: define <4 x i32> @dot_follow_modulo_spec_1() {
; CHECK-NEXT:    ret <4 x i32> <i32 2147352578, i32 0, i32 0, i32 0>
;
  %res = tail call <4 x i32> @llvm.wasm.dot(<8 x i16> <i16 32767, i16 32767, i16 0, i16 0, i16 0, i16 0, i16 0, i16 0>, <8 x i16> <i16 32767, i16 32767, i16 0, i16 0, i16 0, i16 0, i16 0, i16 0>)
  ret <4 x i32> %res
}

; Tests that i16 min signed values fit in i32
define <4 x i32> @dot_follow_modulo_spec_2() {
; CHECK-LABEL: define <4 x i32> @dot_follow_modulo_spec_2() {
; CHECK-NEXT:    ret <4 x i32> <i32 -2147483648, i32 0, i32 0, i32 0>
;
  %res = tail call <4 x i32> @llvm.wasm.dot(<8 x i16> <i16 -32768, i16 -32768, i16 0, i16 0, i16 0, i16 0, i16 0, i16 0>, <8 x i16> <i16 -32768, i16 -32768, i16 0, i16 0, i16 0, i16 0, i16 0, i16 0>)
  ret <4 x i32> %res
}