[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