[PATCH] D149077: [InstCombine] Add !noundef if is guaranteed do not violate !range
luxufan via Phabricator via llvm-commits
llvm-commits at lists.llvm.org
Mon Apr 24 22:34:25 PDT 2023
StephenFan updated this revision to Diff 516625.
StephenFan added a comment.
If the instruction self can create poison or undef, it is not guaranteed do not violate the !range metadata
Repository:
rG LLVM Github Monorepo
CHANGES SINCE LAST ACTION
https://reviews.llvm.org/D149077/new/
https://reviews.llvm.org/D149077
Files:
llvm/lib/Transforms/InstCombine/InstCombineCalls.cpp
llvm/test/Transforms/InstCombine/ctpop.ll
llvm/test/Transforms/InstCombine/cttz.ll
Index: llvm/test/Transforms/InstCombine/cttz.ll
===================================================================
--- llvm/test/Transforms/InstCombine/cttz.ll
+++ llvm/test/Transforms/InstCombine/cttz.ll
@@ -118,3 +118,25 @@
%tz = tail call <2 x i64> @llvm.cttz.v2i64(<2 x i64> %s, i1 false)
ret <2 x i64> %tz
}
+
+define i32 @cttz_arg_noundef_zero_poison(i16 noundef %x) {
+; CHECK-LABEL: @cttz_arg_noundef_zero_poison(
+; CHECK-NEXT: [[TMP1:%.*]] = call i16 @llvm.cttz.i16(i16 [[X:%.*]], i1 true), !range [[RNG0]]
+; CHECK-NEXT: [[TZ:%.*]] = zext i16 [[TMP1]] to i32
+; CHECK-NEXT: ret i32 [[TZ]]
+;
+ %z = zext i16 %x to i32
+ %tz = call i32 @llvm.cttz.i32(i32 %z, i1 true)
+ ret i32 %tz
+}
+
+define i32 @cttz_arg_noundef(i16 noundef %x) {
+; CHECK-LABEL: @cttz_arg_noundef(
+; CHECK-NEXT: [[Z:%.*]] = zext i16 [[X:%.*]] to i32
+; CHECK-NEXT: [[TZ:%.*]] = call i32 @llvm.cttz.i32(i32 [[Z]], i1 false), !range [[RNG1]], !noundef !3
+; CHECK-NEXT: ret i32 [[TZ]]
+;
+ %z = zext i16 %x to i32
+ %tz = call i32 @llvm.cttz.i32(i32 %z, i1 false)
+ ret i32 %tz
+}
Index: llvm/test/Transforms/InstCombine/ctpop.ll
===================================================================
--- llvm/test/Transforms/InstCombine/ctpop.ll
+++ llvm/test/Transforms/InstCombine/ctpop.ll
@@ -475,3 +475,12 @@
%i5 = xor i32 %i2, %i4
ret i32 %i5
}
+
+define i8 @arg_noundef(i8 noundef %arg) {
+; CHECK-LABEL: @arg_noundef(
+; CHECK-NEXT: [[CNT:%.*]] = call i8 @llvm.ctpop.i8(i8 [[ARG:%.*]]), !range [[RNG0]], !noundef !6
+; CHECK-NEXT: ret i8 [[CNT]]
+;
+ %cnt = call i8 @llvm.ctpop.i8(i8 %arg)
+ ret i8 %cnt
+}
Index: llvm/lib/Transforms/InstCombine/InstCombineCalls.cpp
===================================================================
--- llvm/lib/Transforms/InstCombine/InstCombineCalls.cpp
+++ llvm/lib/Transforms/InstCombine/InstCombineCalls.cpp
@@ -505,6 +505,21 @@
return cast<Instruction>(Result);
}
+static bool isGuaranteedDoNotViolateRangeMetadata(Instruction *I,
+ unsigned KnownMin,
+ unsigned KnownMax) {
+ if (MDNode *Node = I->getMetadata(LLVMContext::MD_range))
+ if (mdconst::extract<ConstantInt>(Node->getOperand(0))
+ ->equalsInt(KnownMin) &&
+ mdconst::extract<ConstantInt>(Node->getOperand(1))->equalsInt(KnownMax))
+ if (!canCreateUndefOrPoison(cast<Operator>(I),
+ /*ConsiderFlagsAndMetadata*/ false) &&
+ all_of(I->operands(),
+ [&](Value *V) { return isGuaranteedNotToBeUndefOrPoison(V); }))
+ return true;
+ return false;
+}
+
static Instruction *foldCttzCtlz(IntrinsicInst &II, InstCombinerImpl &IC) {
assert((II.getIntrinsicID() == Intrinsic::cttz ||
II.getIntrinsicID() == Intrinsic::ctlz) &&
@@ -602,6 +617,12 @@
return &II;
}
+ if (!II.getMetadata(LLVMContext::MD_noundef) &&
+ isGuaranteedDoNotViolateRangeMetadata(&II, DefiniteZeros,
+ PossibleZeros + 1))
+ II.setMetadata(LLVMContext::MD_noundef,
+ MDNode::get(II.getContext(), nullptr));
+
return nullptr;
}
@@ -683,6 +704,11 @@
return &II;
}
+ if (!II.getMetadata(LLVMContext::MD_noundef) &&
+ isGuaranteedDoNotViolateRangeMetadata(&II, MinCount, MaxCount + 1))
+ II.setMetadata(LLVMContext::MD_noundef,
+ MDNode::get(II.getContext(), nullptr));
+
return nullptr;
}
-------------- next part --------------
A non-text attachment was scrubbed...
Name: D149077.516625.patch
Type: text/x-patch
Size: 3525 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20230425/8610f727/attachment.bin>
More information about the llvm-commits
mailing list