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