1; RUN: llc < %s -march=x86-64 -relocation-model=pic | FileCheck %s 2; This test is to ensure the TwoAddrInstruction pass chooses the proper operands to 3; merge and generates fewer mov insns. 4 5@M = common global i32 0, align 4 6@total = common global i32 0, align 4 7@g = common global i32 0, align 4 8 9; Function Attrs: nounwind uwtable 10define void @foo() { 11entry: 12 %0 = load i32, i32* @M, align 4 13 %cmp3 = icmp sgt i32 %0, 0 14 br i1 %cmp3, label %for.body.lr.ph, label %for.end 15 16for.body.lr.ph: ; preds = %entry 17 %total.promoted = load i32, i32* @total, align 4 18 br label %for.body 19 20; Check that only one mov will be generated in the kernel loop. 21; CHECK-LABEL: foo: 22; CHECK: [[LOOP1:^[a-zA-Z0-9_.]+]]: {{#.*}} %for.body 23; CHECK-NOT: mov 24; CHECK: movl {{.*}}, [[REG1:%[a-z0-9]+]] 25; CHECK-NOT: mov 26; CHECK: shrl $31, [[REG1]] 27; CHECK-NOT: mov 28; CHECK: jl [[LOOP1]] 29for.body: ; preds = %for.body.lr.ph, %for.body 30 %add5 = phi i32 [ %total.promoted, %for.body.lr.ph ], [ %add, %for.body ] 31 %i.04 = phi i32 [ 0, %for.body.lr.ph ], [ %inc, %for.body ] 32 %div = sdiv i32 %i.04, 2 33 %add = add nsw i32 %div, %add5 34 %inc = add nuw nsw i32 %i.04, 1 35 %cmp = icmp slt i32 %inc, %0 36 br i1 %cmp, label %for.body, label %for.cond.for.end_crit_edge 37 38for.cond.for.end_crit_edge: ; preds = %for.body 39 store i32 %add, i32* @total, align 4 40 br label %for.end 41 42for.end: ; preds = %for.cond.for.end_crit_edge, %entry 43 ret void 44} 45 46; Function Attrs: nounwind uwtable 47define void @goo() { 48entry: 49 %0 = load i32, i32* @M, align 4 50 %cmp3 = icmp sgt i32 %0, 0 51 br i1 %cmp3, label %for.body.lr.ph, label %for.end 52 53for.body.lr.ph: ; preds = %entry 54 %total.promoted = load i32, i32* @total, align 4 55 br label %for.body 56 57; Check that only two mov will be generated in the kernel loop. 58; CHECK-LABEL: goo: 59; CHECK: [[LOOP2:^[a-zA-Z0-9_.]+]]: {{#.*}} %for.body 60; CHECK-NOT: mov 61; CHECK: movl {{.*}}, [[REG2:%[a-z0-9]+]] 62; CHECK-NOT: mov 63; CHECK: shrl $31, [[REG2]] 64; CHECK-NOT: mov 65; CHECK: movl {{.*}} 66; CHECK: jl [[LOOP2]] 67for.body: ; preds = %for.body.lr.ph, %for.body 68 %add5 = phi i32 [ %total.promoted, %for.body.lr.ph ], [ %add, %for.body ] 69 %i.04 = phi i32 [ 0, %for.body.lr.ph ], [ %inc, %for.body ] 70 %div = sdiv i32 %i.04, 2 71 %add = add nsw i32 %div, %add5 72 store volatile i32 %add, i32* @g, align 4 73 %inc = add nuw nsw i32 %i.04, 1 74 %cmp = icmp slt i32 %inc, %0 75 br i1 %cmp, label %for.body, label %for.cond.for.end_crit_edge 76 77for.cond.for.end_crit_edge: ; preds = %for.body 78 store i32 %add, i32* @total, align 4 79 br label %for.end 80 81for.end: ; preds = %for.cond.for.end_crit_edge, %entry 82 ret void 83} 84 85