[llvm] 90b55f2 - [CVP] Don't freeze value if guaranteed non-undef
Nikita Popov via llvm-commits
llvm-commits at lists.llvm.org
Mon Jun 19 06:45:00 PDT 2023
Author: Nikita Popov
Date: 2023-06-19T15:44:51+02:00
New Revision: 90b55f2bba365c1e83c3be60583b449e07f846f3
URL: https://github.com/llvm/llvm-project/commit/90b55f2bba365c1e83c3be60583b449e07f846f3
DIFF: https://github.com/llvm/llvm-project/commit/90b55f2bba365c1e83c3be60583b449e07f846f3.diff
LOG: [CVP] Don't freeze value if guaranteed non-undef
Avoid inserting the freeze if not necessary, as this allows LVI
to continue reasoning about the expression.
Added:
Modified:
llvm/lib/Transforms/Scalar/CorrelatedValuePropagation.cpp
llvm/test/Transforms/CorrelatedValuePropagation/cond-at-use.ll
llvm/test/Transforms/CorrelatedValuePropagation/urem-expansion.ll
Removed:
################################################################################
diff --git a/llvm/lib/Transforms/Scalar/CorrelatedValuePropagation.cpp b/llvm/lib/Transforms/Scalar/CorrelatedValuePropagation.cpp
index 9f503fb43bc35..488297110d6fa 100644
--- a/llvm/lib/Transforms/Scalar/CorrelatedValuePropagation.cpp
+++ b/llvm/lib/Transforms/Scalar/CorrelatedValuePropagation.cpp
@@ -766,7 +766,9 @@ static bool expandUDivOrURem(BinaryOperator *Instr, const ConstantRange &XCR,
if (IsRem) {
// NOTE: this transformation introduces two uses of X,
// but it may be undef so we must freeze it first.
- Value *FrozenX = B.CreateFreeze(X, X->getName() + ".frozen");
+ Value *FrozenX = X;
+ if (!isGuaranteedNotToBeUndefOrPoison(X))
+ FrozenX = B.CreateFreeze(X, X->getName() + ".frozen");
auto *AdjX = B.CreateNUWSub(FrozenX, Y, Instr->getName() + ".urem");
auto *Cmp =
B.CreateICmp(ICmpInst::ICMP_ULT, FrozenX, Y, Instr->getName() + ".cmp");
diff --git a/llvm/test/Transforms/CorrelatedValuePropagation/cond-at-use.ll b/llvm/test/Transforms/CorrelatedValuePropagation/cond-at-use.ll
index dbb63203cc945..8e5ec878bb894 100644
--- a/llvm/test/Transforms/CorrelatedValuePropagation/cond-at-use.ll
+++ b/llvm/test/Transforms/CorrelatedValuePropagation/cond-at-use.ll
@@ -346,10 +346,9 @@ define i16 @urem_elide(i16 noundef %x) {
define i16 @urem_expand(i16 noundef %x) {
; CHECK-LABEL: @urem_expand(
-; CHECK-NEXT: [[X_FROZEN:%.*]] = freeze i16 [[X:%.*]]
-; CHECK-NEXT: [[UREM_UREM:%.*]] = sub nuw i16 [[X_FROZEN]], 42
-; CHECK-NEXT: [[UREM_CMP:%.*]] = icmp ult i16 [[X_FROZEN]], 42
-; CHECK-NEXT: [[UREM:%.*]] = select i1 [[UREM_CMP]], i16 [[X_FROZEN]], i16 [[UREM_UREM]]
+; CHECK-NEXT: [[UREM_UREM:%.*]] = sub nuw i16 [[X:%.*]], 42
+; CHECK-NEXT: [[UREM_CMP:%.*]] = icmp ult i16 [[X]], 42
+; CHECK-NEXT: [[UREM:%.*]] = select i1 [[UREM_CMP]], i16 [[X]], i16 [[UREM_UREM]]
; CHECK-NEXT: [[CMP:%.*]] = icmp ult i16 [[X]], 84
; CHECK-NEXT: [[SEL:%.*]] = select i1 [[CMP]], i16 [[UREM]], i16 24
; CHECK-NEXT: ret i16 [[SEL]]
diff --git a/llvm/test/Transforms/CorrelatedValuePropagation/urem-expansion.ll b/llvm/test/Transforms/CorrelatedValuePropagation/urem-expansion.ll
index cc4644d83aaf5..2f1ca2483f67d 100644
--- a/llvm/test/Transforms/CorrelatedValuePropagation/urem-expansion.ll
+++ b/llvm/test/Transforms/CorrelatedValuePropagation/urem-expansion.ll
@@ -331,12 +331,10 @@ define i1 @icmp_after_expansion(i8 noundef %x) {
; CHECK-LABEL: @icmp_after_expansion(
; CHECK-NEXT: [[CMP_X_UPPER:%.*]] = icmp ult i8 [[X:%.*]], 6
; CHECK-NEXT: call void @llvm.assume(i1 [[CMP_X_UPPER]])
-; CHECK-NEXT: [[X_FROZEN:%.*]] = freeze i8 [[X]]
-; CHECK-NEXT: [[REM_UREM:%.*]] = sub nuw i8 [[X_FROZEN]], 3
-; CHECK-NEXT: [[REM_CMP:%.*]] = icmp ult i8 [[X_FROZEN]], 3
-; CHECK-NEXT: [[REM:%.*]] = select i1 [[REM_CMP]], i8 [[X_FROZEN]], i8 [[REM_UREM]]
-; CHECK-NEXT: [[CMP:%.*]] = icmp eq i8 [[REM]], 3
-; CHECK-NEXT: ret i1 [[CMP]]
+; CHECK-NEXT: [[REM_UREM:%.*]] = sub nuw i8 [[X]], 3
+; CHECK-NEXT: [[REM_CMP:%.*]] = icmp ult i8 [[X]], 3
+; CHECK-NEXT: [[REM:%.*]] = select i1 [[REM_CMP]], i8 [[X]], i8 [[REM_UREM]]
+; CHECK-NEXT: ret i1 false
;
%cmp.x.upper = icmp ult i8 %x, 6
call void @llvm.assume(i1 %cmp.x.upper)
More information about the llvm-commits
mailing list