[llvm] [SCEV] Use or disjoint flag (PR #74467)
Nikita Popov via llvm-commits
llvm-commits at lists.llvm.org
Tue Dec 5 05:30:45 PST 2023
================
@@ -6,15 +6,49 @@ define i8 @or-of-constant-with-no-common-bits-set(i8 %x, i8 %y) {
; CHECK-NEXT: Classifying expressions for: @or-of-constant-with-no-common-bits-set
; CHECK-NEXT: %t0 = shl i8 %x, 2
; CHECK-NEXT: --> (4 * %x) U: [0,-3) S: [-128,125)
-; CHECK-NEXT: %r = or i8 %t0, 3
+; CHECK-NEXT: %r = or disjoint i8 %t0, 3
; CHECK-NEXT: --> (3 + (4 * %x))<nuw><nsw> U: [3,0) S: [-125,-128)
; CHECK-NEXT: Determining loop execution counts for: @or-of-constant-with-no-common-bits-set
;
%t0 = shl i8 %x, 2
- %r = or i8 %t0, 3
+ %r = or disjoint i8 %t0, 3
ret i8 %r
}
+define i8 @or-disjoint(i8 %x, i8 %y) {
+; CHECK-LABEL: 'or-disjoint'
+; CHECK-NEXT: Classifying expressions for: @or-disjoint
+; CHECK-NEXT: %or = or disjoint i8 %x, %y
+; CHECK-NEXT: --> (%x + %y) U: full-set S: full-set
+; CHECK-NEXT: Determining loop execution counts for: @or-disjoint
+;
+ %or = or disjoint i8 %x, %y
+ ret i8 %or
+}
+
+define i8 @or-no-disjoint(i8 %x, i8 %y) {
+; CHECK-LABEL: 'or-no-disjoint'
+; CHECK-NEXT: Classifying expressions for: @or-no-disjoint
+; CHECK-NEXT: %or = or i8 %x, %y
+; CHECK-NEXT: --> %or U: full-set S: full-set
+; CHECK-NEXT: Determining loop execution counts for: @or-no-disjoint
+;
+ %or = or i8 %x, %y
+ ret i8 %or
+}
+
+; FIXME: We could add nuw nsw flags here.
----------------
nikic wrote:
I added some tests to make sure we don't incorrectly add the nuw/nsw flags if poison doesn't imply UB, but found that we actually never transfer these. This is because the NSW/NUW flags set in MatchBinaryOp end up being ignored in favor of the ones on the original instruction. I'll fix that in a followup.
https://github.com/llvm/llvm-project/pull/74467
More information about the llvm-commits
mailing list