[PATCH] D33773: [ARM] llc -arm-execute-only with floating point runs into UNREACHABLE

Alexandros Lamprineas via Phabricator via llvm-commits llvm-commits at lists.llvm.org
Thu Jun 1 05:22:37 PDT 2017


labrinea created this revision.
Herald added subscribers: kristof.beyls, javed.absar, aemerson.

The DAG Combiner tries to generate literal pools for floating point constants when both -arm-execute-only and vfp instructions are enabled:
(a cond b) ? 1.0f : 2.0f -> load (tmp + ((a cond b) ? 0 : 4)

reproducer.ll:

  define arm_aapcs_vfpcc float @lower_fpconst_select(float %f) {
    %cmp = fcmp nnan oeq float %f, 0.000000e+00
    %sel = select i1 %cmp, float 5.000000e+08, float 5.000000e+09
    ret float %sel
  }

$ llc -mtriple=thumbv8m.main -arm-execute-only -mattr=fp-armv8 reproducer.ll
execute-only should not generate constant pools
UNREACHABLE executed at llvm/lib/Target/ARM/ARMISelLowering.cpp:7640!


https://reviews.llvm.org/D33773

Files:
  lib/Target/ARM/ARMISelLowering.cpp
  test/CodeGen/ARM/constantfp.ll


Index: test/CodeGen/ARM/constantfp.ll
===================================================================
--- test/CodeGen/ARM/constantfp.ll
+++ test/CodeGen/ARM/constantfp.ll
@@ -176,3 +176,28 @@
 ; CHECK-XO-DOUBLE-BE-NOT: vldr
   ret double 3.140000e-01
 }
+
+; This is a target independant optimization, performed by the
+; DAG Combiner and should be disabled for execute-only code:
+; (a cond b) ? 1.0f : 2.0f -> load (tmp + ((a cond b) ? 0 : 4)
+
+define arm_aapcs_vfpcc float @lower_fpconst_select(float %f) {
+
+; CHECK-NO-XO-LABEL: lower_fpconst_select
+; CHECK-NO-XO: adr [[REG:r[0-9]+]], {{.?LCPI[0-9]+_[0-9]+}}
+; CHECK-NO-XO: vldr {{s[0-9]+}}, {{[[]}}[[REG]]{{[]]}}
+
+; CHECK-XO-FLOAT-LABEL: lower_fpconst_select
+; CHECK-XO-FLOAT-DAG: movw [[REG1:r[0-9]+]], #27432
+; CHECK-XO-FLOAT-DAG: movw [[REG2:r[0-9]+]], #761
+; CHECK-XO-FLOAT-DAG: movt [[REG1]], #19950
+; CHECK-XO-FLOAT-DAG: movt [[REG2]], #20373
+; CHECK-XO-FLOAT-DAG: vmov {{s[0-9]+}}, [[REG1]]
+; CHECK-XO-FLOAT-DAG: vmov {{s[0-9]+}}, [[REG2]]
+; CHECK-XO-FLOAT-NOT: adr
+; CHECK-XO-FLOAT-NOT: vldr
+
+  %cmp = fcmp nnan oeq float %f, 0.000000e+00
+  %sel = select i1 %cmp, float 5.000000e+08, float 5.000000e+09
+  ret float %sel
+}
Index: lib/Target/ARM/ARMISelLowering.cpp
===================================================================
--- lib/Target/ARM/ARMISelLowering.cpp
+++ lib/Target/ARM/ARMISelLowering.cpp
@@ -13233,6 +13233,8 @@
 /// specified FP immediate natively. If false, the legalizer will
 /// materialize the FP immediate as a load from a constant pool.
 bool ARMTargetLowering::isFPImmLegal(const APFloat &Imm, EVT VT) const {
+  if (Subtarget->genExecuteOnly())
+    return true;
   if (!Subtarget->hasVFP3())
     return false;
   if (VT == MVT::f32)


-------------- next part --------------
A non-text attachment was scrubbed...
Name: D33773.100991.patch
Type: text/x-patch
Size: 1755 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20170601/6c184f87/attachment.bin>


More information about the llvm-commits mailing list