diff options
| author | David Majnemer <david.majnemer@gmail.com> | 2016-06-15 00:19:56 +0000 |
|---|---|---|
| committer | David Majnemer <david.majnemer@gmail.com> | 2016-06-15 00:19:56 +0000 |
| commit | 4a697c312f901a3a1ec92e24c91cefd64f6b4346 (patch) | |
| tree | fe31b6f1dc9a8e0035d4f76c30e0f9ef0466d375 /llvm/test/Transforms/LoopUnroll/pr28132.ll | |
| parent | 577be0fed36f4d26e767a39a7838c63e90574e13 (diff) | |
| download | bcm5719-llvm-4a697c312f901a3a1ec92e24c91cefd64f6b4346.tar.gz bcm5719-llvm-4a697c312f901a3a1ec92e24c91cefd64f6b4346.zip | |
[LoopUnroll] Don't crash trying to unroll loop with EH pad exit
We do not support splitting cleanuppad or catchswitches. This is
problematic for passes which assume that a loop is in loop simplify
form (the loop would have a dedicated exit block instead of sharing it).
While it isn't great that we don't support this for cleanups, we still
cannot make loop-simplify form an assertable precondition because
indirectbr will also disable these sorts of CFG cleanups.
This fixes PR28132.
llvm-svn: 272739
Diffstat (limited to 'llvm/test/Transforms/LoopUnroll/pr28132.ll')
| -rw-r--r-- | llvm/test/Transforms/LoopUnroll/pr28132.ll | 77 |
1 files changed, 77 insertions, 0 deletions
diff --git a/llvm/test/Transforms/LoopUnroll/pr28132.ll b/llvm/test/Transforms/LoopUnroll/pr28132.ll new file mode 100644 index 00000000000..dc2c0b88023 --- /dev/null +++ b/llvm/test/Transforms/LoopUnroll/pr28132.ll @@ -0,0 +1,77 @@ +; RUN: opt -loop-unroll -S < %s | FileCheck %s +target datalayout = "e-m:x-p:32:32-i64:64-f80:32-n8:16:32-a:0:32-S32" +target triple = "i686-pc-windows-msvc" + +declare void @fn1(i8*) + +declare i1 @fn2(i8*, i8*) + +define void @fn4() personality i32 (...)* @__CxxFrameHandler3 { +entry: + br label %for.body + +for.body: ; preds = %for.inc, %entry + %i.05 = phi i8 [ 0, %entry ], [ %inc, %for.inc ] + store i8 undef, i8* undef, align 4 + invoke void @fn1(i8* undef) + to label %call.i.noexc unwind label %ehcleanup + +call.i.noexc: ; preds = %for.body + %call1.i2 = invoke i1 @fn2(i8* undef, i8* undef) + to label %call1.i.noexc unwind label %ehcleanup + +call1.i.noexc: ; preds = %call.i.noexc + br i1 undef, label %if.then.i, label %if.end4.i + +if.then.i: ; preds = %call1.i.noexc + %tmp1 = load i8, i8* undef, align 4 + %tobool.i = icmp eq i8 undef, undef + br i1 undef, label %if.end4.i, label %if.then2.i + +if.then2.i: ; preds = %if.then.i + %call3.i3 = invoke i1 @fn2(i8* undef, i8* null) + to label %call3.i.noexc unwind label %ehcleanup + +call3.i.noexc: ; preds = %if.then2.i + br label %if.end4.i + +if.end4.i: ; preds = %call3.i.noexc, %if.then.i, %call1.i.noexc + %tmp2 = load i8, i8* undef, align 4 + br label %if.then6.i + +if.then6.i: ; preds = %if.end4.i + %call7.i4 = invoke i1 @fn2(i8* undef, i8* null) + to label %call7.i.noexc unwind label %ehcleanup + +call7.i.noexc: ; preds = %if.then6.i + br label %fn3 + +fn3: ; preds = %call7.i.noexc + %tmp3 = load i8, i8* undef, align 4 + %inc.i = add nsw i8 undef, undef + store i8 undef, i8* undef, align 4 + br label %for.inc + +for.inc: ; preds = %fn3 + %inc = add nsw i8 %i.05, 1 + %cmp = icmp slt i8 %inc, 6 + br i1 %cmp, label %for.body, label %for.end + +for.end: ; preds = %for.inc + invoke void @throw() + to label %unreachable unwind label %ehcleanup + +ehcleanup: ; preds = %for.end, %if.then6.i, %if.then2.i, %call.i.noexc, %for.body + %cp = cleanuppad within none [] + cleanupret from %cp unwind to caller + +; CHECK: cleanuppad +; CHECK-NOT: cleanuppad + +unreachable: ; preds = %for.end + unreachable +} + +declare i32 @__CxxFrameHandler3(...) + +declare void @throw() |

