1; RUN: llc < %s -march=x86-64 -mcpu=corei7-avx -disable-lsr -pre-RA-sched=source -enable-misched -verify-machineinstrs | FileCheck %s 2 3; Verify that TEST+JE are scheduled together. 4; CHECK: test_je 5; CHECK: %loop 6; CHECK: test 7; CHECK-NEXT: je 8define void @test_je() { 9entry: 10 br label %loop 11 12loop: 13 %var = phi i32* [ null, %entry ], [ %next.load, %loop1 ], [ %var, %loop2 ] 14 %next.ptr = phi i32** [ null, %entry ], [ %next.ptr, %loop1 ], [ %gep, %loop2 ] 15 br label %loop1 16 17loop1: 18 %cond = icmp eq i32* %var, null 19 %next.load = load i32*, i32** %next.ptr 20 br i1 %cond, label %loop, label %loop2 21 22loop2: ; preds = %loop1 23 %gep = getelementptr inbounds i32*, i32** %next.ptr, i32 1 24 store i32* %next.load, i32** undef 25 br label %loop 26} 27 28; Verify that DEC+JE are scheduled together. 29; CHECK: dec_je 30; CHECK: %loop1 31; CHECK: dec 32; CHECK-NEXT: je 33define void @dec_je() { 34entry: 35 br label %loop 36 37loop: 38 %var = phi i32 [ 0, %entry ], [ %next.var, %loop1 ], [ %var2, %loop2 ] 39 %next.ptr = phi i32** [ null, %entry ], [ %next.ptr, %loop1 ], [ %gep, %loop2 ] 40 br label %loop1 41 42loop1: 43 %var2 = sub i32 %var, 1 44 %cond = icmp eq i32 %var2, 0 45 %next.load = load i32*, i32** %next.ptr 46 %next.var = load i32, i32* %next.load 47 br i1 %cond, label %loop, label %loop2 48 49loop2: 50 %gep = getelementptr inbounds i32*, i32** %next.ptr, i32 1 51 store i32* %next.load, i32** undef 52 br label %loop 53} 54 55; DEC+JS should *not* be scheduled together. 56; CHECK: dec_js 57; CHECK: %loop1 58; CHECK: dec 59; CHECK: mov 60; CHECK: js 61define void @dec_js() { 62entry: 63 br label %loop2a 64 65loop2a: ; preds = %loop1, %body, %entry 66 %var = phi i32 [ 0, %entry ], [ %next.var, %loop1 ], [ %var2, %loop2b ] 67 %next.ptr = phi i32** [ null, %entry ], [ %next.ptr, %loop1 ], [ %gep, %loop2b ] 68 br label %loop1 69 70loop1: ; preds = %loop2a, %loop2b 71 %var2 = sub i32 %var, 1 72 %cond = icmp slt i32 %var2, 0 73 %next.load = load i32*, i32** %next.ptr 74 %next.var = load i32, i32* %next.load 75 br i1 %cond, label %loop2a, label %loop2b 76 77loop2b: ; preds = %loop1 78 %gep = getelementptr inbounds i32*, i32** %next.ptr, i32 1 79 store i32* %next.load, i32** undef 80 br label %loop2a 81} 82 83; Verify that CMP+JB are scheduled together. 84; CHECK: cmp_jb 85; CHECK: %loop1 86; CHECK: cmp 87; CHECK-NEXT: jb 88define void @cmp_jb(i32 %n) { 89entry: 90 br label %loop2a 91 92loop2a: ; preds = %loop1, %body, %entry 93 %var = phi i32 [ 0, %entry ], [ %next.var, %loop1 ], [ %var2, %loop2b ] 94 %next.ptr = phi i32** [ null, %entry ], [ %next.ptr, %loop1 ], [ %gep, %loop2b ] 95 br label %loop1 96 97loop1: ; preds = %loop2a, %loop2b 98 %var2 = sub i32 %var, 1 99 %cond = icmp ult i32 %var2, %n 100 %next.load = load i32*, i32** %next.ptr 101 %next.var = load i32, i32* %next.load 102 br i1 %cond, label %loop2a, label %loop2b 103 104loop2b: ; preds = %loop1 105 %gep = getelementptr inbounds i32*, i32** %next.ptr, i32 1 106 store i32* %next.load, i32** undef 107 br label %loop2a 108} 109