Re-land [openmp] Fix warnings when building on Windows with latest MSVC or Clang...
[llvm-project.git] / llvm / test / CodeGen / WebAssembly / implicit-def.ll
blob6c5cbab889ad8eb436391272163e503c3f1ad60d
1 ; RUN: llc -o - %s -asm-verbose=false -wasm-keep-registers -disable-wasm-fallthrough-return-opt -mattr=+simd128 | FileCheck %s
3 target triple = "wasm32-unknown-unknown"
5 ; Test that stackified IMPLICIT_DEF instructions are converted into
6 ; CONST_XXX instructions to provide an explicit push.
8 ; CHECK-LABEL: implicit_def_i32:
9 ; CHECK:      i32.const $push{{[0-9]+}}=, 0{{$}}
10 ; CHECK:      i32.const $push{{[0-9]+}}=, 0{{$}}
11 ; CHECK:      i32.const $push[[R:[0-9]+]]=, 0{{$}}
12 ; CHECK-NEXT: return $pop[[R]]{{$}}
13 define i32 @implicit_def_i32() {
14   br i1 undef, label %A, label %X
16 A:                                                ; preds = %0
17   %d = icmp slt i1 0, 0
18   br i1 %d, label %C, label %B
20 B:                                                ; preds = %A
21   br label %C
23 C:                                                ; preds = %B, %A
24   %h = phi i32 [ undef, %A ], [ 0, %B ]
25   br label %X
27 X:                                                ; preds = %0, C
28   %i = phi i32 [ 1, %0 ], [ %h, %C ]
29   ret i32 %i
32 ; CHECK-LABEL: implicit_def_i64:
33 ; CHECK:      i64.const $push[[R:[0-9]+]]=, 0{{$}}
34 ; CHECK-NEXT: return $pop[[R]]{{$}}
35 define i64 @implicit_def_i64() {
36   br i1 undef, label %A, label %X
38 A:                                                ; preds = %0
39   %d = icmp slt i1 0, 0
40   br i1 %d, label %C, label %B
42 B:                                                ; preds = %A
43   br label %C
45 C:                                                ; preds = %B, %A
46   %h = phi i64 [ undef, %A ], [ 0, %B ]
47   br label %X
49 X:                                                ; preds = %0, C
50   %i = phi i64 [ 1, %0 ], [ %h, %C ]
51   ret i64 %i
54 ; CHECK-LABEL: implicit_def_f32:
55 ; CHECK:      f32.const $push[[R:[0-9]+]]=, 0x0p0{{$}}
56 ; CHECK-NEXT: return $pop[[R]]{{$}}
57 define float @implicit_def_f32() {
58   br i1 undef, label %A, label %X
60 A:                                                ; preds = %0
61   %d = icmp slt i1 0, 0
62   br i1 %d, label %C, label %B
64 B:                                                ; preds = %A
65   br label %C
67 C:                                                ; preds = %B, %A
68   %h = phi float [ undef, %A ], [ 0.0, %B ]
69   br label %X
71 X:                                                ; preds = %0, C
72   %i = phi float [ 1.0, %0 ], [ %h, %C ]
73   ret float %i
76 ; CHECK-LABEL: implicit_def_f64:
77 ; CHECK:      f64.const $push[[R:[0-9]+]]=, 0x0p0{{$}}
78 ; CHECK-NEXT: return $pop[[R]]{{$}}
79 define double @implicit_def_f64() {
80   br i1 undef, label %A, label %X
82 A:                                                ; preds = %0
83   %d = icmp slt i1 0, 0
84   br i1 %d, label %C, label %B
86 B:                                                ; preds = %A
87   br label %C
89 C:                                                ; preds = %B, %A
90   %h = phi double [ undef, %A ], [ 0.0, %B ]
91   br label %X
93 X:                                                ; preds = %0, C
94   %i = phi double [ 1.0, %0 ], [ %h, %C ]
95   ret double %i
98 ; CHECK-LABEL: implicit_def_v4i32:
99 ; CHECK:      v128.const $push[[R:[0-9]+]]=, 0, 0{{$}}
100 ; CHECK-NEXT: return $pop[[R]]{{$}}
101 define <4 x i32> @implicit_def_v4i32() {
102   br i1 undef, label %A, label %X
104 A:                                                ; preds = %0
105   %d = icmp slt i1 0, 0
106   br i1 %d, label %C, label %B
108 B:                                                ; preds = %A
109   br label %C
111 C:                                                ; preds = %B, %A
112   %h = phi <4 x i32> [ undef, %A ], [ <i32 0, i32 0, i32 0, i32 0>, %B ]
113   br label %X
115 X:                                                ; preds = %0, C
116   %i = phi <4 x i32> [ <i32 1, i32 1, i32 1, i32 1>, %0 ], [ %h, %C ]
117   ret <4 x i32> %i