[llvm] 8e8e318 - [ARM] Fix in ICE when retrieving the number of micro-ops for vlldm/vlstm

Momchil Velikov via llvm-commits llvm-commits at lists.llvm.org
Fri Dec 13 10:20:06 PST 2019


Author: Momchil Velikov
Date: 2019-12-13T18:19:40Z
New Revision: 8e8e3181aa52301f505a7445f05b21d7fc6882a9

URL: https://github.com/llvm/llvm-project/commit/8e8e3181aa52301f505a7445f05b21d7fc6882a9
DIFF: https://github.com/llvm/llvm-project/commit/8e8e3181aa52301f505a7445f05b21d7fc6882a9.diff

LOG: [ARM] Fix in ICE when retrieving the number of micro-ops for vlldm/vlstm

The big switch in `ARMBaseInstrInfo::getNumMicroOps` is missing cases for
`VLLDM` and `VLSTM`, which are currently defined with itineraries having a
dynamic count of micro-ops.

Assuming an optimistic case in which these instruction do not actually perform
loads or stores, and with the idea that Armv8-m cores are supposed to use the
new style scheduling models, this patch just sets the itinerary for those two
instructions to `NoItinerary`.

Differential Revision: https://reviews.llvm.org/D71266

Added: 
    llvm/test/CodeGen/ARM/vlldm-vlstm-uops.mir

Modified: 
    llvm/lib/Target/ARM/ARMInstrVFP.td

Removed: 
    


################################################################################
diff  --git a/llvm/lib/Target/ARM/ARMInstrVFP.td b/llvm/lib/Target/ARM/ARMInstrVFP.td
index 90be9a0333ed..550011bc8ce4 100644
--- a/llvm/lib/Target/ARM/ARMInstrVFP.td
+++ b/llvm/lib/Target/ARM/ARMInstrVFP.td
@@ -277,7 +277,7 @@ def : MnemonicAlias<"vstm", "vstmia">;
 //
 let mayLoad = 1 in
 def VLLDM : AXSI4<(outs), (ins GPRnopc:$Rn, pred:$p), IndexModeNone,
-                  IIC_fpLoad_m, "vlldm${p}\t$Rn", "", []>,
+                  NoItinerary, "vlldm${p}\t$Rn", "", []>,
             Requires<[HasV8MMainline, Has8MSecExt]> {
     let Inst{24-23} = 0b00;
     let Inst{22}    = 0;
@@ -290,7 +290,7 @@ def VLLDM : AXSI4<(outs), (ins GPRnopc:$Rn, pred:$p), IndexModeNone,
 
 let mayStore = 1 in
 def VLSTM : AXSI4<(outs), (ins GPRnopc:$Rn, pred:$p), IndexModeNone,
-                  IIC_fpStore_m, "vlstm${p}\t$Rn", "", []>,
+                  NoItinerary, "vlstm${p}\t$Rn", "", []>,
             Requires<[HasV8MMainline, Has8MSecExt]> {
     let Inst{24-23} = 0b00;
     let Inst{22}    = 0;

diff  --git a/llvm/test/CodeGen/ARM/vlldm-vlstm-uops.mir b/llvm/test/CodeGen/ARM/vlldm-vlstm-uops.mir
new file mode 100644
index 000000000000..f3cab91301da
--- /dev/null
+++ b/llvm/test/CodeGen/ARM/vlldm-vlstm-uops.mir
@@ -0,0 +1,72 @@
+# RUN: llc -run-pass=if-converter %s -o - | FileCheck %s
+--- |
+  target triple = "thumbv8m.main-arm-none-eabi"
+
+  define hidden void @foo(void ()* nocapture %baz) local_unnamed_addr #0 {
+  entry:
+    %call = call i32 @bar() #0
+    %tobool = icmp eq i32 %call, 0
+    br i1 %tobool, label %land.end, label %land.rhs
+
+  land.rhs:                                         ; preds = %entry
+    %call1 = call i32 @bar() #0
+    br label %land.end
+
+  land.end:                                         ; preds = %land.rhs, %entry
+    call void %baz() #0
+    ret void
+  }
+  declare dso_local i32 @bar() local_unnamed_addr #0
+
+  attributes #0 = { nounwind }
+
+...
+---
+name:            foo
+alignment:       4
+tracksRegLiveness: true
+liveins:
+  - { reg: '$r0' }
+frameInfo:
+  stackSize:       8
+  maxAlignment:    4
+  adjustsStack:    true
+  hasCalls:        true
+  maxCallFrameSize: 0
+stack:
+  - { id: 0, type: spill-slot, offset: -4, size: 4, alignment: 4, callee-saved-register: '$lr',
+      callee-saved-restored: false }
+  - { id: 1, type: spill-slot, offset: -8, size: 4, alignment: 4, callee-saved-register: '$r4' }
+machineFunctionInfo: {}
+body:             |
+  bb.0.entry:
+    successors: %bb.2(0x30000000), %bb.1(0x50000000)
+    liveins: $r0, $r4, $lr
+
+    $sp = frame-setup t2STMDB_UPD $sp, 14, $noreg, killed $r4, killed $lr
+    $r4 = tMOVr $r0, 14, $noreg
+    tBL 14, $noreg, @bar, csr_aapcs, implicit-def dead $lr, implicit $sp, implicit-def $sp, implicit-def $r0
+    t2CMPri killed renamable $r0, 0, 14, $noreg, implicit-def $cpsr
+    t2Bcc %bb.2, 0, killed $cpsr
+
+  bb.1.land.rhs:
+    liveins: $r4
+
+    tBL 14, $noreg, @bar, csr_aapcs, implicit-def dead $lr, implicit $sp, implicit-def $sp, implicit-def dead $r0
+
+  bb.2.land.end:
+    liveins: $r4
+
+    $sp = t2STMDB_UPD $sp, 14, $noreg, $r4, killed $r5, killed $r6, killed $r7, killed $r8, killed $r9, killed $r10, killed $r11
+    $r4 = t2BICri $r4, 1, 14, $noreg, $noreg
+    $sp = tSUBspi $sp, 34, 14, $noreg
+    VLSTM $sp, 14, $noreg
+    tBLXNSr 14, $noreg, killed $r4, csr_aapcs, implicit-def $lr, implicit $sp, implicit-def dead $lr, implicit $sp, implicit-def $sp
+    VLLDM $sp, 14, $noreg
+    $sp = tADDspi $sp, 34, 14, $noreg
+    $sp = t2LDMIA_UPD $sp, 14, $noreg, def $r4, def $r5, def $r6, def $r7, def $r8, def $r9, def $r10, def $r11
+    $sp = t2LDMIA_RET $sp, 14, $noreg, def $r4, def $pc
+
+...
+# Just check there is no ICE (in debug builds)
+# CHECK: name: foo


        


More information about the llvm-commits mailing list