Skip to content

Conversation

robertoraggi
Copy link
Owner

Fixes #617

int fact(int n) {
  if (n <= 1) return 1;
  return n * fact(n - 1);
}

int main() {
  int result = fact(5);
  return result;
}
$ cxx fact.c -emit-ir

module @fact.c {
  llvm.func @main() -> i32 {
    %0 = llvm.mlir.constant(5 : i32) : i32
    %1 = llvm.mlir.constant(1 : i64) : i64
    %2 = llvm.alloca %1 x i32 : (i64) -> !llvm.ptr
    %3 = llvm.alloca %1 x i32 : (i64) -> !llvm.ptr
    %4 = llvm.call @fact(%0) : (i32) -> i32
    llvm.store %4, %3 : i32, !llvm.ptr
    %5 = llvm.load %3 : !llvm.ptr -> i32
    llvm.store %5, %2 : i32, !llvm.ptr
    llvm.br ^bb1
  ^bb1:  // pred: ^bb0
    %6 = llvm.load %2 : !llvm.ptr -> i32
    llvm.return %6 : i32
  }
  llvm.func @fact(%arg0: i32) -> i32 {
    %0 = llvm.mlir.constant(1 : i32) : i32
    %1 = llvm.mlir.constant(1 : i64) : i64
    %2 = llvm.alloca %1 x i32 : (i64) -> !llvm.ptr
    %3 = llvm.alloca %1 x i32 : (i64) -> !llvm.ptr
    llvm.store %arg0, %3 : i32, !llvm.ptr
    %4 = llvm.load %3 : !llvm.ptr -> i32
    %5 = llvm.icmp "sle" %4, %0 : i32
    llvm.cond_br %5, ^bb2, ^bb3
  ^bb1:  // 2 preds: ^bb2, ^bb4
    %6 = llvm.load %2 : !llvm.ptr -> i32
    llvm.return %6 : i32
  ^bb2:  // pred: ^bb0
    llvm.store %0, %2 : i32, !llvm.ptr
    llvm.br ^bb1
  ^bb3:  // pred: ^bb0
    llvm.br ^bb4
  ^bb4:  // pred: ^bb3
    %7 = llvm.load %3 : !llvm.ptr -> i32
    %8 = llvm.load %3 : !llvm.ptr -> i32
    %9 = llvm.sub %8, %0 : i32
    %10 = llvm.call @fact(%9) : (i32) -> i32
    %11 = llvm.mul %7, %10 : i32
    llvm.store %11, %2 : i32, !llvm.ptr
    llvm.br ^bb1
  }
}

@robertoraggi robertoraggi changed the title Add enough MLIR ops to the factorial Add enough MLIR ops to compile the factorial Aug 3, 2025
@robertoraggi robertoraggi merged commit 2a9aa0a into main Aug 3, 2025
9 checks passed
@robertoraggi robertoraggi deleted the robertoraggi/issue617 branch August 3, 2025 20:40
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Add enough MLIR ops and transforms to generate code for fact.c and lower it to LLVM

1 participant