summaryrefslogtreecommitdiffstats
path: root/llvm/test
diff options
context:
space:
mode:
authorDavid Green <david.green@arm.com>2019-02-20 10:22:18 +0000
committerDavid Green <david.green@arm.com>2019-02-20 10:22:18 +0000
commitcb5a48b060fa8039f8f0812b2acb452336cc9a85 (patch)
treeb6976dabc8be6b8cd15c6d2756c5829fbe41db08 /llvm/test
parent30d340839ca7b318f64c428ef1bf58fb61333ef0 (diff)
downloadbcm5719-llvm-cb5a48b060fa8039f8f0812b2acb452336cc9a85.tar.gz
bcm5719-llvm-cb5a48b060fa8039f8f0812b2acb452336cc9a85.zip
[Codegen] Remove dead flags on Physical Defs in machine cse
We may leave behind incorrect dead flags on instructions that are CSE'd. Make sure we remove the dead flags on physical registers to prevent other incorrect code motion. Differential Revision: https://reviews.llvm.org/D58115 llvm-svn: 354443
Diffstat (limited to 'llvm/test')
-rw-r--r--llvm/test/CodeGen/Thumb/machine-cse-deadreg.mir103
1 files changed, 103 insertions, 0 deletions
diff --git a/llvm/test/CodeGen/Thumb/machine-cse-deadreg.mir b/llvm/test/CodeGen/Thumb/machine-cse-deadreg.mir
new file mode 100644
index 00000000000..30ca5513a45
--- /dev/null
+++ b/llvm/test/CodeGen/Thumb/machine-cse-deadreg.mir
@@ -0,0 +1,103 @@
+# RUN: llc -mtriple thumbv6m-arm-none-eabi -run-pass=machine-cse -verify-machineinstrs -o - %s | FileCheck %s
+
+--- |
+ target datalayout = "e-m:e-p:32:32-i64:64-v128:64:128-a:0:32-n32-S64"
+ target triple = "thumbv6m-arm-none-eabi"
+
+ define i32 @funca(i64 %l1) {
+ entry:
+ %l2 = icmp ult i64 %l1, -177673816660004267
+ %l3 = add i64 %l1, 401100203
+ %rem.i = select i1 %l2, i64 %l1, i64 %l3
+ %conv = trunc i64 %rem.i to i32
+ ret i32 %conv
+ }
+
+ define i32 @funcb(i64 %l1) { ret i32 0 }
+
+...
+---
+name: funca
+tracksRegLiveness: true
+liveins:
+ - { reg: '$r0', virtual-reg: '%0' }
+ - { reg: '$r1', virtual-reg: '%1' }
+constants:
+ - id: 0
+ value: i32 401100203
+ alignment: 4
+ isTargetSpecific: false
+ - id: 1
+ value: i32 41367909
+ alignment: 4
+ isTargetSpecific: false
+body: |
+ bb.0.entry:
+ successors: %bb.1(0x40000000), %bb.2(0x40000000)
+ liveins: $r0, $r1
+
+ %1:tgpr = COPY $r1
+ %0:tgpr = COPY $r0
+ %2:tgpr = tLDRpci %const.0, 14, $noreg :: (load 4 from constant-pool)
+ %3:tgpr, dead $cpsr = tADDrr %0, %2, 14, $noreg
+ %4:tgpr = tLDRpci %const.1, 14, $noreg :: (load 4 from constant-pool)
+ %5:tgpr, $cpsr = tADDrr %0, %2, 14, $noreg
+ %6:tgpr, $cpsr = tADC %1, killed %4, 14, $noreg, implicit $cpsr
+ tBcc %bb.2, 3, $cpsr
+
+ bb.1.entry:
+ successors: %bb.2(0x80000000)
+
+ bb.2.entry:
+ %7:tgpr = PHI %3, %bb.1, %0, %bb.0
+ $r0 = COPY %7
+ tBX_RET 14, $noreg, implicit $r0
+
+# CHECK-LABEL: name: funca
+# cpsr def must not be dead
+# CHECK: %3:tgpr, $cpsr = tADDrr %0, %2
+# CHECK-NOT: %5:tgpr, $cpsr = tADDrr %0, %2
+
+...
+---
+name: funcb
+tracksRegLiveness: true
+liveins:
+ - { reg: '$r0', virtual-reg: '%0' }
+ - { reg: '$r1', virtual-reg: '%1' }
+constants:
+ - id: 0
+ value: i32 401100203
+ alignment: 4
+ isTargetSpecific: false
+ - id: 1
+ value: i32 41367909
+ alignment: 4
+ isTargetSpecific: false
+body: |
+ bb.0:
+ successors: %bb.1(0x40000000), %bb.2(0x40000000)
+ liveins: $r0, $r1
+
+ %1:tgpr = COPY $r1
+ %0:tgpr = COPY $r0
+ %2:tgpr = tLDRpci %const.0, 14, $noreg :: (load 4 from constant-pool)
+ %3:tgpr, dead $cpsr = tADDrr %0, %2, 14, $noreg
+ %4:tgpr = tLDRpci %const.1, 14, $noreg :: (load 4 from constant-pool)
+ %5:tgpr, dead $cpsr = tADDrr %0, %2, 14, $noreg
+ %6:tgpr, $cpsr = tADDrr %1, killed %4, 14, $noreg
+ tBcc %bb.2, 3, $cpsr
+
+ bb.1:
+ successors: %bb.2(0x80000000)
+
+ bb.2:
+ %7:tgpr = PHI %3, %bb.1, %0, %bb.0
+ $r0 = COPY %7
+ tBX_RET 14, $noreg, implicit $r0
+
+# CHECK-LABEL: name: funcb
+# cpsr def should be dead
+# CHECK: %3:tgpr, dead $cpsr = tADDrr %0, %2
+# CHECK-NOT: %5:tgpr, dead $cpsr = tADDrr %0, %2
+...
OpenPOWER on IntegriCloud