[llvm] [InstCombine] Simplify associative binary ops when there is a select … (PR #172662)
Gábor Spaits via llvm-commits
llvm-commits at lists.llvm.org
Wed Dec 17 06:39:38 PST 2025
================
@@ -571,3 +571,100 @@ define i32 @OrSelectIcmpNonZero(i32 %a, i32 %b) {
%or = or i32 %sel, %a
ret i32 %or
}
+
+define i8 @orSelectOrNoCommonBits1(i8 %arg0, i8 %arg1) {
+; CHECK-LABEL: @orSelectOrNoCommonBits1(
+; CHECK-NEXT: [[V0:%.*]] = icmp eq i8 [[ARG1:%.*]], -1
+; CHECK-NEXT: [[V3_V:%.*]] = select i1 [[V0]], i8 5, i8 1
+; CHECK-NEXT: [[V3:%.*]] = or i8 [[ARG0:%.*]], [[V3_V]]
+; CHECK-NEXT: ret i8 [[V3]]
+;
+ %v0 = icmp eq i8 %arg1, -1
+ %v1 = or i8 %arg0, 4
+ %v2 = select i1 %v0, i8 %v1, i8 %arg0
+ %v3 = or i8 %v2, 1
+ ret i8 %v3
+}
+
+define i8 @orSelectOrNoCommonBits2(i8 %arg0, i8 %arg1) {
+; CHECK-LABEL: @orSelectOrNoCommonBits2(
+; CHECK-NEXT: [[V0:%.*]] = icmp eq i8 [[ARG1:%.*]], -1
+; CHECK-NEXT: [[V1:%.*]] = zext i1 [[V0]] to i8
+; CHECK-NEXT: [[V2:%.*]] = or i8 [[ARG0:%.*]], [[V1]]
+; CHECK-NEXT: [[V3:%.*]] = or i8 [[V2]], 4
+; CHECK-NEXT: ret i8 [[V3]]
+;
+ %v0 = icmp eq i8 %arg1, -1
+ %v1 = or i8 %arg0, 1
+ %v2 = select i1 %v0, i8 %v1, i8 %arg0
+ %v3 = or i8 %v2, 4
+ ret i8 %v3
+}
+
+define i8 @orSelectOrSubset1(i8 %arg0, i8 %arg1) {
+; CHECK-LABEL: @orSelectOrSubset1(
+; CHECK-NEXT: [[V0:%.*]] = icmp eq i8 [[ARG1:%.*]], -1
+; CHECK-NEXT: [[V3_V:%.*]] = select i1 [[V0]], i8 15, i8 13
+; CHECK-NEXT: [[V3:%.*]] = or i8 [[ARG0:%.*]], [[V3_V]]
+; CHECK-NEXT: ret i8 [[V3]]
+;
+ %v0 = icmp eq i8 %arg1, -1
+ %v1 = or i8 %arg0, 11
+ %v2 = select i1 %v0, i8 %v1, i8 %arg0
+ %v3 = or i8 %v2, 13
+ ret i8 %v3
+}
+
+define i8 @orSelectOrSubset2(i8 %arg0, i8 %arg1) {
+; CHECK-LABEL: @orSelectOrSubset2(
+; CHECK-NEXT: [[V0:%.*]] = icmp eq i8 [[ARG1:%.*]], -1
+; CHECK-NEXT: [[V3_V:%.*]] = select i1 [[V0]], i8 15, i8 11
+; CHECK-NEXT: [[V3:%.*]] = or i8 [[ARG0:%.*]], [[V3_V]]
+; CHECK-NEXT: ret i8 [[V3]]
+;
+ %v0 = icmp eq i8 %arg1, -1
+ %v1 = or i8 %arg0, 13
+ %v2 = select i1 %v0, i8 %v1, i8 %arg0
+ %v3 = or i8 %v2, 11
+ ret i8 %v3
+}
+
+define i8 @orSelectOrSomeCommon1(i8 %arg0, i8 %arg1) {
+; CHECK-LABEL: @orSelectOrSomeCommon1(
+; CHECK-NEXT: [[V0:%.*]] = icmp eq i8 [[ARG1:%.*]], -1
+; CHECK-NEXT: [[V3_V:%.*]] = select i1 [[V0]], i8 15, i8 5
+; CHECK-NEXT: [[V3:%.*]] = or i8 [[ARG0:%.*]], [[V3_V]]
+; CHECK-NEXT: ret i8 [[V3]]
+;
+ %v0 = icmp eq i8 %arg1, -1
+ %v1 = or i8 %arg0, 11
+ %v2 = select i1 %v0, i8 %v1, i8 %arg0
+ %v3 = or i8 %v2, 5
+ ret i8 %v3
+}
+
+define i8 @orSelectOrSomeCommon2(i8 %arg0, i8 %arg1) {
+; CHECK-LABEL: @orSelectOrSomeCommon2(
+; CHECK-NEXT: [[V0:%.*]] = icmp eq i8 [[ARG1:%.*]], -1
+; CHECK-NEXT: [[V3_V:%.*]] = select i1 [[V0]], i8 15, i8 11
+; CHECK-NEXT: [[V3:%.*]] = or i8 [[ARG0:%.*]], [[V3_V]]
+; CHECK-NEXT: ret i8 [[V3]]
+;
+ %v0 = icmp eq i8 %arg1, -1
+ %v1 = or i8 %arg0, 5
+ %v2 = select i1 %v0, i8 %v1, i8 %arg0
+ %v3 = or i8 %v2, 11
+ ret i8 %v3
+}
+
+define i8 @orSelectOrSame(i8 %arg0, i8 %arg1) {
+; CHECK-LABEL: @orSelectOrSame(
+; CHECK-NEXT: [[V1:%.*]] = or i8 [[ARG0:%.*]], 42
+; CHECK-NEXT: ret i8 [[V1]]
+;
+ %v0 = icmp eq i8 %arg1, -1
+ %v1 = or i8 %arg0, 42
+ %v2 = select i1 %v0, i8 %v1, i8 %arg0
+ %v3 = or i8 %v2, 42
+ ret i8 %v3
+}
----------------
spaits wrote:
Continue testing! https://llvm.org/docs/LangRef.html#binary-operations
https://github.com/llvm/llvm-project/pull/172662
More information about the llvm-commits
mailing list