Code like the following:
define i32 @foo(i32 %a, i1 zeroext %b) addrspace(1) { entry: %conv = zext i1 %b to i32 %add = add nsw i32 %conv, %a ret i32 %add }
Would compile to the following (incorrect) code:
foo: mov r18, r20 clr r19 add r22, r18 adc r23, r19 sbci r24, 0 sbci r25, 0 ret
Those sbci instructions are clearly wrong, they should have been adc instructions.
This commit improves codegen to use adc instead:
foo: mov r18, r20 clr r19 ldi r20, 0 ldi r21, 0 add r22, r18 adc r23, r19 adc r24, r20 adc r25, r21 ret
This code is not optimal (it could be just 5 instructions instead of the current 9) but at least it doesn't miscompile.
WARNING: I don't know what I'm doing here. While removing that pattern works, I don't know why it's there or whether I just introduced a different bug.