247 lines · plain
1// RUN: mlir-opt %s -split-input-file -reconcile-unrealized-casts | FileCheck %s2 3// CHECK-LABEL: @unusedCast4// CHECK-SAME: (%[[arg0:.*]]: i64) -> i645// CHECK: return %[[arg0]] : i646 7func.func @unusedCast(%arg0: i64) -> i64 {8 %0 = builtin.unrealized_conversion_cast %arg0 : i64 to i329 return %arg0 : i6410}11 12// -----13 14// CHECK-LABEL: @sameTypes15// CHECK-SAME: (%[[arg0:.*]]: i64) -> i6416// CHECK: return %[[arg0]] : i6417 18func.func @sameTypes(%arg0: i64) -> i64 {19 %0 = builtin.unrealized_conversion_cast %arg0 : i64 to i6420 return %0 : i6421}22 23// -----24 25// CHECK-LABEL: @pair26// CHECK-SAME: (%[[arg0:.*]]: i64) -> i6427// CHECK: return %[[arg0]] : i6428 29func.func @pair(%arg0: i64) -> i64 {30 %0 = builtin.unrealized_conversion_cast %arg0 : i64 to i3231 %1 = builtin.unrealized_conversion_cast %0 : i32 to i6432 return %1 : i6433}34 35// -----36 37// CHECK-LABEL: @symmetricChain38// CHECK-SAME: (%[[arg0:.*]]: i64) -> i6439// CHECK: return %[[arg0]] : i6440 41func.func @symmetricChain(%arg0: i64) -> i64 {42 %0 = builtin.unrealized_conversion_cast %arg0 : i64 to i3243 %1 = builtin.unrealized_conversion_cast %0 : i32 to i144 %2 = builtin.unrealized_conversion_cast %1 : i1 to i3245 %3 = builtin.unrealized_conversion_cast %2 : i32 to i6446 return %3 : i6447}48 49// -----50 51// CHECK-LABEL: @asymmetricChain52// CHECK-SAME: (%[[arg0:.*]]: i64) -> i6453// CHECK: return %[[arg0]] : i6454 55func.func @asymmetricChain(%arg0: i64) -> i64 {56 %0 = builtin.unrealized_conversion_cast %arg0 : i64 to i3257 %1 = builtin.unrealized_conversion_cast %0 : i32 to i158 %2 = builtin.unrealized_conversion_cast %1 : i1 to i6459 return %2 : i6460}61 62// -----63 64// CHECK-LABEL: @unusedChain65// CHECK-SAME: (%[[arg0:.*]]: i64) -> i6466// CHECK: return %[[arg0]] : i6467 68func.func @unusedChain(%arg0: i64) -> i64 {69 %0 = builtin.unrealized_conversion_cast %arg0 : i64 to i3270 %1 = builtin.unrealized_conversion_cast %0 : i32 to i171 return %arg0 : i6472}73 74// -----75 76// CHECK-LABEL: @bifurcation77// CHECK-SAME: (%[[arg0:.*]]: i64) -> i6478// CHECK: %[[result:.*]] = arith.addi %[[arg0]], %[[arg0]] : i6479// CHECK: return %[[result]] : i6480 81func.func @bifurcation(%arg0: i64) -> i64 {82 %0 = builtin.unrealized_conversion_cast %arg0 : i64 to i3283 %1 = builtin.unrealized_conversion_cast %0 : i32 to i184 %2 = builtin.unrealized_conversion_cast %1 : i1 to i6485 %3 = builtin.unrealized_conversion_cast %1 : i1 to i3286 %4 = builtin.unrealized_conversion_cast %3 : i32 to i6487 %5 = arith.addi %2, %4 : i6488 return %5 : i6489}90 91// -----92 93// CHECK-LABEL: @unusedBifurcation94// CHECK-SAME: (%[[arg0:.*]]: i64) -> i6495// CHECK: %[[result:.*]] = arith.addi %[[arg0]], %[[arg0]] : i6496// CHECK: return %[[result]] : i6497 98func.func @unusedBifurcation(%arg0: i64) -> i64 {99 %0 = builtin.unrealized_conversion_cast %arg0 : i64 to i32100 %1 = builtin.unrealized_conversion_cast %0 : i32 to i1101 %2 = builtin.unrealized_conversion_cast %1 : i1 to i64102 %3 = builtin.unrealized_conversion_cast %0 : i32 to i64103 %4 = arith.addi %arg0, %3 : i64104 return %4 : i64105}106 107// -----108 109// CHECK-LABEL: @liveSingleCast110// CHECK-SAME: (%[[arg0:.*]]: i64) -> i32111// CHECK: %[[liveCast:.*]] = builtin.unrealized_conversion_cast %[[arg0]] : i64 to i32112// CHECK: return %[[liveCast]] : i32113 114func.func @liveSingleCast(%arg0: i64) -> i32 {115 %0 = builtin.unrealized_conversion_cast %arg0 : i64 to i32116 return %0 : i32117}118 119// -----120 121// CHECK-LABEL: @liveChain122// CHECK-SAME: (%[[arg0:.*]]: i64) -> i32123// CHECK: %[[cast0:.*]] = builtin.unrealized_conversion_cast %[[arg0]] : i64 to i1124// CHECK: %[[cast1:.*]] = builtin.unrealized_conversion_cast %[[cast0]] : i1 to i32125// CHECK: return %[[cast1]] : i32126 127func.func @liveChain(%arg0: i64) -> i32 {128 %0 = builtin.unrealized_conversion_cast %arg0 : i64 to i1129 %1 = builtin.unrealized_conversion_cast %0 : i1 to i32130 return %1 : i32131}132 133// -----134 135// CHECK-LABEL: @liveBifurcation136// CHECK-SAME: (%[[arg0:.*]]: i64) -> i64137// CHECK: %[[cast0:.*]] = builtin.unrealized_conversion_cast %[[arg0]] : i64 to i32138// CHECK: %[[cast2:.*]] = builtin.unrealized_conversion_cast %[[cast0]] : i32 to i1139// CHECK: %[[extsi:.*]] = arith.extsi %[[cast2]] : i1 to i64140// CHECK: %[[result:.*]] = arith.addi %[[arg0]], %[[extsi]] : i64141// CHECK: return %[[result]] : i64142 143func.func @liveBifurcation(%arg0: i64) -> i64 {144 %0 = builtin.unrealized_conversion_cast %arg0 : i64 to i32145 %1 = builtin.unrealized_conversion_cast %0 : i32 to i64146 %2 = builtin.unrealized_conversion_cast %0 : i32 to i1147 %3 = arith.extsi %2 : i1 to i64148 %4 = arith.addi %1, %3 : i64149 return %4 : i64150}151 152// -----153 154// CHECK-LABEL: func @deadNToOneCast(155// CHECK-NEXT: return156func.func @deadNToOneCast(%arg0: index, %arg1: index) {157 %0 = builtin.unrealized_conversion_cast %arg0, %arg1 : index, index to i64158 return159}160 161// -----162 163// CHECK-LABEL: func @swappingOperands(164// CHECK-SAME: %[[arg0:.*]]: index, %[[arg1:.*]]: index165// CHECK: %[[cast1:.*]]:2 = builtin.unrealized_conversion_cast %[[arg0]], %[[arg1]]166// CHECK: %[[cast2:.*]]:2 = builtin.unrealized_conversion_cast %[[cast1]]#1, %[[cast1]]#0167// CHECK: %[[cast3:.*]]:2 = builtin.unrealized_conversion_cast %[[cast2]]#0, %[[cast2]]#1168// CHECK: return %[[cast3]]#0, %[[cast3]]#1169func.func @swappingOperands(%arg0: index, %arg1: index) -> (index, index) {170 %0:2 = builtin.unrealized_conversion_cast %arg0, %arg1 : index, index to i64, i64171 %1:2 = builtin.unrealized_conversion_cast %0#1, %0#0 : i64, i64 to i32, i32172 %2:2 = builtin.unrealized_conversion_cast %1#0, %1#1 : i32, i32 to index, index173 return %2#0, %2#1 : index, index174}175 176// -----177 178// CHECK-LABEL: func @matchingOperands(179// CHECK-SAME: %[[arg0:.*]]: index, %[[arg1:.*]]: index180// CHECK: return %[[arg0]], %[[arg1]]181func.func @matchingOperands(%arg0: index, %arg1: index) -> (index, index) {182 %0:2 = builtin.unrealized_conversion_cast %arg0, %arg1 : index, index to i64, i64183 %1:3 = builtin.unrealized_conversion_cast %0#0, %0#1 : i64, i64 to i32, i32, i32184 %2:2 = builtin.unrealized_conversion_cast %1#0, %1#1, %1#2 : i32, i32, i32 to index, index185 return %2#0, %2#1 : index, index186}187 188// -----189 190// CHECK-LABEL: func @emptyCast()191// CHECK: %[[cast:.*]] = builtin.unrealized_conversion_cast to index192// CHECK: return %[[cast]]193func.func @emptyCast() -> index {194 %0 = builtin.unrealized_conversion_cast to index195 return %0 : index196}197 198// -----199 200// CHECK-LABEL: test.graph_region201// CHECK-NEXT: "test.return"() : () -> ()202test.graph_region {203 %0 = builtin.unrealized_conversion_cast %2 : i32 to i64204 %1 = builtin.unrealized_conversion_cast %0 : i64 to i16205 %2 = builtin.unrealized_conversion_cast %1 : i16 to i32206 "test.return"() : () -> ()207}208 209// -----210 211// CHECK-LABEL: test.graph_region212// CHECK-NEXT: %[[cast0:.*]] = builtin.unrealized_conversion_cast %[[cast2:.*]] : i32 to i64213// CHECK-NEXT: %[[cast1:.*]] = builtin.unrealized_conversion_cast %[[cast0]] : i64 to i16214// CHECK-NEXT: %[[cast2]] = builtin.unrealized_conversion_cast %[[cast1]] : i16 to i32215// CHECK-NEXT: "test.user"(%[[cast2]]) : (i32) -> ()216// CHECK-NEXT: "test.return"() : () -> ()217test.graph_region {218 %0 = builtin.unrealized_conversion_cast %2 : i32 to i64219 %1 = builtin.unrealized_conversion_cast %0 : i64 to i16220 %2 = builtin.unrealized_conversion_cast %1 : i16 to i32221 "test.user"(%2) : (i32) -> ()222 "test.return"() : () -> ()223}224 225// -----226 227// CHECK-LABEL: test.graph_region228// CHECK-NEXT: "test.return"() : () -> ()229test.graph_region {230 %0 = builtin.unrealized_conversion_cast %0 : i32 to i32231 "test.return"() : () -> ()232}233 234// -----235 236// CHECK-LABEL: test.graph_region237// CHECK-NEXT: %[[c0:.*]] = arith.constant238// CHECK-NEXT: %[[cast:.*]]:2 = builtin.unrealized_conversion_cast %[[c0]], %[[cast]]#1 : i32, i32 to i32, i32239// CHECK-NEXT: "test.user"(%[[cast]]#0) : (i32) -> ()240// CHECK-NEXT: "test.return"() : () -> ()241test.graph_region {242 %cst = arith.constant 0 : i32243 %0, %1 = builtin.unrealized_conversion_cast %cst, %1 : i32, i32 to i32, i32244 "test.user"(%0) : (i32) -> ()245 "test.return"() : () -> ()246}247