+/*--... Operations on phi nodes ............................................--*/
+
+/* (llvalue * llbasicblock) -> llvalue -> unit */
+CAMLprim value llvm_add_incoming(value Incoming, LLVMValueRef PhiNode) {
+ LLVMAddIncoming(PhiNode,
+ (LLVMValueRef*) &Field(Incoming, 0),
+ (LLVMBasicBlockRef*) &Field(Incoming, 1),
+ 1);
+ return Val_unit;
+}
+
+/* llvalue -> (llvalue * llbasicblock) list */
+CAMLprim value llvm_incoming(LLVMValueRef PhiNode) {
+ unsigned I;
+ CAMLparam0();
+ CAMLlocal3(Hd, Tl, Tmp);
+
+ /* Build a tuple list of them. */
+ Tl = Val_int(0);
+ for (I = LLVMCountIncoming(PhiNode); I != 0; ) {
+ Hd = alloc(2, 0);
+ Store_field(Hd, 0, (value) LLVMGetIncomingValue(PhiNode, --I));
+ Store_field(Hd, 1, (value) LLVMGetIncomingBlock(PhiNode, I));
+
+ Tmp = alloc(2, 0);
+ Store_field(Tmp, 0, Hd);
+ Store_field(Tmp, 1, Tl);
+ Tl = Tmp;
+ }
+
+ CAMLreturn(Tl);
+}
+