blob: 924eefb83cb1b39d417819fd1dbea3749a78b1e5 [file] [log] [blame]
Thomas Lively6ff31fe2018-10-31 23:50:53 +00001; RUN: llc -o - %s -asm-verbose=false -wasm-keep-registers -disable-wasm-fallthrough-return-opt -mattr=+simd128 | FileCheck %s
2
Dan Gohmane81021a2016-11-08 19:40:38 +00003target datalayout = "e-m:e-p:32:32-i64:64-n32:64-S128"
Sam Clegga5908002018-05-10 17:49:11 +00004target triple = "wasm32-unknown-unknown"
Dan Gohmane81021a2016-11-08 19:40:38 +00005
6; Test that stackified IMPLICIT_DEF instructions are converted into
Thomas Lively6ff31fe2018-10-31 23:50:53 +00007; CONST_XXX instructions to provide an explicit push.
Dan Gohmane81021a2016-11-08 19:40:38 +00008
Thomas Lively6ff31fe2018-10-31 23:50:53 +00009; CHECK-LABEL: implicit_def_i32:
Heejin Ahnef9d6ae2019-03-05 20:35:34 +000010; CHECK: i32.const $push{{[0-9]+}}=, 0{{$}}
11; CHECK: i32.const $push{{[0-9]+}}=, 0{{$}}
12; CHECK: i32.const $push[[R:[0-9]+]]=, 0{{$}}
Thomas Lively6ff31fe2018-10-31 23:50:53 +000013; CHECK-NEXT: return $pop[[R]]{{$}}
Thomas Lively6ff31fe2018-10-31 23:50:53 +000014define i32 @implicit_def_i32() {
15 br i1 undef, label %A, label %X
Dan Gohmane81021a2016-11-08 19:40:38 +000016
Thomas Lively6ff31fe2018-10-31 23:50:53 +000017A: ; preds = %0
18 %d = icmp slt i1 0, 0
19 br i1 %d, label %C, label %B
20
21B: ; preds = %A
22 br label %C
23
24C: ; preds = %B, %A
25 %h = phi i32 [ undef, %A ], [ 0, %B ]
Dan Gohmane81021a2016-11-08 19:40:38 +000026 br label %X
27
Thomas Lively6ff31fe2018-10-31 23:50:53 +000028X: ; preds = %0, C
29 %i = phi i32 [ 1, %0 ], [ %h, %C ]
30 ret i32 %i
Dan Gohmane81021a2016-11-08 19:40:38 +000031}
32
Thomas Lively6ff31fe2018-10-31 23:50:53 +000033; CHECK-LABEL: implicit_def_i64:
Heejin Ahnef9d6ae2019-03-05 20:35:34 +000034; CHECK: i64.const $push[[R:[0-9]+]]=, 0{{$}}
Thomas Lively6ff31fe2018-10-31 23:50:53 +000035; CHECK-NEXT: return $pop[[R]]{{$}}
Thomas Lively6ff31fe2018-10-31 23:50:53 +000036define i64 @implicit_def_i64() {
37 br i1 undef, label %A, label %X
38
39A: ; preds = %0
40 %d = icmp slt i1 0, 0
41 br i1 %d, label %C, label %B
42
43B: ; preds = %A
44 br label %C
45
46C: ; preds = %B, %A
47 %h = phi i64 [ undef, %A ], [ 0, %B ]
48 br label %X
49
50X: ; preds = %0, C
51 %i = phi i64 [ 1, %0 ], [ %h, %C ]
52 ret i64 %i
53}
54
55; CHECK-LABEL: implicit_def_f32:
Heejin Ahnef9d6ae2019-03-05 20:35:34 +000056; CHECK: f32.const $push[[R:[0-9]+]]=, 0x0p0{{$}}
Thomas Lively6ff31fe2018-10-31 23:50:53 +000057; CHECK-NEXT: return $pop[[R]]{{$}}
Thomas Lively6ff31fe2018-10-31 23:50:53 +000058define float @implicit_def_f32() {
59 br i1 undef, label %A, label %X
60
61A: ; preds = %0
62 %d = icmp slt i1 0, 0
63 br i1 %d, label %C, label %B
64
65B: ; preds = %A
66 br label %C
67
68C: ; preds = %B, %A
69 %h = phi float [ undef, %A ], [ 0.0, %B ]
70 br label %X
71
72X: ; preds = %0, C
73 %i = phi float [ 1.0, %0 ], [ %h, %C ]
74 ret float %i
75}
76
77; CHECK-LABEL: implicit_def_f64:
Heejin Ahnef9d6ae2019-03-05 20:35:34 +000078; CHECK: f64.const $push[[R:[0-9]+]]=, 0x0p0{{$}}
Thomas Lively6ff31fe2018-10-31 23:50:53 +000079; CHECK-NEXT: return $pop[[R]]{{$}}
Thomas Lively6ff31fe2018-10-31 23:50:53 +000080define double @implicit_def_f64() {
81 br i1 undef, label %A, label %X
82
83A: ; preds = %0
84 %d = icmp slt i1 0, 0
85 br i1 %d, label %C, label %B
86
87B: ; preds = %A
88 br label %C
89
90C: ; preds = %B, %A
91 %h = phi double [ undef, %A ], [ 0.0, %B ]
92 br label %X
93
94X: ; preds = %0, C
95 %i = phi double [ 1.0, %0 ], [ %h, %C ]
96 ret double %i
97}
98
99; CHECK-LABEL: implicit_def_v4i32:
Heejin Ahnef9d6ae2019-03-05 20:35:34 +0000100; CHECK: i32.const $push{{[0-9]+}}=, 0{{$}}
101; CHECK: i32.const $push{{[0-9]+}}=, 0{{$}}
102; CHECK: i32.const $push[[L0:[0-9]+]]=, 0{{$}}
Thomas Livelyfeb18fe2018-12-20 04:20:32 +0000103; CHECK-NEXT: i32x4.splat $push[[R:[0-9]+]]=, $pop[[L0]]
Thomas Lively6ff31fe2018-10-31 23:50:53 +0000104; CHECK-NEXT: return $pop[[R]]{{$}}
Thomas Lively6ff31fe2018-10-31 23:50:53 +0000105define <4 x i32> @implicit_def_v4i32() {
106 br i1 undef, label %A, label %X
107
108A: ; preds = %0
109 %d = icmp slt i1 0, 0
110 br i1 %d, label %C, label %B
111
112B: ; preds = %A
113 br label %C
114
115C: ; preds = %B, %A
116 %h = phi <4 x i32> [ undef, %A ], [ <i32 0, i32 0, i32 0, i32 0>, %B ]
117 br label %X
118
119X: ; preds = %0, C
120 %i = phi <4 x i32> [ <i32 1, i32 1, i32 1, i32 1>, %0 ], [ %h, %C ]
121 ret <4 x i32> %i
122}