summaryrefslogtreecommitdiffstats
path: root/llvm/test
diff options
context:
space:
mode:
authorKyle Butt <kyle+llvm@iteratee.net>2016-08-29 18:27:12 +0000
committerKyle Butt <kyle+llvm@iteratee.net>2016-08-29 18:27:12 +0000
commit092c4dd5b60462baaaaa8730ac8d0228d07edfa6 (patch)
tree6403c1cae647f88c8af71a05d54968ab970904d3 /llvm/test
parent793913c7eb507b56bf9eb0f136d8c86b35520fe1 (diff)
downloadbcm5719-llvm-092c4dd5b60462baaaaa8730ac8d0228d07edfa6.tar.gz
bcm5719-llvm-092c4dd5b60462baaaaa8730ac8d0228d07edfa6.zip
IfConversion: Fix branch predication bug.
This bug shows up with diamonds that share unpredicable, unanalyzable branches. There's an included test case from Hexagon. What was happening was that we were attempting to predicate the branch instruction despite the fact that it was checked to be the same. Now for unanalyzable branches we skip over the branch instructions when predicating the block. Differential Revision: https://reviews.llvm.org/D23939 llvm-svn: 279985
Diffstat (limited to 'llvm/test')
-rw-r--r--llvm/test/CodeGen/Hexagon/ifcvt-diamond-bug-2016-08-26.ll37
1 files changed, 37 insertions, 0 deletions
diff --git a/llvm/test/CodeGen/Hexagon/ifcvt-diamond-bug-2016-08-26.ll b/llvm/test/CodeGen/Hexagon/ifcvt-diamond-bug-2016-08-26.ll
new file mode 100644
index 00000000000..68a5dc16ecf
--- /dev/null
+++ b/llvm/test/CodeGen/Hexagon/ifcvt-diamond-bug-2016-08-26.ll
@@ -0,0 +1,37 @@
+; RUN: llc -march=hexagon -o - %s | FileCheck %s
+target triple = "hexagon"
+
+%struct.0 = type { i16, i16 }
+
+@t = external local_unnamed_addr global %struct.0, align 2
+
+define void @foo(i32 %p) local_unnamed_addr #0 {
+entry:
+ %conv90 = trunc i32 %p to i16
+ %call105 = call signext i16 @bar(i16 signext 16384, i16 signext undef) #0
+ %call175 = call signext i16 @bar(i16 signext %conv90, i16 signext 4) #0
+ %call197 = call signext i16 @bar(i16 signext %conv90, i16 signext 4) #0
+ %cmp199 = icmp eq i16 %call197, 0
+ br i1 %cmp199, label %if.then200, label %if.else201
+
+; CHECK-DAG: [[R4:r[0-9]+]] = #4
+; CHECK: p0 = cmp.eq(r0, #0)
+; CHECK: if (!p0.new) [[R3:r[0-9]+]] = #3
+; CHECK-DAG: if (!p0) memh(##t) = [[R3]]
+; CHECK-DAG: if (p0) memh(##t) = [[R4]]
+if.then200: ; preds = %entry
+ store i16 4, i16* getelementptr inbounds (%struct.0, %struct.0* @t, i32 0, i32 0), align 2
+ store i16 0, i16* getelementptr inbounds (%struct.0, %struct.0* @t, i32 0, i32 1), align 2
+ br label %if.end202
+
+if.else201: ; preds = %entry
+ store i16 3, i16* getelementptr inbounds (%struct.0, %struct.0* @t, i32 0, i32 0), align 2
+ br label %if.end202
+
+if.end202: ; preds = %if.else201, %if.then200
+ ret void
+}
+
+declare signext i16 @bar(i16 signext, i16 signext) local_unnamed_addr #0
+
+attributes #0 = { optsize "target-cpu"="hexagonv55" }
OpenPOWER on IntegriCloud