xref: /llvm-project/mlir/test/Dialect/LLVMIR/constant-folding.mlir (revision 1c4b04ce1f022ec12b0111ad75d8f2f0eec3b054)
1// RUN: mlir-opt %s --pass-pipeline="builtin.module(llvm.func(canonicalize))" --split-input-file | FileCheck %s
2
3// CHECK-LABEL: llvm.func @zext_basic
4llvm.func @zext_basic() -> i64 {
5  %0 = llvm.mlir.constant(1 : i32) : i32
6  %1 = llvm.zext %0 : i32 to i64
7  // CHECK: %[[RES:.*]] = llvm.mlir.constant(1 : i64) : i64
8  // CHECK: llvm.return %[[RES]] : i64
9  llvm.return %1 : i64
10}
11
12// CHECK-LABEL: llvm.func @zext_neg
13llvm.func @zext_neg() -> i64 {
14  %0 = llvm.mlir.constant(-1 : i32) : i32
15  %1 = llvm.zext %0 : i32 to i64
16  // CHECK: %[[RES:.*]] = llvm.mlir.constant(4294967295 : i64) : i64
17  // CHECK: llvm.return %[[RES]] : i64
18  llvm.return %1 : i64
19}
20
21// -----
22
23// CHECK-LABEL: llvm.func @shl_basic
24llvm.func @shl_basic() -> i32 {
25  %0 = llvm.mlir.constant(1 : i32) : i32
26  %1 = llvm.mlir.constant(1 : i32) : i32
27  %2 = llvm.shl %0, %1 : i32
28  // CHECK: %[[RES:.*]] = llvm.mlir.constant(2 : i32) : i32
29  // CHECK: llvm.return %[[RES]] : i32
30  llvm.return %2 : i32
31}
32
33// CHECK-LABEL: llvm.func @shl_multiple
34llvm.func @shl_multiple() -> i32 {
35  %0 = llvm.mlir.constant(45 : i32) : i32
36  %1 = llvm.mlir.constant(7 : i32) : i32
37  %2 = llvm.shl %0, %1 : i32
38  // CHECK: %[[RES:.*]] = llvm.mlir.constant(5760 : i32) : i32
39  // CHECK: llvm.return %[[RES]] : i32
40  llvm.return %2 : i32
41}
42
43// -----
44
45// CHECK-LABEL: llvm.func @or_basic
46llvm.func @or_basic() -> i32 {
47  %0 = llvm.mlir.constant(5 : i32) : i32
48  %1 = llvm.mlir.constant(9 : i32) : i32
49  %2 = llvm.or %0, %1 : i32
50  // CHECK: %[[RES:.*]] = llvm.mlir.constant(13 : i32) : i32
51  // CHECK: llvm.return %[[RES]] : i32
52  llvm.return %2 : i32
53}
54
55// -----
56
57// CHECK-LABEL: llvm.func @addressof
58llvm.func @addressof() {
59  // CHECK-NEXT: %[[ADDRESSOF:.+]] = llvm.mlir.addressof @foo
60  %0 = llvm.mlir.addressof @foo : !llvm.ptr
61  %1 = llvm.mlir.addressof @foo : !llvm.ptr
62  // CHECK-NEXT: llvm.call @bar(%[[ADDRESSOF]], %[[ADDRESSOF]])
63  llvm.call @bar(%0, %1) : (!llvm.ptr, !llvm.ptr) -> ()
64  // CHECK-NEXT: llvm.return
65  llvm.return
66}
67
68llvm.mlir.global constant @foo() : i32
69
70llvm.func @bar(!llvm.ptr, !llvm.ptr)
71
72// -----
73
74// CHECK-LABEL: llvm.func @addressof_select
75llvm.func @addressof_select(%arg: i1) -> !llvm.ptr {
76  // CHECK-NEXT: %[[ADDRESSOF:.+]] = llvm.mlir.addressof @foo
77  %0 = llvm.mlir.addressof @foo : !llvm.ptr
78  %1 = llvm.mlir.addressof @foo : !llvm.ptr
79  %2 = arith.select %arg, %0, %1 : !llvm.ptr
80  // CHECK-NEXT: llvm.return %[[ADDRESSOF]]
81  llvm.return %2 : !llvm.ptr
82}
83
84llvm.mlir.global constant @foo() : i32
85
86llvm.func @bar(!llvm.ptr, !llvm.ptr)
87
88// -----
89
90// CHECK-LABEL: llvm.func @addressof_blocks
91llvm.func @addressof_blocks(%arg: i1) -> !llvm.ptr {
92  // CHECK-NEXT: %[[ADDRESSOF:.+]] = llvm.mlir.addressof @foo
93  llvm.cond_br %arg, ^bb1, ^bb2
94^bb1:
95  %0 = llvm.mlir.addressof @foo : !llvm.ptr
96  llvm.return %0 : !llvm.ptr
97^bb2:
98  %1 = llvm.mlir.addressof @foo : !llvm.ptr
99  // CHECK: return %[[ADDRESSOF]]
100  llvm.return %1 : !llvm.ptr
101}
102
103llvm.mlir.global constant @foo() : i32
104
105// -----
106
107// CHECK-LABEL: llvm.func @undef
108llvm.func @undef() {
109  // CHECK-NEXT: %[[UNDEF:.+]] = llvm.mlir.undef : i32
110  %undef1 = llvm.mlir.undef : i32
111  %undef2 = llvm.mlir.undef : i32
112  // CHECK-NEXT: llvm.call @foo(%[[UNDEF]], %[[UNDEF]])
113  llvm.call @foo(%undef1, %undef2) : (i32, i32) -> ()
114  // CHECK-NEXT: llvm.return
115  llvm.return
116}
117
118llvm.func @foo(i32, i32)
119
120// -----
121
122// CHECK-LABEL: llvm.func @poison
123llvm.func @poison() {
124  // CHECK-NEXT: %[[POISON:.+]] = llvm.mlir.poison : i32
125  %poison1 = llvm.mlir.poison : i32
126  %poison2 = llvm.mlir.poison : i32
127  // CHECK-NEXT: llvm.call @foo(%[[POISON]], %[[POISON]])
128  llvm.call @foo(%poison1, %poison2) : (i32, i32) -> ()
129  // CHECK-NEXT: llvm.return
130  llvm.return
131}
132
133llvm.func @foo(i32, i32)
134
135// -----
136
137llvm.func @foo(!llvm.ptr, !llvm.ptr)
138
139// CHECK-LABEL: llvm.func @null_pointer
140llvm.func @null_pointer() {
141  // CHECK-NEXT: %[[NULLPTR:.+]] = llvm.mlir.zero : !llvm.ptr
142  %nullptr1 = llvm.mlir.zero : !llvm.ptr
143  %nullptr2 = llvm.mlir.zero : !llvm.ptr
144  // CHECK-NEXT: llvm.call @foo(%[[NULLPTR]], %[[NULLPTR]])
145  llvm.call @foo(%nullptr1, %nullptr2) : (!llvm.ptr, !llvm.ptr) -> ()
146  // CHECK-NEXT: llvm.return
147  llvm.return
148}
149
150// -----
151
152// CHECK-LABEL: llvm.func @zero_integer
153llvm.func @zero_integer() -> i64 {
154  // CHECK-NEXT: %[[ZERO:.+]] = llvm.mlir.constant(0 : i64) : i64
155  %zero = llvm.mlir.zero : i32
156  %zero_extended = llvm.zext %zero : i32 to i64
157  // CHECK-NEXT: llvm.return %[[ZERO]]
158  llvm.return %zero_extended : i64
159}
160
161// -----
162
163// CHECK-LABEL: llvm.func @null_pointer_select
164llvm.func @null_pointer_select(%cond: i1) -> !llvm.ptr {
165  // CHECK-NEXT: %[[NULLPTR:.+]] = llvm.mlir.zero : !llvm.ptr
166  %nullptr1 = llvm.mlir.zero : !llvm.ptr
167  %nullptr2 = llvm.mlir.zero : !llvm.ptr
168  %result = arith.select %cond, %nullptr1, %nullptr2 : !llvm.ptr
169  // CHECK-NEXT: llvm.return %[[NULLPTR]]
170  llvm.return %result : !llvm.ptr
171}
172
173// -----
174
175llvm.func @malloc(i64) -> !llvm.ptr
176
177// CHECK-LABEL: func.func @insert_op
178func.func @insert_op(%arg0: index, %arg1: memref<13x13xi64>, %arg2: index) {
179  %cst_7 = arith.constant dense<1526248407> : vector<1xi64>
180  %1 = llvm.mlir.constant(1 : index) : i64
181  %101 = vector.insert %1, %cst_7 [0] : i64 into vector<1xi64>
182  vector.print %101 : vector<1xi64>
183  return
184}
185