[clang-tidy][NFC]remove deps of clang in clang tidy test (#116588)
[llvm-project.git] / mlir / test / Dialect / LLVMIR / constant-folding.mlir
bloba3570a11d4a2d054c3df320ce510f2f4ef666426
1 // RUN: mlir-opt %s --pass-pipeline="builtin.module(llvm.func(canonicalize))" --split-input-file | FileCheck %s
3 // CHECK-LABEL: llvm.func @zext_basic
4 llvm.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
12 // CHECK-LABEL: llvm.func @zext_neg
13 llvm.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
21 // -----
23 // CHECK-LABEL: llvm.func @shl_basic
24 llvm.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
33 // CHECK-LABEL: llvm.func @shl_multiple
34 llvm.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
43 // -----
45 // CHECK-LABEL: llvm.func @or_basic
46 llvm.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
55 // -----
57 // CHECK-LABEL: llvm.func @addressof
58 llvm.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
68 llvm.mlir.global constant @foo() : i32
70 llvm.func @bar(!llvm.ptr, !llvm.ptr)
72 // -----
74 // CHECK-LABEL: llvm.func @addressof_select
75 llvm.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
84 llvm.mlir.global constant @foo() : i32
86 llvm.func @bar(!llvm.ptr, !llvm.ptr)
88 // -----
90 // CHECK-LABEL: llvm.func @addressof_blocks
91 llvm.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
103 llvm.mlir.global constant @foo() : i32
105 // -----
107 // CHECK-LABEL: llvm.func @undef
108 llvm.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
118 llvm.func @foo(i32, i32)
120 // -----
122 // CHECK-LABEL: llvm.func @poison
123 llvm.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
133 llvm.func @foo(i32, i32)
135 // -----
137 llvm.func @foo(!llvm.ptr, !llvm.ptr)
139 // CHECK-LABEL: llvm.func @null_pointer
140 llvm.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
150 // -----
152 // CHECK-LABEL: llvm.func @zero_integer
153 llvm.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
161 // -----
163 // CHECK-LABEL: llvm.func @null_pointer_select
164 llvm.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
173 // -----
175 llvm.func @malloc(i64) -> !llvm.ptr
177 // CHECK-LABEL: func.func @insert_op
178 func.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