[llvm] [InstCombine] Freeze can be avoided if we propagate NUW or NSW (PR #96261)
via llvm-commits
llvm-commits at lists.llvm.org
Thu Jun 20 19:43:01 PDT 2024
https://github.com/AtariDreams updated https://github.com/llvm/llvm-project/pull/96261
>From 4ba6b150436ca3a4900d5a62b8dc726e867b9ee8 Mon Sep 17 00:00:00 2001
From: Rose <gfunni234 at gmail.com>
Date: Thu, 20 Jun 2024 20:56:05 -0400
Subject: [PATCH] [InstCombine] Freeze can be avoided if we propagate NUW or
NSW
Alive2 Proof:
https://alive2.llvm.org/ce/z/6mkmub
---
.../Transforms/InstCombine/InstCombineMulDivRem.cpp | 7 ++++---
llvm/test/Transforms/InstCombine/mul.ll | 10 ++++------
2 files changed, 8 insertions(+), 9 deletions(-)
diff --git a/llvm/lib/Transforms/InstCombine/InstCombineMulDivRem.cpp b/llvm/lib/Transforms/InstCombine/InstCombineMulDivRem.cpp
index 8fcb3544f682a..ecb68df05e329 100644
--- a/llvm/lib/Transforms/InstCombine/InstCombineMulDivRem.cpp
+++ b/llvm/lib/Transforms/InstCombine/InstCombineMulDivRem.cpp
@@ -166,9 +166,10 @@ static Value *foldMulShl1(BinaryOperator &Mul, bool CommuteOperands,
if (match(Y, m_OneUse(m_Add(m_BinOp(Shift), m_One()))) &&
match(Shift, m_OneUse(m_Shl(m_One(), m_Value(Z))))) {
bool PropagateNSW = HasNSW && Shift->hasNoSignedWrap();
- Value *FrX = Builder.CreateFreeze(X, X->getName() + ".fr");
- Value *Shl = Builder.CreateShl(FrX, Z, "mulshl", HasNUW, PropagateNSW);
- return Builder.CreateAdd(Shl, FrX, Mul.getName(), HasNUW, PropagateNSW);
+ if (!HasNUW && !HasNSW)
+ X = Builder.CreateFreeze(X, X->getName() + ".fr");
+ Value *Shl = Builder.CreateShl(X, Z, "mulshl", HasNUW, PropagateNSW);
+ return Builder.CreateAdd(Shl, X, Mul.getName(), HasNUW, PropagateNSW);
}
// Similar to above, but a decrement of the shifted value is disguised as
diff --git a/llvm/test/Transforms/InstCombine/mul.ll b/llvm/test/Transforms/InstCombine/mul.ll
index 66455479feaaa..27ac2449c9a56 100644
--- a/llvm/test/Transforms/InstCombine/mul.ll
+++ b/llvm/test/Transforms/InstCombine/mul.ll
@@ -175,9 +175,8 @@ define <3 x i5> @shl1_nuw_increment_commute(<3 x i5> %x, <3 x i5> noundef %p) {
define i5 @shl1_nsw_increment(i5 %x, i5 %y) {
; CHECK-LABEL: @shl1_nsw_increment(
-; CHECK-NEXT: [[Y_FR:%.*]] = freeze i5 [[Y:%.*]]
-; CHECK-NEXT: [[MULSHL:%.*]] = shl i5 [[Y_FR]], [[X:%.*]]
-; CHECK-NEXT: [[M1:%.*]] = add i5 [[MULSHL]], [[Y_FR]]
+; CHECK-NEXT: [[MULSHL:%.*]] = shl i5 [[Y:%.*]], [[X:%.*]]
+; CHECK-NEXT: [[M1:%.*]] = add i5 [[MULSHL]], [[Y]]
; CHECK-NEXT: ret i5 [[M1]]
;
%pow2x = shl i5 1, %x
@@ -188,9 +187,8 @@ define i5 @shl1_nsw_increment(i5 %x, i5 %y) {
define i5 @shl1_nsw_nsw_increment(i5 %x, i5 %y) {
; CHECK-LABEL: @shl1_nsw_nsw_increment(
-; CHECK-NEXT: [[Y_FR:%.*]] = freeze i5 [[Y:%.*]]
-; CHECK-NEXT: [[MULSHL:%.*]] = shl nsw i5 [[Y_FR]], [[X:%.*]]
-; CHECK-NEXT: [[M1:%.*]] = add nsw i5 [[MULSHL]], [[Y_FR]]
+; CHECK-NEXT: [[MULSHL:%.*]] = shl nsw i5 [[Y:%.*]], [[X:%.*]]
+; CHECK-NEXT: [[M1:%.*]] = add nsw i5 [[MULSHL]], [[Y]]
; CHECK-NEXT: ret i5 [[M1]]
;
%pow2x = shl nsw i5 1, %x
More information about the llvm-commits
mailing list