Guard MemoryBuiltins against self-looping GEPs, which can occur in unreachable code...
authorBenjamin Kramer <benny.kra@googlemail.com>
Fri, 17 Aug 2012 14:16:37 +0000 (14:16 +0000)
committerBenjamin Kramer <benny.kra@googlemail.com>
Fri, 17 Aug 2012 14:16:37 +0000 (14:16 +0000)
Fixes PR13621.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@162098 91177308-0d34-0410-b5e6-96231b3b80d8

lib/Analysis/MemoryBuiltins.cpp
test/Transforms/InstCombine/objsize.ll

index c0cc27b6ec5ea38eb1694b0074f9be5de25ea5e9..e77d2ff9e44ec3199bd4e088b9d94510791180be 100644 (file)
@@ -473,6 +473,10 @@ ObjectSizeOffsetVisitor::visitExtractValueInst(ExtractValueInst&) {
 }
 
 SizeOffsetType ObjectSizeOffsetVisitor::visitGEPOperator(GEPOperator &GEP) {
+  // Ignore self-referencing GEPs, they can occur in unreachable code.
+  if (&GEP == GEP.getPointerOperand())
+    return unknown();
+
   SizeOffsetType PtrData = compute(GEP.getPointerOperand());
   if (!bothKnown(PtrData) || !GEP.hasAllConstantIndices())
     return unknown();
index dbb0ffcd674225422f27948404f4a1294702adcb..d7e292155cd79e4e521822ccfc8ee8e1398f515b 100644 (file)
@@ -238,3 +238,20 @@ xpto:
 return:
   ret i32 42
 }
+
+; CHECK: @PR13621
+define i32 @PR13621(i1 %bool) nounwind {
+entry:
+  %cond = or i1 %bool, true
+  br i1 %cond, label %return, label %xpto
+
+; technically reachable, but this malformed IR may appear as a result of constant propagation
+xpto:
+  %gep = getelementptr i8* %gep, i32 1
+  %o = call i32 @llvm.objectsize.i32(i8* %gep, i1 true)
+; CHECK: ret i32 undef
+  ret i32 %o
+
+return:
+  ret i32 7
+}