On Sun, Aug 19, 2012 at 01:21:23PM -0400, Jeff Garzik wrote: > Hi Jeff, > > Have you seen this already? > > [penberg@tux sparse]$ cat loop.c > struct list_node { > struct list_node *next; > }; > > int foo(struct list_node *node) > { > int ret = 0; > while (node) { > node = node->next; > ret++; > } > return ret; > } > [penberg@tux sparse]$ ./sparse-llvm loop.c > loop.c:5:5: warning: symbol 'foo' was not declared. Should it be static? > sparse-llvm: Instructions.cpp:730: void llvm::BranchInst::AssertOK(): > Assertion `getCondition()->getType()->isIntegerTy(1) && "May only > branch on boolean predicates!"' failed. > Aborted It doesn't print this particular message anymore, but the llvm verification detects some other things that could cause problems: > jonathan@debian:~/dev/sparse/validation$ (../sparse-llvm backend/penberg-loop.c | llvm-dis) 2>&1 > backend/penberg-loop.c:5:5: warning: symbol 'foo' was not declared. Should it be static? > PHI node operands are not the same type as the result! > %phi = phi %list_node* [ %0, %L0 ], [ %load_target, %L2 ] > Instruction does not dominate all uses! > %phi = phi %list_node* [ %0, %L0 ], [ %load_target, %L2 ] > %cond = icmp ne %list_node* %phi, null > Instruction does not dominate all uses! > %cond = icmp ne %list_node* %phi, null > br i1 %cond, label %L2, label %L3 > Broken module found, verification continues. > PHI node operands are not the same type as the result! > %phi = phi %list_node* [ %0, %L0 ], [ %load_target, %L2 ] > Instruction does not dominate all uses! > %phi = phi %list_node* [ %0, %L0 ], [ %load_target, %L2 ] > %cond = icmp ne %list_node* %phi, null > Instruction does not dominate all uses! > %cond = icmp ne %list_node* %phi, null > br i1 %cond, label %L2, label %L3 > Broken module found, verification continues. > Broken module found, verification continues. > ; ModuleID = '<stdin>' > > %list_node = type { %list_node* } > > define i32 @foo(%list_node*) { > L0: > br label %L1 > > L1: ; preds = %L2, %L0 > %phi = phi %list_node* [ %0, %L0 ], [ %load_target, %L2 ] > %phi1 = phi i32 [ 0, %L0 ], [ %R5, %L2 ] > %cond = icmp ne %list_node* %phi, null > br i1 %cond, label %L2, label %L3 > > L2: ; preds = %L1 > %src_i = ptrtoint %list_node* %phi to i32 > %addr_i = add i32 %src_i, 0 > %addr = inttoptr i32 %addr_i to i32* > %load_target = load i32* %addr This load instruction should use %list_node*. > %R5 = add i32 %phi1, 1 > br label %L1 > > L3: ; preds = %L1 > ret i32 %phi1 > } Jonathan -- To unsubscribe from this list: send the line "unsubscribe linux-sparse" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html