<div dir="ltr"><div dir="ltr"><div dir="ltr"><div>Hello, LLVM devs.</div><div><br></div><div>I'm compiling the following simple IR:</div><div><br></div><div>define dso_local i32 @main(i32 %argc, i8** %argv) {<br>entry:<br>  %retval = alloca i32, align 4<br>  %argc.addr = alloca i32, align 4<br>  %argv.addr = alloca i8**, align 8<br>  store i32 0, i32* %retval, align 4<br>  store i32 %argc, i32* %argc.addr, align 4<br>  store i8** %argv, i8*** %argv.addr, align 8<br>  ret i32 0<br>}<br></div><div><br></div><div>using `llc -march=sparc -debug-only=isel`.</div><div><br></div><div>In the Initial selection DAG I see</div><div><br></div><div>t19: ch,glue = CopyToReg t17, Register:i32 $i0, Constant:i32<0><br></div><div><br></div><div>line. The same "Constant:i32<0>" node I see in my toy backend, which forces me to add a pattern that lowers it using "xor reg,reg". Much like "or g0,g0" pattern in SPARC.<br></div><div><br></div><div>However, I don't see that Constant node when compiling using X86 backend. How does it achieve this? And why initial DAGs are different at all? I got impression that initial DAG is fully target-independent, so these DAG should be the same before starting ISel. Am I wrong?</div><div><br></div><div>Thanks in advance.<br></div></div></div></div>