[llvm] And sub combine (PR #119316)
via llvm-commits
llvm-commits at lists.llvm.org
Mon Dec 9 19:14:38 PST 2024
https://github.com/fengfeng09 created https://github.com/llvm/llvm-project/pull/119316
None
>From 312c90d09d568ce87982d5867556c901bd8838a0 Mon Sep 17 00:00:00 2001
From: "feng.feng" <feng.feng at iluvatar.com>
Date: Tue, 10 Dec 2024 10:38:43 +0800
Subject: [PATCH 1/2] [InstCombine][NFC] Precommit testcase for and-sub
combine.
---
.../InstCombine/X86/and-sub-combine.ll | 16 ++++++++++++++++
1 file changed, 16 insertions(+)
create mode 100644 llvm/test/Transforms/InstCombine/X86/and-sub-combine.ll
diff --git a/llvm/test/Transforms/InstCombine/X86/and-sub-combine.ll b/llvm/test/Transforms/InstCombine/X86/and-sub-combine.ll
new file mode 100644
index 00000000000000..5bf21629b13202
--- /dev/null
+++ b/llvm/test/Transforms/InstCombine/X86/and-sub-combine.ll
@@ -0,0 +1,16 @@
+; NOTE: Assertions have been autogenerated by utils/update_test_checks.py
+; RUN: opt < %s -passes=instcombine -mtriple=x86_64-unknown-unknown -S | FileCheck %s
+
+define i8 @and_sub(i8 %a) {
+; CHECK-LABEL: @and_sub(
+; CHECK-NEXT: [[AND1:%.*]] = and i8 [[A:%.*]], 15
+; CHECK-NEXT: [[AND2:%.*]] = and i8 [[A]], 3
+; CHECK-NEXT: [[RET:%.*]] = sub nsw i8 [[AND1]], [[AND2]]
+; CHECK-NEXT: ret i8 [[RET]]
+;
+ %and1 = and i8 %a, 15
+ %and2 = and i8 %a, 3
+
+ %ret = sub i8 %and1, %and2
+ ret i8 %ret
+}
>From cce5dac25218f2dd34393fb6758fe4db727e6055 Mon Sep 17 00:00:00 2001
From: "chenglin.bi" <chenglin.bi at iluvatar.com>
Date: Thu, 5 Dec 2024 10:12:08 +0800
Subject: [PATCH 2/2] [InstCombine] Add pattern 'if (C1 & C2) == C2 then (X &
C1) - (X & C2) -> X & (C1 ^ C2)'
https://alive2.llvm.org/ce/z/BveKM5
---
llvm/lib/Transforms/InstCombine/InstCombineAddSub.cpp | 9 +++++++++
llvm/test/Transforms/InstCombine/X86/and-sub-combine.ll | 4 +---
2 files changed, 10 insertions(+), 3 deletions(-)
diff --git a/llvm/lib/Transforms/InstCombine/InstCombineAddSub.cpp b/llvm/lib/Transforms/InstCombine/InstCombineAddSub.cpp
index ea7942ef978110..51831bba9c423b 100644
--- a/llvm/lib/Transforms/InstCombine/InstCombineAddSub.cpp
+++ b/llvm/lib/Transforms/InstCombine/InstCombineAddSub.cpp
@@ -2280,6 +2280,15 @@ Instruction *InstCombinerImpl::visitSub(BinaryOperator &I) {
if (match(Op0, m_OneUse(m_Add(m_Value(X), m_AllOnes()))))
return BinaryOperator::CreateAdd(Builder.CreateNot(Op1), X);
+ const APInt *C1, *C2;
+ // if (C1 & C2) == C2 then (X & C1) - (X & C2) -> X & (C1 ^ C2)
+ if (match(Op0, m_And(m_Value(X), m_APInt(C1))) &&
+ match(Op1, m_And(m_Specific(X), m_APInt(C2)))) {
+ if (C2->eq(*C1 & *C2))
+ return BinaryOperator::CreateAnd(
+ X, ConstantInt::get(I.getType(), *C1 ^ *C2));
+ }
+
// Reassociate sub/add sequences to create more add instructions and
// reduce dependency chains:
// ((X - Y) + Z) - Op1 --> (X + Z) - (Y + Op1)
diff --git a/llvm/test/Transforms/InstCombine/X86/and-sub-combine.ll b/llvm/test/Transforms/InstCombine/X86/and-sub-combine.ll
index 5bf21629b13202..5120717bf1481a 100644
--- a/llvm/test/Transforms/InstCombine/X86/and-sub-combine.ll
+++ b/llvm/test/Transforms/InstCombine/X86/and-sub-combine.ll
@@ -3,9 +3,7 @@
define i8 @and_sub(i8 %a) {
; CHECK-LABEL: @and_sub(
-; CHECK-NEXT: [[AND1:%.*]] = and i8 [[A:%.*]], 15
-; CHECK-NEXT: [[AND2:%.*]] = and i8 [[A]], 3
-; CHECK-NEXT: [[RET:%.*]] = sub nsw i8 [[AND1]], [[AND2]]
+; CHECK-NEXT: [[RET:%.*]] = and i8 [[A:%.*]], 12
; CHECK-NEXT: ret i8 [[RET]]
;
%and1 = and i8 %a, 15
More information about the llvm-commits
mailing list