diff options
Diffstat (limited to 'test/CodeGen/X86/misched-fusion.ll')
-rw-r--r-- | test/CodeGen/X86/misched-fusion.ll | 108 |
1 files changed, 108 insertions, 0 deletions
diff --git a/test/CodeGen/X86/misched-fusion.ll b/test/CodeGen/X86/misched-fusion.ll new file mode 100644 index 000000000000..859d92d6978b --- /dev/null +++ b/test/CodeGen/X86/misched-fusion.ll @@ -0,0 +1,108 @@ +; RUN: llc < %s -march=x86-64 -mcpu=corei7-avx -disable-lsr -pre-RA-sched=source -enable-misched -verify-machineinstrs | FileCheck %s + +; Verify that TEST+JE are scheduled together. +; CHECK: test_je +; CHECK: %loop +; CHECK: test +; CHECK-NEXT: je +define void @test_je() { +entry: + br label %loop + +loop: + %var = phi i32* [ null, %entry ], [ %next.load, %loop1 ], [ %var, %loop2 ] + %next.ptr = phi i32** [ null, %entry ], [ %next.ptr, %loop1 ], [ %gep, %loop2 ] + br label %loop1 + +loop1: + %cond = icmp eq i32* %var, null + %next.load = load i32** %next.ptr + br i1 %cond, label %loop, label %loop2 + +loop2: ; preds = %loop1 + %gep = getelementptr inbounds i32** %next.ptr, i32 1 + store i32* %next.load, i32** undef + br label %loop +} + +; Verify that DEC+JE are scheduled together. +; CHECK: dec_je +; CHECK: %loop1 +; CHECK: dec +; CHECK-NEXT: je +define void @dec_je() { +entry: + br label %loop + +loop: + %var = phi i32 [ 0, %entry ], [ %next.var, %loop1 ], [ %var2, %loop2 ] + %next.ptr = phi i32** [ null, %entry ], [ %next.ptr, %loop1 ], [ %gep, %loop2 ] + br label %loop1 + +loop1: + %var2 = sub i32 %var, 1 + %cond = icmp eq i32 %var2, 0 + %next.load = load i32** %next.ptr + %next.var = load i32* %next.load + br i1 %cond, label %loop, label %loop2 + +loop2: + %gep = getelementptr inbounds i32** %next.ptr, i32 1 + store i32* %next.load, i32** undef + br label %loop +} + +; DEC+JS should *not* be scheduled together. +; CHECK: dec_js +; CHECK: %loop1 +; CHECK: dec +; CHECK: mov +; CHECK: js +define void @dec_js() { +entry: + br label %loop2a + +loop2a: ; preds = %loop1, %body, %entry + %var = phi i32 [ 0, %entry ], [ %next.var, %loop1 ], [ %var2, %loop2b ] + %next.ptr = phi i32** [ null, %entry ], [ %next.ptr, %loop1 ], [ %gep, %loop2b ] + br label %loop1 + +loop1: ; preds = %loop2a, %loop2b + %var2 = sub i32 %var, 1 + %cond = icmp slt i32 %var2, 0 + %next.load = load i32** %next.ptr + %next.var = load i32* %next.load + br i1 %cond, label %loop2a, label %loop2b + +loop2b: ; preds = %loop1 + %gep = getelementptr inbounds i32** %next.ptr, i32 1 + store i32* %next.load, i32** undef + br label %loop2a +} + +; Verify that CMP+JB are scheduled together. +; CHECK: cmp_jb +; CHECK: %loop1 +; CHECK: cmp +; CHECK-NEXT: jb +define void @cmp_jb(i32 %n) { +entry: + br label %loop2a + +loop2a: ; preds = %loop1, %body, %entry + %var = phi i32 [ 0, %entry ], [ %next.var, %loop1 ], [ %var2, %loop2b ] + %next.ptr = phi i32** [ null, %entry ], [ %next.ptr, %loop1 ], [ %gep, %loop2b ] + br label %loop1 + +loop1: ; preds = %loop2a, %loop2b + %var2 = sub i32 %var, 1 + %cond = icmp ult i32 %var2, %n + %next.load = load i32** %next.ptr + %next.var = load i32* %next.load + br i1 %cond, label %loop2a, label %loop2b + +loop2b: ; preds = %loop1 + %gep = getelementptr inbounds i32** %next.ptr, i32 1 + store i32* %next.load, i32** undef + br label %loop2a +} |