| ; RUN: mlir-translate -import-llvm -split-input-file %s | FileCheck %s |
| |
| ; Verify the import works if the blocks are not topologically sorted. |
| ; CHECK-LABEL: @dominance_order |
| ; CHECK-SAME: %[[ARG1:[a-zA-Z0-9]+]] |
| define i64 @dominance_order(i64 %arg1) { |
| ; CHECK: llvm.br ^[[BB2:.+]] |
| br label %bb2 |
| bb1: |
| ; CHECK: ^[[BB1:[a-zA-Z0-9]+]]: |
| ; CHECK: llvm.return %[[VAL1:.+]] : i64 |
| ret i64 %1 |
| bb2: |
| ; CHECK: ^[[BB2]]: |
| ; CHECK: %[[VAL1]] = llvm.add %[[ARG1]] |
| %1 = add i64 %arg1, 3 |
| ; CHECK: llvm.br ^[[BB1]] |
| br label %bb1 |
| } |
| |
| ; // ----- |
| |
| ; CHECK-LABEL: @block_argument |
| ; CHECK-SAME: %[[ARG1:[a-zA-Z0-9]+]] |
| ; CHECK-SAME: %[[ARG2:[a-zA-Z0-9]+]] |
| define i64 @block_argument(i1 %arg1, i64 %arg2) { |
| entry: |
| ; CHECK: llvm.cond_br %[[ARG1]] |
| ; CHECK-SAME: ^[[BB1:.+]](%[[ARG2]] : i64) |
| ; CHECK-SAME: ^[[BB2:.+]] |
| br i1 %arg1, label %bb1, label %bb2 |
| bb1: |
| ; CHECK: ^[[BB1]](%[[BA1:.+]]: i64): |
| ; CHECK: llvm.return %[[BA1]] : i64 |
| %0 = phi i64 [ %arg2, %entry ], [ %1, %bb2 ] |
| ret i64 %0 |
| bb2: |
| ; CHECK: ^[[BB2]]: |
| ; CHECK: %[[VAL1:.+]] = llvm.add %[[ARG2]] |
| ; CHECK: llvm.br ^[[BB1]](%[[VAL1]] |
| %1 = add i64 %arg2, 3 |
| br label %bb1 |
| } |
| |
| ; // ----- |
| |
| ; CHECK-LABEL: @simple_switch( |
| ; CHECK-SAME: %[[ARG1:[a-zA-Z0-9]+]] |
| define i64 @simple_switch(i64 %arg1) { |
| ; CHECK: %[[VAL1:.+]] = llvm.add |
| ; CHECK: %[[VAL2:.+]] = llvm.sub |
| ; CHECK: %[[VAL3:.+]] = llvm.mul |
| %1 = add i64 %arg1, 42 |
| %2 = sub i64 %arg1, 42 |
| %3 = mul i64 %arg1, 42 |
| ; CHECK: llvm.switch %[[ARG1]] : i64, ^[[BBD:.+]] [ |
| ; CHECK: 0: ^[[BB1:.+]], |
| ; CHECK: 9: ^[[BB2:.+]] |
| ; CHECK: ] |
| switch i64 %arg1, label %bbd [ |
| i64 0, label %bb1 |
| i64 9, label %bb2 |
| ] |
| bb1: |
| ; CHECK: ^[[BB1]]: |
| ; CHECK: llvm.return %[[VAL1]] |
| ret i64 %1 |
| bb2: |
| ; CHECK: ^[[BB2]]: |
| ; CHECK: llvm.return %[[VAL2]] |
| ret i64 %2 |
| bbd: |
| ; CHECK: ^[[BBD]]: |
| ; CHECK: llvm.return %[[VAL3]] |
| ret i64 %3 |
| } |
| |
| ; // ----- |
| |
| ; CHECK-LABEL: @switch_args |
| ; CHECK-SAME: %[[ARG1:[a-zA-Z0-9]+]] |
| define i32 @switch_args(i32 %arg1) { |
| entry: |
| ; CHECK: %[[VAL1:.+]] = llvm.add |
| ; CHECK: %[[VAL2:.+]] = llvm.sub |
| ; CHECK: %[[VAL3:.+]] = llvm.mul |
| %0 = add i32 %arg1, 42 |
| %1 = sub i32 %arg1, 42 |
| %2 = mul i32 %arg1, 42 |
| ; CHECK: llvm.switch %[[ARG1]] : i32, ^[[BBD:.+]](%[[VAL3]] : i32) [ |
| ; CHECK: 0: ^[[BB1:.+]](%[[VAL1]], %[[VAL2]] : i32, i32) |
| ; CHECK: ] |
| switch i32 %arg1, label %bbd [ |
| i32 0, label %bb1 |
| ] |
| bb1: |
| ; CHECK: ^[[BB1]](%[[BA1:.+]]: i32, %[[BA2:.+]]: i32): |
| ; CHECK: %[[VAL1:.*]] = llvm.add %[[BA1]], %[[BA2]] : i32 |
| %3 = phi i32 [%0, %entry] |
| %4 = phi i32 [%1, %entry] |
| %5 = add i32 %3, %4 |
| ; CHECK: llvm.br ^[[BBD]](%[[VAL1]] |
| br label %bbd |
| bbd: |
| ; CHECK: ^[[BBD]](%[[BA3:.+]]: i32): |
| ; CHECK: llvm.return %[[BA3]] |
| %6 = phi i32 [%2, %entry], [%5, %bb1] |
| ret i32 %6 |
| } |