diff options
| author | Frits van Bommel <fvbommel@gmail.com> | 2010-12-06 23:36:56 +0000 |
|---|---|---|
| committer | Frits van Bommel <fvbommel@gmail.com> | 2010-12-06 23:36:56 +0000 |
| commit | d9df6eaa9ce20d1cc02024adafe4a3e3940efbed (patch) | |
| tree | 0dc7688254bcbeee62f936fe94ad87af46c9b4f4 /llvm/test/Transforms/JumpThreading/indirectbr.ll | |
| parent | 9847abacb113a68075c9897714729a6707e2ee8f (diff) | |
| download | bcm5719-llvm-d9df6eaa9ce20d1cc02024adafe4a3e3940efbed.tar.gz bcm5719-llvm-d9df6eaa9ce20d1cc02024adafe4a3e3940efbed.zip | |
Implement jump threading of 'indirectbr' by keeping track of whether we're looking for ConstantInt*s or BlockAddress*s.
llvm-svn: 121066
Diffstat (limited to 'llvm/test/Transforms/JumpThreading/indirectbr.ll')
| -rw-r--r-- | llvm/test/Transforms/JumpThreading/indirectbr.ll | 61 |
1 files changed, 61 insertions, 0 deletions
diff --git a/llvm/test/Transforms/JumpThreading/indirectbr.ll b/llvm/test/Transforms/JumpThreading/indirectbr.ll new file mode 100644 index 00000000000..6c5321d3194 --- /dev/null +++ b/llvm/test/Transforms/JumpThreading/indirectbr.ll @@ -0,0 +1,61 @@ +; RUN: opt -S < %s -jump-threading | FileCheck %s + +; Keep block addresses alive. +@addresses = constant [4 x i8*] [ + i8* blockaddress(@test1, %L1), i8* blockaddress(@test1, %L2), + i8* blockaddress(@test2, %L1), i8* blockaddress(@test2, %L2) +] + +declare void @bar() +declare void @baz() + + + +; Check basic jump threading for indirectbr instructions. + +; CHECK: void @test1 +; CHECK: br i1 %tobool, label %L1, label %indirectgoto +; CHECK-NOT: if.else: +; CHECK: L1: +; CHECK: indirectbr i8* %address, [label %L1, label %L2] +define void @test1(i32 %i, i8* %address) nounwind { +entry: + %rem = srem i32 %i, 2 + %tobool = icmp ne i32 %rem, 0 + br i1 %tobool, label %indirectgoto, label %if.else + +if.else: ; preds = %entry + br label %indirectgoto + +L1: ; preds = %indirectgoto + call void @bar() + ret void + +L2: ; preds = %indirectgoto + call void @baz() + ret void + +indirectgoto: ; preds = %if.else, %entry + %indirect.goto.dest = phi i8* [ %address, %if.else ], [ blockaddress(@test1, %L1), %entry ] + indirectbr i8* %indirect.goto.dest, [label %L1, label %L2] +} + + +; Check constant folding of indirectbr + +; CHECK: void @test2 +; CHECK-NEXT: : +; CHECK-NEXT: call void @bar +; CHECK-NEXT: ret void +define void @test2() nounwind { +entry: + indirectbr i8* blockaddress(@test2, %L1), [label %L1, label %L2] + +L1: ; preds = %indirectgoto + call void @bar() + ret void + +L2: ; preds = %indirectgoto + call void @baz() + ret void +} |

