[llvm] r280866 - [SimplifyCFG] Don't try to create metadata-valued PHIs

Hal Finkel via llvm-commits llvm-commits at lists.llvm.org
Wed Sep 7 14:38:22 PDT 2016


Author: hfinkel
Date: Wed Sep  7 16:38:22 2016
New Revision: 280866

URL: http://llvm.org/viewvc/llvm-project?rev=280866&view=rev
Log:
[SimplifyCFG] Don't try to create metadata-valued PHIs

We can't create metadata-valued PHIs; don't try to do so when sinking.

I created a test case for this using the @llvm.type.test intrinsic, because it
takes a metadata parameter and does not have severe side effects (thus
SimplifyCFG is willing to otherwise sink it).

Previously, running the test case would crash with:

  Invalid use of metadata!
    %.sink = select i1 %flag, metadata <...>, metadata <0x4e45dc0>
  LLVM ERROR: Broken function found, compilation aborted!

Added:
    llvm/trunk/test/Transforms/SimplifyCFG/no-md-sink.ll
Modified:
    llvm/trunk/lib/Transforms/Utils/SimplifyCFG.cpp

Modified: llvm/trunk/lib/Transforms/Utils/SimplifyCFG.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Transforms/Utils/SimplifyCFG.cpp?rev=280866&r1=280865&r2=280866&view=diff
==============================================================================
--- llvm/trunk/lib/Transforms/Utils/SimplifyCFG.cpp (original)
+++ llvm/trunk/lib/Transforms/Utils/SimplifyCFG.cpp Wed Sep  7 16:38:22 2016
@@ -1338,6 +1338,10 @@ HoistTerminator:
 // FIXME: This should be promoted to Instruction.
 static bool canReplaceOperandWithVariable(const Instruction *I,
                                           unsigned OpIdx) {
+  // We can't have a PHI with a metadata type.
+  if (I->getOperand(OpIdx)->getType()->isMetadataTy())
+    return false;
+
   // Early exit.
   if (!isa<Constant>(I->getOperand(OpIdx)))
     return true;

Added: llvm/trunk/test/Transforms/SimplifyCFG/no-md-sink.ll
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/Transforms/SimplifyCFG/no-md-sink.ll?rev=280866&view=auto
==============================================================================
--- llvm/trunk/test/Transforms/SimplifyCFG/no-md-sink.ll (added)
+++ llvm/trunk/test/Transforms/SimplifyCFG/no-md-sink.ll Wed Sep  7 16:38:22 2016
@@ -0,0 +1,51 @@
+; RUN: opt < %s -simplifycfg -S | FileCheck %s
+
+define i1 @test1(i1 zeroext %flag, i8* %y) #0 {
+entry:
+  br i1 %flag, label %if.then, label %if.else
+
+if.then:
+  %r = call i1 @llvm.type.test(i8* %y, metadata !0)
+  br label %if.end
+
+if.else:
+  %s = call i1 @llvm.type.test(i8* %y, metadata !1)
+  br label %if.end
+
+if.end:
+  %t = phi i1 [ %s, %if.else ], [ %r, %if.then ]
+  ret i1 %t
+}
+
+!0 = !{i32 0, !"typeid1"}
+!1 = !{i32 4, !"typeid1"}
+
+declare i1 @llvm.type.test(i8* %ptr, metadata %bitset) nounwind readnone
+
+; CHECK-LABEL: test1
+; CHECK: @llvm.type.test
+; CHECK: @llvm.type.test
+; CHECK: ret i1
+
+define i1 @test2(i1 zeroext %flag, i8* %y, i8* %z) #0 {
+entry:
+  br i1 %flag, label %if.then, label %if.else
+
+if.then:
+  %r = call i1 @llvm.type.test(i8* %y, metadata !0)
+  br label %if.end
+
+if.else:
+  %s = call i1 @llvm.type.test(i8* %z, metadata !0)
+  br label %if.end
+
+if.end:
+  %t = phi i1 [ %s, %if.else ], [ %r, %if.then ]
+  ret i1 %t
+}
+
+; CHECK-LABEL: test2
+; CHECK: %[[S:[a-z0-9.]+]] = select i1 %flag, i8* %y, i8* %z
+; CHECK: %[[R:[a-z0-9.]+]] = call i1 @llvm.type.test(i8* %[[S]], metadata !0)
+; CHECK: ret i1 %[[R]]
+




More information about the llvm-commits mailing list