100 lines · plain
1// RUN: cir-opt %s -cir-to-llvm -o - | FileCheck %s -check-prefix=MLIR2// RUN: cir-translate %s -cir-to-llvmir --target x86_64-unknown-linux-gnu --disable-cc-lowering | FileCheck %s -check-prefix=LLVM3!s32i = !cir.int<s, 32>4 5module {6 cir.func @foo(%arg0: !s32i) -> !s32i {7 %4 = cir.cast int_to_bool %arg0 : !s32i -> !cir.bool8 cir.if %4 {9 %5 = cir.const #cir.int<1> : !s32i10 cir.return %5 : !s32i11 } else {12 %5 = cir.const #cir.int<0> : !s32i13 cir.return %5 : !s32i14 }15 cir.return %arg0 : !s32i16 }17 18// MLIR: llvm.func @foo(%arg0: i32) -> i3219// MLIR-NEXT: %0 = llvm.mlir.constant(0 : i32) : i3220// MLIR-NEXT: %1 = llvm.icmp "ne" %arg0, %0 : i3221// MLIR-NEXT: llvm.cond_br %1, ^bb1, ^bb222// MLIR-NEXT: ^bb1: // pred: ^bb023// MLIR-NEXT: %2 = llvm.mlir.constant(1 : i32) : i3224// MLIR-NEXT: llvm.return %2 : i3225// MLIR-NEXT: ^bb2: // pred: ^bb026// MLIR-NEXT: %3 = llvm.mlir.constant(0 : i32) : i3227// MLIR-NEXT: llvm.return %3 : i3228// MLIR-NEXT: ^bb3: // no predecessors29// MLIR-NEXT: llvm.return %arg0 : i3230// MLIR-NEXT: }31 32// LLVM: define i32 @foo(i32 %0)33// LLVM-NEXT: %2 = icmp ne i32 %0, 034// LLVM-NEXT: br i1 %2, label %3, label %435// LLVM-EMPTY:36// LLVM-NEXT: 3:37// LLVM-NEXT: ret i32 138// LLVM-EMPTY:39// LLVM-NEXT: 4:40// LLVM-NEXT: ret i32 041// LLVM-EMPTY:42// LLVM-NEXT: 5:43// LLVM-NEXT: ret i32 %044// LLVM-NEXT: }45 46 cir.func @onlyIf(%arg0: !s32i) -> !s32i {47 %4 = cir.cast int_to_bool %arg0 : !s32i -> !cir.bool48 cir.if %4 {49 %5 = cir.const #cir.int<1> : !s32i50 cir.return %5 : !s32i51 }52 cir.return %arg0 : !s32i53 }54 55 // MLIR: llvm.func @onlyIf(%arg0: i32) -> i3256 // MLIR-NEXT: %0 = llvm.mlir.constant(0 : i32) : i3257 // MLIR-NEXT: %1 = llvm.icmp "ne" %arg0, %0 : i3258 // MLIR-NEXT: llvm.cond_br %1, ^bb1, ^bb259 // MLIR-NEXT: ^bb1: // pred: ^bb060 // MLIR-NEXT: %2 = llvm.mlir.constant(1 : i32) : i3261 // MLIR-NEXT: llvm.return %2 : i3262 // MLIR-NEXT: ^bb2: // pred: ^bb063 // MLIR-NEXT: llvm.return %arg0 : i3264 // MLIR-NEXT: }65 66 // Verify empty if clause is properly lowered to empty block67 cir.func @emptyIfClause(%arg0: !s32i) -> !s32i {68 // MLIR-LABEL: llvm.func @emptyIfClause69 %4 = cir.cast int_to_bool %arg0 : !s32i -> !cir.bool70 // MLIR: llvm.cond_br {{%.*}}, ^[[T:.*]], ^[[PHI:.*]]71 cir.if %4 {72 // MLIR-NEXT: ^[[T]]:73 // MLIR-NEXT: llvm.br ^[[PHI]]74 }75 // MLIR-NEXT: ^[[PHI]]:76 // MLIR-NEXT: llvm.return77 cir.return %arg0 : !s32i78 }79 80 // Verify empty if-else clauses are properly lowered to empty blocks81 // TODO: Fix reversed order of blocks in the test once Issue clangir/#1094 is82 // addressed83 cir.func @emptyIfElseClause(%arg0: !s32i) -> !s32i {84 // MLIR-LABEL: llvm.func @emptyIfElseClause85 %4 = cir.cast int_to_bool %arg0 : !s32i -> !cir.bool86 // MLIR: llvm.cond_br {{%.*}}, ^[[T:.*]], ^[[F:.*]]87 cir.if %4 {88 // MLIR-NEXT: ^[[T]]:89 // MLIR-NEXT: llvm.br ^[[PHI:.*]]90 } else {91 // MLIR-NEXT: ^[[F]]:92 // MLIR-NEXT: llvm.br ^[[PHI]]93 }94 // MLIR-NEXT: ^[[PHI]]:95 // MLIR-NEXT: llvm.return96 cir.return %arg0 : !s32i97 }98 99}100