Before this patch:
- For r = or op0, op1, tryBitfieldInsertOpFromOr combines it to BFI when
- one of the two operands is bit-field-positioning or bit-field-extraction op; and
- bits from the two operands don't overlap
After this patch:
- Right before OR is combined to BFI, evaluates if ORR with left-shifted operand is better.
A motivating example (https://godbolt.org/z/rnMrzs5vn, which is added as a test case in test_orr_not_bfi in CodeGen/AArch64/bitfield-insert.ll)
For IR:
define i64 @test_orr_not_bfxil(i64 %0) { %2 = and i64 %0, 127 %3 = lshr i64 %0, 1 %4 = and i64 %3, 16256 %5 = or i64 %4, %2 ret i64 %5 }
Before:
lsr x8, x0, #1 and x8, x8, #0x3f80 bfxil x8, x0, #0, #7
After:
ubfx x8, x0, #8, #7 and x9, x0, #0x7f orr x0, x9, x8, lsl #7
You say #7 here, but #8 elsewhere, including the test. I think 7 is correct for this example.