[InstCombine] Combine instructions of type or/and where AND masks can be combined.
The patch simplifies some of the patterns as below (A | (B & C0)) | (B & C1) -> A | (B & C0|C1) ((B & C0) | A) | (B & C1) -> (B & C0|C1) | A In some scenarios like byte reverse on half word, we can see this pattern multiple times and this conversion can optimize these patterns. Additionally this commit fixes the issue reported with the test case. int f(int a, int b) { int c = ((unsigned char)(a >> 23) & 925); if (a) c = (a >> 23 & b) | ((unsigned char)(a >> 23) & 925) | (b >> 23 & 157); return c; } The previous revision/commit did not check one-use of an intermediate value that this transform re-uses. When that value has another use, an existing transform will try to invert the transform here. By adding one-use checks, we avoid the infinite loops seen with the earlier commit. Differential Revision: https://reviews.llvm.org/D124119
Loading
Please sign in to comment