diff options
| author | Kyle Butt <kyle+llvm@iteratee.net> | 2017-04-10 22:28:12 +0000 |
|---|---|---|
| committer | Kyle Butt <kyle+llvm@iteratee.net> | 2017-04-10 22:28:12 +0000 |
| commit | a12bd756e4dd3e1325e877d6666cf3c63d80f85a (patch) | |
| tree | 72148d70f4bb2471c3b5b2da906a77156b82c65a /llvm/test/CodeGen/X86/tail-merge-identical.ll | |
| parent | 502ad60c8f7bfa7e3c4630b666704361795f80ea (diff) | |
| download | bcm5719-llvm-a12bd756e4dd3e1325e877d6666cf3c63d80f85a.tar.gz bcm5719-llvm-a12bd756e4dd3e1325e877d6666cf3c63d80f85a.zip | |
CodeGen: BranchFolding: Merge identical blocks, even if they are short.
Merging identical blocks when it doesn't reduce fallthrough. It is common for
the blocks created from critical edge splitting to be identical. We would like
to merge these blocks whenever doing so would not reduce fallthrough.
llvm-svn: 299890
Diffstat (limited to 'llvm/test/CodeGen/X86/tail-merge-identical.ll')
| -rw-r--r-- | llvm/test/CodeGen/X86/tail-merge-identical.ll | 41 |
1 files changed, 41 insertions, 0 deletions
diff --git a/llvm/test/CodeGen/X86/tail-merge-identical.ll b/llvm/test/CodeGen/X86/tail-merge-identical.ll new file mode 100644 index 00000000000..024ad582d03 --- /dev/null +++ b/llvm/test/CodeGen/X86/tail-merge-identical.ll @@ -0,0 +1,41 @@ +; RUN: llc -o - -verify-machineinstrs %s | FileCheck %s +target datalayout = "e-m:e-i64:64-f80:128-n8:16:32:64-S128" +target triple = "x86_64-unknown-linux-gnu" + +@data = external global [3 x i32], align 4 +@store = external global i32, align 4 + +; %else1 and %then2 end up lowering to identical blocks. These blocks should be +; merged during tail-merging. +; CHECK-LABEL: merge_identical_blocks +; CHECK: movl $data+4 +; CHECK-NOT: movl $data+4 +; CHECK: retq +define void @merge_identical_blocks(i1 %a, i1 %b) { +entry: + br label %if1 + +if1: ; predfs = %entry + br i1 %a, label %else1, label %if2 + +else1: ; preds = %if1 + %ptr.else1 = getelementptr inbounds [3 x i32], [3 x i32]* @data, i64 0, i32 1 + br label %phi_join + +if2: ; preds = %if1 + br i1 %b, label %then2, label %else2 + +then2: ; preds = %if2 + %ptr.then2 = getelementptr inbounds [3 x i32], [3 x i32]* @data, i64 0, i32 1 + br label %phi_join + +else2: ; preds = %if2 + %ptr.else2 = getelementptr inbounds [3 x i32], [3 x i32]* @data, i64 0, i32 2 + br label %phi_join + +phi_join: ; preds = %else1, %then2, %else2 + %val.ptr = phi i32* [ %ptr.else1, %else1 ], [ %ptr.then2, %then2 ], [ %ptr.else2, %else2 ] + %val = load i32, i32* %val.ptr, align 4 + store i32 %val, i32* @store, align 4 + ret void +} |

