]> granicus.if.org Git - llvm/commitdiff
[CodeGenPrepare] Fix bad IR created by large offset GEP splitting.
authorEli Friedman <efriedma@codeaurora.org>
Wed, 19 Dec 2018 22:52:04 +0000 (22:52 +0000)
committerEli Friedman <efriedma@codeaurora.org>
Wed, 19 Dec 2018 22:52:04 +0000 (22:52 +0000)
Creating the IR builder, then modifying the CFG, leads to an IRBuilder
where the BB and insertion point are inconsistent, so new instructions
have the wrong parent.

Modified an existing test because the test wasn't covering anything
useful (the "invoke" was not actually an invoke by the time we hit the
code in question).

Differential Revision: https://reviews.llvm.org/D55729

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

lib/CodeGen/CodeGenPrepare.cpp
test/Transforms/CodeGenPrepare/AArch64/large-offset-gep.ll

index 392e8bc0db48021a640b87c392969a4343d67846..c35f8666fa3c20472a2a11d442b15d11962a4260 100644 (file)
@@ -5160,11 +5160,11 @@ bool CodeGenPrepare::splitLargeGEPOffsets() {
       }
 
       // Generate a new GEP to replace the current one.
-      IRBuilder<> Builder(GEP);
+      LLVMContext &Ctx = GEP->getContext();
       Type *IntPtrTy = DL->getIntPtrType(GEP->getType());
       Type *I8PtrTy =
-          Builder.getInt8PtrTy(GEP->getType()->getPointerAddressSpace());
-      Type *I8Ty = Builder.getInt8Ty();
+          Type::getInt8PtrTy(Ctx, GEP->getType()->getPointerAddressSpace());
+      Type *I8Ty = Type::getInt8Ty(Ctx);
 
       if (!NewBaseGEP) {
         // Create a new base if we don't have one yet.  Find the insertion
@@ -5200,6 +5200,7 @@ bool CodeGenPrepare::splitLargeGEPOffsets() {
         NewGEPBases.insert(NewBaseGEP);
       }
 
+      IRBuilder<> Builder(GEP);
       Value *NewGEP = NewBaseGEP;
       if (Offset == BaseOffset) {
         if (GEP->getType() != I8PtrTy)
index 5cc00b75962e1ee4e6a06466f724eaad2b048f8a..005ea37288ceb362299609e24c44f86e11ffa2fe 100644 (file)
@@ -88,18 +88,23 @@ while_end:
 }
 
 declare %struct_type* @foo()
+declare void @foo2()
 
 define void @test4(i32 %n) personality i32 (...)* @__FrameHandler {
 ; CHECK-LABEL: test4
 entry:
-  %struct = invoke %struct_type* @foo() to label %while_cond unwind label %cleanup
+  br label %while_cond
 
 while_cond:
   %phi = phi i32 [ 0, %entry ], [ %i, %while_body ]
+  %struct = invoke %struct_type* @foo() to label %while_cond_x unwind label %cleanup
+
+while_cond_x:
 ; CHECK:     mov     w{{[0-9]+}}, #40000
 ; CHECK-NOT: mov     w{{[0-9]+}}, #40004
   %gep0 = getelementptr %struct_type, %struct_type* %struct, i64 0, i32 1
   %gep1 = getelementptr %struct_type, %struct_type* %struct, i64 0, i32 2
+  store i32 0, i32* %gep0
   %cmp = icmp slt i32 %phi, %n
   br i1 %cmp, label %while_body, label %while_end
 
@@ -114,8 +119,10 @@ while_end:
   ret void
 
 cleanup:
-  landingpad { i8*, i32 } cleanup
-  unreachable
+  %x10 = landingpad { i8*, i32 }
+          cleanup
+  call void @foo2()
+  resume { i8*, i32 } %x10
 }
 
 declare i32 @__FrameHandler(...)