aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--lib/Target/JSBackend/JSBackend.cpp5
-rw-r--r--test/CodeGen/JS/phi.ll22
2 files changed, 26 insertions, 1 deletions
diff --git a/lib/Target/JSBackend/JSBackend.cpp b/lib/Target/JSBackend/JSBackend.cpp
index a08e61fbff..5efd4c5684 100644
--- a/lib/Target/JSBackend/JSBackend.cpp
+++ b/lib/Target/JSBackend/JSBackend.cpp
@@ -521,7 +521,10 @@ std::string JSWriter::getPhiCode(const BasicBlock *From, const BasicBlock *To) {
// we found it
const std::string &name = getJSName(P);
assigns[name] = getAssign(P);
- const Value *V = P->getIncomingValue(index);
+ // Get the operand, and strip pointer casts, since normal expression
+ // translation also strips pointer casts, and we want to see the same
+ // thing so that we can detect any resulting dependencies.
+ const Value *V = P->getIncomingValue(index)->stripPointerCasts();
values[name] = V;
std::string vname = getValueAsStr(V);
if (const Instruction *VI = dyn_cast<const Instruction>(V)) {
diff --git a/test/CodeGen/JS/phi.ll b/test/CodeGen/JS/phi.ll
new file mode 100644
index 0000000000..517f73cba3
--- /dev/null
+++ b/test/CodeGen/JS/phi.ll
@@ -0,0 +1,22 @@
+; RUN: llc -march=js < %s | FileCheck %s
+
+; Phi lowering should check for dependency cycles, including looking through
+; bitcasts, and emit extra copies as needed.
+
+; CHECK: while(1) {
+; CHECK: $k$phi = $j;$j$phi = $k;$k = $k$phi;$j = $j$phi;
+; CHECK: }
+define void @foo(float* nocapture %p, i32* %j.init, i32* %k.init) {
+entry:
+ br label %for.body
+
+for.body:
+ %j = phi i32* [ %j.init, %entry ], [ %k.cast, %more ]
+ %k = phi i32* [ %k.init, %entry ], [ %j.cast, %more ]
+ br label %more
+
+more:
+ %j.cast = bitcast i32* %j to i32*
+ %k.cast = bitcast i32* %k to i32*
+ br label %for.body
+}