summaryrefslogtreecommitdiffstats
path: root/llvm/test/CodeGen/ARM/ifcvt-dead-def.ll
diff options
context:
space:
mode:
authorPete Cooper <peter_cooper@apple.com>2015-05-06 22:51:04 +0000
committerPete Cooper <peter_cooper@apple.com>2015-05-06 22:51:04 +0000
commit27483915e8dd94301f8154a225973931e31f201e (patch)
treedce6be095c75d9296af708256744ecb64286bd65 /llvm/test/CodeGen/ARM/ifcvt-dead-def.ll
parent3befe94acb6d86cf97a54c3047301bb5c30e9a7c (diff)
downloadbcm5719-llvm-27483915e8dd94301f8154a225973931e31f201e.tar.gz
bcm5719-llvm-27483915e8dd94301f8154a225973931e31f201e.zip
Handle dead defs in the if converter.
We had code such as this: r2 = ... t2Bcc label1: ldr ... r2 label2; return r2<dead, def> The if converter was transforming this to r2<def> = ... return [pred] r2<dead,def> ldr <r2, kill> return which fails the machine verifier because the ldr now reads from a dead def. The fix here detects dead defs in stepForward and passes them back to the caller in the clobbers list. The caller then clears the dead flag from the def is the value is live. llvm-svn: 236660
Diffstat (limited to 'llvm/test/CodeGen/ARM/ifcvt-dead-def.ll')
-rw-r--r--llvm/test/CodeGen/ARM/ifcvt-dead-def.ll55
1 files changed, 55 insertions, 0 deletions
diff --git a/llvm/test/CodeGen/ARM/ifcvt-dead-def.ll b/llvm/test/CodeGen/ARM/ifcvt-dead-def.ll
new file mode 100644
index 00000000000..77a3f5c0961
--- /dev/null
+++ b/llvm/test/CodeGen/ARM/ifcvt-dead-def.ll
@@ -0,0 +1,55 @@
+; RUN: llc %s -o - -verify-machineinstrs | FileCheck %s
+
+target datalayout = "e-m:o-p:32:32-f64:32:64-v64:32:64-v128:32:128-a:0:32-n32-S32"
+target triple = "thumbv7-unknown-unknown"
+
+%struct.ref_s = type { %union.v, i16, i16 }
+%union.v = type { i32 }
+%struct.gs_color_s = type { i16, i16, i16, i16, i8, i8 }
+
+; In this case, the if converter was cloning the return instruction so that we had
+; r2<def> = ...
+; return [pred] r2<dead,def>
+; ldr <r2, kill>
+; return
+; The problem here was that the dead def on the first return was making the machine verifier
+; think that the load read from an undefined register. We need to remove the dead flag from
+; the return, and also add an implicit use of the prior value of r2.
+
+; CHECK: ldrh
+
+; Function Attrs: minsize nounwind optsize ssp
+define i32 @test(%struct.ref_s* %pref1, %struct.ref_s* %pref2, %struct.gs_color_s** %tmp152) #0 {
+bb:
+ %nref = alloca %struct.ref_s, align 4
+ %tmp46 = call %struct.ref_s* @name_string_ref(%struct.ref_s* %pref1, %struct.ref_s* %nref) #2
+ %tmp153 = load %struct.gs_color_s*, %struct.gs_color_s** %tmp152, align 4
+ %tmp154 = bitcast %struct.ref_s* %pref2 to %struct.gs_color_s**
+ %tmp155 = load %struct.gs_color_s*, %struct.gs_color_s** %tmp154, align 4
+ %tmp162 = getelementptr inbounds %struct.gs_color_s, %struct.gs_color_s* %tmp153, i32 0, i32 1
+ %tmp163 = load i16, i16* %tmp162, align 2
+ %tmp164 = getelementptr inbounds %struct.gs_color_s, %struct.gs_color_s* %tmp155, i32 0, i32 1
+ %tmp165 = load i16, i16* %tmp164, align 2
+ %tmp166 = icmp eq i16 %tmp163, %tmp165
+ br i1 %tmp166, label %bb167, label %bb173
+
+bb167: ; preds = %bb
+ %tmp168 = getelementptr inbounds %struct.gs_color_s, %struct.gs_color_s* %tmp153, i32 0, i32 2
+ %tmp169 = load i16, i16* %tmp168, align 2
+ %tmp170 = getelementptr inbounds %struct.gs_color_s, %struct.gs_color_s* %tmp155, i32 0, i32 2
+ %tmp171 = load i16, i16* %tmp170, align 2
+ %tmp172 = icmp eq i16 %tmp169, %tmp171
+ br label %bb173
+
+bb173: ; preds = %bb167, %bb
+ %tmp174 = phi i1 [ false, %bb ], [ %tmp172, %bb167 ]
+ %tmp175 = zext i1 %tmp174 to i32
+ ret i32 %tmp175
+}
+
+; Function Attrs: minsize optsize
+declare %struct.ref_s* @name_string_ref(%struct.ref_s*, %struct.ref_s*) #1
+
+attributes #0 = { minsize nounwind optsize }
+attributes #1 = { minsize optsize }
+attributes #2 = { minsize nounwind optsize }
OpenPOWER on IntegriCloud