test-unssa.c compiles this: extern void func(int i, ...); void foo(int i) { func(0, (float) i, (double) i, i); } ...into this: fpcast.64 %r3 <- (32) %arg1 scast.64 %r5 <- (32) %arg1 call func, $0, %r3, %r5, %arg1 ret That's with the default settings. Unfortunately, with Clue, sizeof(double) == sizeof(int), so that second instruction comes out as: scast.32 %r5 <- (32) %arg1 This then causes the simplification code in simplify_cast() to discard it: if (size == orig_size) { int op = (orig_type->ctype.modifiers & MOD_SIGNED) ? OP_SCAST : OP_CAST; if (insn->opcode == op) goto simplify; } The end result is that my call statement turns into: call func, $0, %r3, %arg1, %arg1 ...which is wrong. I assume that Clue's odd configuration is violating some assumption somewhere, but I'm not well-enough versed with the sparse internals to know where. It does seem odd to me that it's generating an OP_SCAST to convert the int to a double, rather than an OP_FPCAST like in the float. In the mean time, I've commented out the quoted stanza from simplify_cast() on my setup, which makes things work, but that's not really very pleasant. Can anyone shed light on what might be happening here? Could this be a symptom of some more serious underlying bug? -- ┌─── dg@cowlark.com ───── http://www.cowlark.com ───── │ │ "All power corrupts, but we need electricity." --- Diana Wynne Jones, │ _Archer's Goon_
Attachment:
signature.asc
Description: OpenPGP digital signature