66 lines · plain
1// RUN: mlir-runner %s -e caller --entry-point-result=i32 | FileCheck %s2// Varaidic argument list (va_list) and the extraction logics are ABI-specific.3// REQUIRES: x86-native-target4// UNSUPPORTED: system-windows5 6// Check if variadic functions can be called and the correct variadic argument7// can be extracted.8 9llvm.func @caller() -> i32 {10 %0 = llvm.mlir.constant(3 : i32) : i3211 %1 = llvm.mlir.constant(2 : i32) : i3212 %2 = llvm.mlir.constant(1 : i32) : i3213 %3 = llvm.call @foo(%2, %1, %0) vararg(!llvm.func<i32 (i32, ...)>) : (i32, i32, i32) -> i3214 llvm.return %3 : i3215}16 17// Equivalent C code:18// int foo(int X, ...) {19// va_list args;20// va_start(args, X);21// int num = va_arg(args, int);22// va_end(args);23// return num;24//}25llvm.func @foo(%arg0: i32, ...) -> i32 {26 %0 = llvm.mlir.constant(8 : i64) : i6427 %1 = llvm.mlir.constant(2 : i32) : i3228 %2 = llvm.mlir.constant(0 : i64) : i6429 %3 = llvm.mlir.constant(0 : i64) : i6430 %4 = llvm.mlir.constant(8 : i32) : i3231 %5 = llvm.mlir.constant(3 : i32) : i3232 %6 = llvm.mlir.constant(0 : i64) : i6433 %7 = llvm.mlir.constant(0 : i64) : i6434 %8 = llvm.mlir.constant(41 : i32) : i3235 %9 = llvm.mlir.constant(0 : i32) : i3236 %10 = llvm.mlir.constant(0 : i64) : i6437 %11 = llvm.mlir.constant(0 : i64) : i6438 %12 = llvm.mlir.constant(1 : i32) : i3239 %13 = llvm.alloca %12 x !llvm.array<1 x struct<"struct.va_list", (i32, i32, ptr, ptr)>> {alignment = 8 : i64} : (i32) -> !llvm.ptr40 llvm.intr.vastart %13 : !llvm.ptr41 %15 = llvm.getelementptr %13[%11, %10, 0] : (!llvm.ptr, i64, i64) -> !llvm.ptr, !llvm.array<1 x struct<"struct.va_list", (i32, i32, ptr, ptr)>>42 %16 = llvm.load %15 : !llvm.ptr -> i3243 %17 = llvm.icmp "ult" %16, %8 : i3244 llvm.cond_br %17, ^bb1, ^bb245^bb1: // pred: ^bb046 %18 = llvm.getelementptr %13[%7, %6, 3] : (!llvm.ptr, i64, i64) -> !llvm.ptr, !llvm.array<1 x struct<"struct.va_list", (i32, i32, ptr, ptr)>>47 %19 = llvm.load %18 : !llvm.ptr -> !llvm.ptr48 %20 = llvm.zext %16 : i32 to i6449 %21 = llvm.getelementptr %19[%20] : (!llvm.ptr, i64) -> !llvm.ptr, i850 %22 = llvm.add %16, %4 : i3251 llvm.store %22, %15 : i32, !llvm.ptr52 llvm.br ^bb3(%21 : !llvm.ptr)53^bb2: // pred: ^bb054 %23 = llvm.getelementptr %13[%3, %2, 2] : (!llvm.ptr, i64, i64) -> !llvm.ptr, !llvm.array<1 x struct<"struct.va_list", (i32, i32, ptr, ptr)>>55 %24 = llvm.load %23 : !llvm.ptr -> !llvm.ptr56 %25 = llvm.getelementptr %24[%0] : (!llvm.ptr, i64) -> !llvm.ptr, i857 llvm.store %25, %23 : !llvm.ptr, !llvm.ptr58 llvm.br ^bb3(%24 : !llvm.ptr)59^bb3(%26: !llvm.ptr): // 2 preds: ^bb1, ^bb260 %28 = llvm.load %26 : !llvm.ptr -> i3261 llvm.intr.vaend %13 : !llvm.ptr62 llvm.return %28 : i3263}64 65// CHECK: 266