Re: Fwd: [problem] sparse llvm loop conditions

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



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


[Index of Archives]     [Newbies FAQ]     [LKML]     [IETF Annouce]     [DCCP]     [Netdev]     [Networking]     [Security]     [Bugtraq]     [Yosemite]     [MIPS Linux]     [ARM Linux]     [Linux Security]     [Linux RAID]     [Linux SCSI]     [Trinity Fuzzer Tool]

  Powered by Linux