[LLVMdev] InstCombine Question

David Greene dag at cray.com
Fri Apr 4 11:42:00 PDT 2008


On Friday 04 April 2008 13:07, Chris Lattner wrote:

> > So how does the undef store to null appear in the IR when it isn't
> > attached anywhere and how can I get rid of it?
>
> Don't do undefined behavior? :)

I don't think it's undefined behavior.  Right before instcombine, we have 
this:

	%r60 = load <2 x i64>* %"$LCS_1", align 16		; <<2 x i64>> [#uses=2]	;  
srcLine 41
	%r61 = extractelement <2 x i64> %r60, i32 0		; <i64> [#uses=1]	;  srcLine 41
	%r62 = getelementptr <2 x double>* null, i32 0, i64 %r61		; <double*> 
[#uses=1]	;  srcLine 41
	%r63 = load double* %r62		; <double> [#uses=1]	;  srcLine 41

So we're loading a vector of pointers and then using getelementptr as
basically a reg-reg copy with a cast (I think).  Yes, it's a little weird, but 
legal  AFAICS.

I'm not sure if the above code is really kosher.  It is very strange to see 
the typing of the extractelement and GEP here.

But instcombine only looks at the first operand to GEP, sees it's null and
just assumes it's useless code.  Not the case in this example.

So I think this is actually a bug in instcombine and maybe elsewhere as 
well.  What  do you think?

                                                -Dave



More information about the llvm-dev mailing list