[PATCH] D90288: [FPEnv] Allow strict SETCC falling back if strict FP is not supported.
Pengfei Wang via Phabricator via llvm-commits
llvm-commits at lists.llvm.org
Tue Oct 27 23:29:56 PDT 2020
pengfei created this revision.
pengfei added reviewers: uweigand, kpn, craig.topper, cameron.mcinally, andrew.w.kaylor, mibintc, sunfish.
Herald added subscribers: llvm-commits, hiraditya, jgravelle-google, sbc100, dschuff.
Herald added a project: LLVM.
pengfei requested review of this revision.
Herald added a subscriber: aheejin.
This patch fix bug: https://bugs.llvm.org/show_bug.cgi?id=47990
Repository:
rG LLVM Github Monorepo
https://reviews.llvm.org/D90288
Files:
llvm/lib/CodeGen/SelectionDAG/LegalizeDAG.cpp
llvm/test/CodeGen/WebAssembly/pr47990.ll
Index: llvm/test/CodeGen/WebAssembly/pr47990.ll
===================================================================
--- /dev/null
+++ llvm/test/CodeGen/WebAssembly/pr47990.ll
@@ -0,0 +1,29 @@
+; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
+; RUN: llc < %s | FileCheck %s
+
+target datalayout = "e-m:e-p:32:32-i64:64-n32:64-S128"
+target triple = "wasm32-unknown-wasi"
+
+ at b = global double 0.000000e+00, align 8
+ at a = global double 0.000000e+00, align 8
+
+define i32 @c() nounwind strictfp {
+; CHECK-LABEL: c:
+; CHECK: .functype c () -> (i32)
+; CHECK-NEXT: # %bb.0: # %entry
+; CHECK-NEXT: global.get __stack_pointer
+; CHECK-NEXT: i32.const 16
+; CHECK-NEXT: i32.sub
+; CHECK-NEXT: i32.load 12
+; CHECK-NEXT: # fallthrough-return
+entry:
+ %retval = alloca i32, align 4
+ %0 = load double, double* @b, align 8
+ %1 = load double, double* @a, align 8
+ %cmp = call i1 @llvm.experimental.constrained.fcmp.f64(double %0, double %1, metadata !"oeq", metadata !"fpexcept.strict") strictfp
+ %conv = zext i1 %cmp to i32
+ %2 = load i32, i32* %retval, align 4
+ ret i32 %2
+}
+
+declare i1 @llvm.experimental.constrained.fcmp.f64(double, double, metadata, metadata) strictfp
Index: llvm/lib/CodeGen/SelectionDAG/LegalizeDAG.cpp
===================================================================
--- llvm/lib/CodeGen/SelectionDAG/LegalizeDAG.cpp
+++ llvm/lib/CodeGen/SelectionDAG/LegalizeDAG.cpp
@@ -3759,9 +3759,18 @@
break;
}
- // FIXME: It seems Legalized is false iff CCCode is Legal. I don't
- // understand if this code is useful for strict nodes.
- assert(!IsStrict && "Don't know how to expand for strict nodes.");
+ if (IsStrict) {
+ MVT OpVT = Tmp1.getSimpleValueType();
+ // FIXME: For now, we just fall back to the non-strict version if SETCC is
+ // legal on the target.
+ if (!TLI.isStrictFPEnabled() &&
+ TLI.getOperationAction(ISD::SETCC, OpVT) == TargetLowering::Legal)
+ return true;
+
+ // FIXME: We may need to add STRICT_FSELECT_CC and STRICT_FSELECT_CCS
+ // handing for target that only supports SELECT_CC.
+ assert("Expanding to SELECT_CC is not supported for strict nodes.");
+ }
// Otherwise, SETCC for the given comparison type must be completely
// illegal; expand it into a SELECT_CC.
@@ -3785,7 +3794,7 @@
break;
}
case ISD::SELECT_CC: {
- // TODO: need to add STRICT_SELECT_CC and STRICT_SELECT_CCS
+ // TODO: need to add STRICT_FSELECT_CC and STRICT_FSELECT_CCS
Tmp1 = Node->getOperand(0); // LHS
Tmp2 = Node->getOperand(1); // RHS
Tmp3 = Node->getOperand(2); // True
@@ -3860,7 +3869,7 @@
break;
}
case ISD::BR_CC: {
- // TODO: need to add STRICT_BR_CC and STRICT_BR_CCS
+ // TODO: need to add STRICT_FBR_CC and STRICT_FBR_CCS
SDValue Chain;
Tmp1 = Node->getOperand(0); // Chain
Tmp2 = Node->getOperand(2); // LHS
-------------- next part --------------
A non-text attachment was scrubbed...
Name: D90288.301185.patch
Type: text/x-patch
Size: 2996 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20201028/fe0a6f23/attachment-0001.bin>
More information about the llvm-commits
mailing list