I've got an instruction that has the following pattern (R32C is the 32-bit register class): (set R32C:$rT, (or (and R32C:$rA, R32C:$rC), (and R32C:$rB, (not R32C:$rC)))) tblgen generates the following variants (I've dropped the R32C for brevity): (or (and $rA, $rC), (and $rB, (not $rC))) # original (or (and $rA, $rC), (and (not $rC), $rB)) (or (and $rB, (not $rC)), (and $rA, $rC)) (or (and (not $rC), $rB), (and $rA, $rC)) I would have expected four additional patterns, each with the (and $rC, $rA) variant in it. But I only get the above four. Is this a bug or a feature? :-) -scooter -------------- next part -------------- An HTML attachment was scrubbed... URL: <http://lists.llvm.org/pipermail/llvm-dev/attachments/20070209/419244f2/attachment.html>
On Fri, 9 Feb 2007, Scott Michel wrote:> I would have expected four additional patterns, each with the (and $rC, $rA) > variant in it. But I only get the above four. > > Is this a bug or a feature? :-)This is a feature. They would match the same pattern, so it would just be generating dead code. For the same reason, if you write something like: (set $rd, (and $rs, 123)) you will only get matching code for that pattern, and not for: (set $rd, (and 123, $rs)) which is always canonicalized to the former. -Chris -- http://nondot.org/sabre/ http://llvm.org/
On Feb 9, 2007, at 7:42 PM, Chris Lattner wrote:> On Fri, 9 Feb 2007, Scott Michel wrote: >> I would have expected four additional patterns, each with the (and >> $rC, $rA) >> variant in it. But I only get the above four. >> >> Is this a bug or a feature? :-) > > This is a feature. They would match the same pattern, so it would > just be > generating dead code. For the same reason, if you write something > like:I'm not sure how much of a feature that is -- evidently, in my particular case, enumerating all eight variants ends up generating the desired code. Leaving llvm to its own devices doesn't generate the desired code. I would have expected that the "(and $rA, $rC)" to match "(and $rC, $rA)", were they inverted, but it doesn't get generated in my test code. Generated patterns: (or (and $rA, $rC), (and $rB, (not $rC))) # original (or (and $rA, $rC), (and (not $rC), $rB)) (or (and $rB, (not $rC)), (and $rA, $rC)) (or (and (not $rC), $rB), (and $rA, $rC)) Missing patterns: (or (and $rC, $rA), (and $rB, (not $rC))) (or (and $rC, $rA), (and (not $rC), $rB)) (or (and $rB, (not $rC)), (and $rC, $rA)) (or (and (not $rC), $rB), (and $rC, $rA)) -scooter -------------- next part -------------- An HTML attachment was scrubbed... URL: <http://lists.llvm.org/pipermail/llvm-dev/attachments/20070213/66f36e91/attachment.html>
Seemingly Similar Threads
- [LLVMdev] variant generation question
- [LLVMdev] variant generation question
- [LLVMdev] The one remaining bug keeping CellSPU from release...
- [LLVMdev] The one remaining bug keeping CellSPU from release...
- [LLVMdev] The one remaining bug keeping CellSPU from release...