[PATCH] D76048: [CodeGenPrepare] Expand freeze conversion to support fcmp and icmp with null
Juneyoung Lee via Phabricator via llvm-commits
llvm-commits at lists.llvm.org
Thu Mar 12 00:52:37 PDT 2020
aqjune created this revision.
Herald added subscribers: llvm-commits, hiraditya.
Herald added a project: LLVM.
aqjune edited the summary of this revision.
aqjune added reviewers: reames, jdoerfert.
This is a simple patch that expands https://reviews.llvm.org/D75859 to pointer comparison and fcmp
Checked with Alive2
Repository:
rG LLVM Github Monorepo
https://reviews.llvm.org/D76048
Files:
llvm/lib/CodeGen/CodeGenPrepare.cpp
llvm/test/Transforms/CodeGenPrepare/X86/freeze-cmp.ll
llvm/test/Transforms/CodeGenPrepare/X86/freeze-icmp.ll
Index: llvm/test/Transforms/CodeGenPrepare/X86/freeze-cmp.ll
===================================================================
--- llvm/test/Transforms/CodeGenPrepare/X86/freeze-cmp.ll
+++ llvm/test/Transforms/CodeGenPrepare/X86/freeze-cmp.ll
@@ -71,5 +71,40 @@
ret void
}
+define i1 @ptrcmp(i8* %p) {
+; CHECK-LABEL: @ptrcmp(
+; CHECK-NEXT: [[FR:%.*]] = freeze i8* [[P:%.*]]
+; CHECK-NEXT: [[C:%.*]] = icmp eq i8* [[FR]], null
+; CHECK-NEXT: ret i1 [[C]]
+;
+ %c = icmp eq i8* %p, null
+ %fr = freeze i1 %c
+ ret i1 %fr
+}
+
+
+define i1 @fcmp(float %a) {
+; CHECK-LABEL: @fcmp(
+; CHECK-NEXT: [[FR:%.*]] = freeze float [[A:%.*]]
+; CHECK-NEXT: [[C:%.*]] = fcmp oeq float [[FR]], 0.000000e+00
+; CHECK-NEXT: ret i1 [[C]]
+;
+ %c = fcmp oeq float %a, 0.0
+ %fr = freeze i1 %c
+ ret i1 %fr
+}
+
+define i1 @fcmp_nan(float %a) {
+; CHECK-LABEL: @fcmp_nan(
+; CHECK-NEXT: [[C:%.*]] = fcmp nnan oeq float [[A:%.*]], 0.000000e+00
+; CHECK-NEXT: [[FR:%.*]] = freeze i1 [[C]]
+; CHECK-NEXT: ret i1 [[FR]]
+;
+ %c = fcmp nnan oeq float %a, 0.0
+ %fr = freeze i1 %c
+ ret i1 %fr
+}
+
+
declare void @g1()
declare void @g2()
Index: llvm/lib/CodeGen/CodeGenPrepare.cpp
===================================================================
--- llvm/lib/CodeGen/CodeGenPrepare.cpp
+++ llvm/lib/CodeGen/CodeGenPrepare.cpp
@@ -7194,16 +7194,25 @@
if (FreezeInst *FI = dyn_cast<FreezeInst>(I)) {
// br(freeze(icmp a, const)) -> br(icmp (freeze a), const)
// This helps generate efficient conditional jumps.
- if (ICmpInst *II = dyn_cast<ICmpInst>(FI->getOperand(0))) {
- auto Op0 = II->getOperand(0), Op1 = II->getOperand(1);
- bool Const0 = isa<ConstantInt>(Op0), Const1 = isa<ConstantInt>(Op1);
- if (II->hasOneUse() && (Const0 || Const1)) {
+ Instruction *CmpI = nullptr;
+ if (ICmpInst *II = dyn_cast<ICmpInst>(FI->getOperand(0)))
+ CmpI = II;
+ else if (FCmpInst *F = dyn_cast<FCmpInst>(FI->getOperand(0)))
+ CmpI = F->getFastMathFlags().none() ? F : nullptr;
+
+ if (CmpI) {
+ auto Op0 = CmpI->getOperand(0), Op1 = CmpI->getOperand(1);
+ bool Const0 = isa<ConstantInt>(Op0) || isa<ConstantFP>(Op0) ||
+ isa<ConstantPointerNull>(Op0);
+ bool Const1 = isa<ConstantInt>(Op1) || isa<ConstantFP>(Op1) ||
+ isa<ConstantPointerNull>(Op1);
+ if (CmpI->hasOneUse() && (Const0 || Const1)) {
if (!Const0 || !Const1) {
- auto *F = new FreezeInst(Const0 ? Op1 : Op0, "", II);
+ auto *F = new FreezeInst(Const0 ? Op1 : Op0, "", CmpI);
F->takeName(FI);
- II->setOperand(Const0 ? 1 : 0, F);
+ CmpI->setOperand(Const0 ? 1 : 0, F);
}
- FI->replaceAllUsesWith(II);
+ FI->replaceAllUsesWith(CmpI);
FI->eraseFromParent();
return true;
}
-------------- next part --------------
A non-text attachment was scrubbed...
Name: D76048.249847.patch
Type: text/x-patch
Size: 2865 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20200312/facd8126/attachment.bin>
More information about the llvm-commits
mailing list