brintos

brintos / llvm-project-archived public Read only

0
0
Text · 9.7 KiB · 755e3a3 Raw
321 lines · plain
1// RUN: mlir-opt --pass-pipeline='builtin.module(llvm.func(canonicalize{test-convergence}))' %s -split-input-file | FileCheck %s2 3// CHECK-LABEL: @fold_icmp_eq4llvm.func @fold_icmp_eq(%arg0 : i32) -> i1 {5  // CHECK: %[[C0:.*]] = llvm.mlir.constant(true) : i16  %0 = llvm.icmp "eq" %arg0, %arg0 : i327  // CHECK: llvm.return %[[C0]]8  llvm.return %0 : i19}10 11// -----12 13// CHECK-LABEL: @fold_icmp_ne14llvm.func @fold_icmp_ne(%arg0 : vector<2xi32>) -> vector<2xi1> {15  // CHECK: %[[C0:.*]] = llvm.mlir.constant(dense<false> : vector<2xi1>) : vector<2xi1>16  %0 = llvm.icmp "ne" %arg0, %arg0 : vector<2xi32>17  // CHECK: llvm.return %[[C0]]18  llvm.return %0 : vector<2xi1>19}20 21// -----22 23// CHECK-LABEL: @fold_icmp_alloca24llvm.func @fold_icmp_alloca() -> i1 {25  // CHECK: %[[C0:.*]] = llvm.mlir.constant(true) : i126  %c0 = llvm.mlir.zero : !llvm.ptr27  %c1 = arith.constant 1 : i6428  %0 = llvm.alloca %c1 x i32 : (i64) -> !llvm.ptr29  %1 = llvm.icmp "ne" %c0, %0 : !llvm.ptr30  // CHECK: llvm.return %[[C0]]31  llvm.return %1 : i132}33 34// -----35 36// CHECK-LABEL: fold_extractvalue37llvm.func @fold_extractvalue() -> i32 {38  //  CHECK-DAG: %[[C0:.*]] = arith.constant 0 : i3239  %c0 = arith.constant 0 : i3240  //  CHECK-DAG: %[[C1:.*]] = arith.constant 1 : i3241  %c1 = arith.constant 1 : i3242 43  %0 = llvm.mlir.undef : !llvm.struct<(i32, i32)>44 45  // CHECK-NOT: insertvalue46  %1 = llvm.insertvalue %c0, %0[0] : !llvm.struct<(i32, i32)>47  %2 = llvm.insertvalue %c1, %1[1] : !llvm.struct<(i32, i32)>48 49  // CHECK-NOT: extractvalue50  %3 = llvm.extractvalue %2[0] : !llvm.struct<(i32, i32)>51  %4 = llvm.extractvalue %2[1] : !llvm.struct<(i32, i32)>52 53  //     CHECK: llvm.add %[[C0]], %[[C1]]54  %5 = llvm.add %3, %4 : i3255  llvm.return %5 : i3256}57 58// -----59 60// CHECK-LABEL: fold_extractvalue(61//  CHECK-SAME:     %[[arg1:.*]]: i32, %[[arg2:.*]]: i32, %[[arg3:.*]]: i32)62//  CHECK-NEXT:   llvm.return %[[arg1]] : i3263llvm.func @fold_extractvalue(%arg1: i32, %arg2: i32, %arg3: i32) -> i32{64  %3 = llvm.mlir.undef : !llvm.struct<(struct<(i32, i32, i32)>, struct<(i32, i32)>)>65  %5 = llvm.mlir.undef : !llvm.struct<(i32, i32, i32)>66  %6 = llvm.insertvalue %arg1, %5[0] : !llvm.struct<(i32, i32, i32)>67  %7 = llvm.insertvalue %arg1, %6[1] : !llvm.struct<(i32, i32, i32)>68  %8 = llvm.insertvalue %arg1, %7[2] : !llvm.struct<(i32, i32, i32)>69  %11 = llvm.insertvalue %8, %3[0] : !llvm.struct<(struct<(i32, i32, i32)>, struct<(i32, i32)>)>70  %13 = llvm.extractvalue %11[0, 0] : !llvm.struct<(struct<(i32, i32, i32)>, struct<(i32, i32)>)>71  llvm.return %13 : i3272}73 74// -----75 76// CHECK-LABEL: no_fold_extractvalue77llvm.func @no_fold_extractvalue(%arr: !llvm.array<4 x f32>) -> f32 {78  %f0 = arith.constant 0.0 : f3279  %0 = llvm.mlir.undef : !llvm.array<4 x !llvm.array<4 x f32>>80 81  // CHECK: insertvalue82  // CHECK: insertvalue83  // CHECK: extractvalue84  %1 = llvm.insertvalue %f0, %0[0, 0] : !llvm.array<4 x !llvm.array<4 x f32>>85  %2 = llvm.insertvalue %arr, %1[0] : !llvm.array<4 x !llvm.array<4 x f32>>86  %3 = llvm.extractvalue %2[0, 0] : !llvm.array<4 x !llvm.array<4 x f32>>87 88  llvm.return %3 : f3289}90 91// -----92 93// CHECK-LABEL: fold_unrelated_extractvalue94llvm.func @fold_unrelated_extractvalue(%arr: !llvm.array<4 x f32>) -> f32 {95  %f0 = arith.constant 0.0 : f3296  // CHECK-NOT: insertvalue97  // CHECK: extractvalue98  %2 = llvm.insertvalue %f0, %arr[0] : !llvm.array<4 x f32>99  %3 = llvm.extractvalue %2[1] : !llvm.array<4 x f32>100  llvm.return %3 : f32101}102 103// -----104// CHECK-LABEL: fold_extract_extractvalue105llvm.func @fold_extract_extractvalue(%arr: !llvm.struct<(i64, array<1 x ptr<1>>)>) -> !llvm.ptr<1> {106  // CHECK: llvm.extractvalue %{{.*}}[1, 0] 107  // CHECK-NOT: extractvalue108  %a = llvm.extractvalue %arr[1] : !llvm.struct<(i64, array<1 x ptr<1>>)> 109  %b = llvm.extractvalue %a[0] : !llvm.array<1 x ptr<1>> 110  llvm.return %b : !llvm.ptr<1>111}112 113// -----114 115// CHECK-LABEL: fold_extract_const116// CHECK-NOT: extractvalue117// CHECK:  llvm.mlir.constant(5.000000e-01 : f64)118llvm.func @fold_extract_const() -> f64 {119  %a = llvm.mlir.constant(dense<[-8.900000e+01, 5.000000e-01]> : tensor<2xf64>) : !llvm.array<2 x f64>120  %b = llvm.extractvalue %a[1] : !llvm.array<2 x f64>121  llvm.return %b : f64122}123 124// -----125 126// CHECK-LABEL: fold_extract_splat127// CHECK-NOT: extractvalue128// CHECK: llvm.mlir.constant(-8.900000e+01 : f64)129llvm.func @fold_extract_splat() -> f64 {130  %a = llvm.mlir.constant(dense<-8.900000e+01> : tensor<2xf64>) : !llvm.array<2 x f64>131  %b = llvm.extractvalue %a[1] : !llvm.array<2 x f64>132  llvm.return %b : f64133}134 135// -----136 137// CHECK-LABEL: fold_bitcast138// CHECK-SAME: %[[ARG:[[:alnum:]]+]]139// CHECK-NEXT: llvm.return %[[ARG]]140llvm.func @fold_bitcast(%x : !llvm.ptr) -> !llvm.ptr {141  %c = llvm.bitcast %x : !llvm.ptr to !llvm.ptr142  llvm.return %c : !llvm.ptr143}144 145// -----146 147// CHECK-LABEL: fold_bitcast2148// CHECK-SAME: %[[ARG:[[:alnum:]]+]]149// CHECK-NEXT: llvm.return %[[ARG]]150llvm.func @fold_bitcast2(%x : i32) -> i32 {151  %c = llvm.bitcast %x : i32 to f32152  %d = llvm.bitcast %c : f32 to i32153  llvm.return %d : i32154}155 156// -----157 158// CHECK-LABEL: fold_bitcast_chain159// CHECK-SAME: %[[ARG:[[:alnum:]]+]]160llvm.func @fold_bitcast_chain(%x : i32) -> vector<2xi16> {161  %c = llvm.bitcast %x : i32 to f32162  %d = llvm.bitcast %c : f32 to vector<2xi16>163  // CHECK: %[[BITCAST:.*]] = llvm.bitcast %[[ARG]] : i32 to vector<2xi16>164  // CHECK: llvm.return %[[BITCAST]]165  llvm.return %d : vector<2xi16>166}167 168// -----169 170// CHECK-LABEL: fold_addrcast171// CHECK-SAME: %[[ARG:[[:alnum:]]+]]172// CHECK-NEXT: llvm.return %[[ARG]]173llvm.func @fold_addrcast(%x : !llvm.ptr) -> !llvm.ptr {174  %c = llvm.addrspacecast %x : !llvm.ptr to !llvm.ptr175  llvm.return %c : !llvm.ptr176}177 178// -----179 180// CHECK-LABEL: fold_addrcast2181// CHECK-SAME: %[[ARG:[[:alnum:]]+]]182// CHECK-NEXT: llvm.return %[[ARG]]183llvm.func @fold_addrcast2(%x : !llvm.ptr) -> !llvm.ptr {184  %c = llvm.addrspacecast %x : !llvm.ptr to !llvm.ptr<5>185  %d = llvm.addrspacecast %c : !llvm.ptr<5> to !llvm.ptr186  llvm.return %d : !llvm.ptr187}188 189// -----190 191// CHECK-LABEL: fold_addrcast_chain192// CHECK-SAME: %[[ARG:[[:alnum:]]+]]193llvm.func @fold_addrcast_chain(%x : !llvm.ptr) -> !llvm.ptr<2> {194  %c = llvm.addrspacecast %x : !llvm.ptr to !llvm.ptr<1>195  %d = llvm.addrspacecast %c : !llvm.ptr<1> to !llvm.ptr<2>196  // CHECK: %[[ADDRCAST:.*]] = llvm.addrspacecast %[[ARG]] : !llvm.ptr to !llvm.ptr<2>197  // CHECK: llvm.return %[[ADDRCAST]]198  llvm.return %d : !llvm.ptr<2>199}200 201// -----202 203// CHECK-LABEL: fold_gep204// CHECK-SAME: %[[ARG:[[:alnum:]]+]]205// CHECK-NEXT: llvm.return %[[ARG]]206llvm.func @fold_gep(%x : !llvm.ptr) -> !llvm.ptr {207  %c0 = arith.constant 0 : i32208  %c = llvm.getelementptr %x[%c0] : (!llvm.ptr, i32) -> !llvm.ptr, i8209  llvm.return %c : !llvm.ptr210}211 212// -----213 214// CHECK-LABEL: fold_gep_neg215// CHECK-SAME: %[[ARG:[[:alnum:]]+]]216// CHECK-NEXT: %[[RES:.*]] = llvm.getelementptr inbounds %[[ARG]][0, 1]217// CHECK-NEXT: llvm.return %[[RES]]218llvm.func @fold_gep_neg(%x : !llvm.ptr) -> !llvm.ptr {219  %c0 = arith.constant 0 : i32220  %0 = llvm.getelementptr inbounds %x[%c0, 1] : (!llvm.ptr, i32) -> !llvm.ptr, !llvm.struct<(i32, i32)>221  llvm.return %0 : !llvm.ptr222}223 224// -----225 226// CHECK-LABEL: fold_gep_canon227// CHECK-SAME: %[[ARG:[[:alnum:]]+]]228// CHECK-NEXT: %[[RES:.*]] = llvm.getelementptr %[[ARG]][2]229// CHECK-NEXT: llvm.return %[[RES]]230llvm.func @fold_gep_canon(%x : !llvm.ptr) -> !llvm.ptr {231  %c2 = arith.constant 2 : i32232  %c = llvm.getelementptr %x[%c2] : (!llvm.ptr, i32) -> !llvm.ptr, i8233  llvm.return %c : !llvm.ptr234}235 236// -----237 238// CHECK-LABEL: fold_shufflevector239// CHECK-SAME: %[[ARG1:[[:alnum:]]+]]: vector<1xf32>, %[[ARG2:[[:alnum:]]+]]: vector<1xf32>240llvm.func @fold_shufflevector(%v1 : vector<1xf32>, %v2 : vector<1xf32>) -> vector<1xf32> {241  // CHECK-NOT: llvm.shufflevector242  %c = llvm.shufflevector %v1, %v2 [0] : vector<1xf32>243  // CHECK: llvm.return %[[ARG1]]244  llvm.return %c : vector<1xf32>245}246 247// -----248 249// Check that LLVM constants participate in cross-dialect constant folding. The250// resulting constant is created in the arith dialect because the last folded251// operation belongs to it.252// CHECK-LABEL: llvm_constant253llvm.func @llvm_constant() -> i32 {254  // CHECK-NOT: llvm.mlir.constant255  %0 = llvm.mlir.constant(40 : i32) : i32256  %1 = llvm.mlir.constant(42 : i32) : i32257  // CHECK: %[[RES:.*]] = arith.constant 82 : i32258  // CHECK-NOT: arith.addi259  %2 = arith.addi %0, %1 : i32260  // CHECK: return %[[RES]]261  llvm.return %2 : i32262}263 264// -----265 266// CHECK-LABEL: load_dce267// CHECK-NEXT: llvm.return268llvm.func @load_dce(%x : !llvm.ptr) {269  %0 = llvm.load %x : !llvm.ptr -> i8270  llvm.return271}272 273// -----274 275llvm.mlir.global external @fp() : !llvm.ptr276 277// CHECK-LABEL: addr_dce278// CHECK-NEXT: llvm.return279llvm.func @addr_dce(%x : !llvm.ptr) {280  %0 = llvm.mlir.addressof @fp : !llvm.ptr281  llvm.return282}283 284// -----285 286// CHECK-LABEL: alloca_dce287// CHECK-NEXT: llvm.return288llvm.func @alloca_dce() {289  %c1_i64 = arith.constant 1 : i64290  %0 = llvm.alloca %c1_i64 x i32 : (i64) -> !llvm.ptr291  llvm.return292}293 294// -----295 296// CHECK-LABEL: func @volatile_load297llvm.func @volatile_load(%x : !llvm.ptr) {298  // A volatile load may have side-effects such as a write operation to arbitrary memory.299  // Make sure it is not removed.300  // CHECK: llvm.load volatile301  %0 = llvm.load volatile %x : !llvm.ptr -> i8302  // Same with monotonic atomics and any stricter modes.303  // CHECK: llvm.load %{{.*}} atomic monotonic304  %2 = llvm.load %x atomic monotonic { alignment = 1 } : !llvm.ptr -> i8305  // But not unordered!306  // CHECK-NOT: llvm.load %{{.*}} atomic unordered307  %3 = llvm.load %x  atomic unordered { alignment = 1 } : !llvm.ptr -> i8308  llvm.return309}310 311// -----312 313// CHECK-LABEL: func @inline_asm_side_effects314llvm.func @inline_asm_side_effects(%x : i32) {315  // CHECK-NOT: llvm.inline_asm "pure inline asm"316  llvm.inline_asm "pure inline asm", "r" %x : (i32) -> ()317  // CHECK: llvm.inline_asm has_side_effects "inline asm with side effects"318  llvm.inline_asm has_side_effects "inline asm with side effects", "r" %x : (i32) -> ()319  llvm.return320}321