brintos

brintos / llvm-project-archived public Read only

0
0
Text · 2.6 KiB · 668fbeb Raw
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