1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134
|
; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py UTC_ARGS: --version 3
; PR1135
; RUN: llc %s -o - | FileCheck %s
target datalayout = "e-p:64:64:64-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:64:64-f32:32:32-f64:64:64-v64:64:64-v128:128:128-a0:0:64-s0:64:64-f80:128:128-n8:16:32:64"
target triple = "x86_64-apple-darwin10.3"
define void @test(ptr nocapture %array, i32 %r0) nounwind ssp noredzone {
; CHECK-LABEL: test:
; CHECK: ## %bb.0: ## %bb.nph
; CHECK-NEXT: movb $32, %al
; CHECK-NEXT: xorl %ecx, %ecx
; CHECK-NEXT: xorl %edx, %edx
; CHECK-NEXT: xorl %r8d, %r8d
; CHECK-NEXT: .p2align 4, 0x90
; CHECK-NEXT: LBB0_1: ## %bb
; CHECK-NEXT: ## =>This Inner Loop Header: Depth=1
; CHECK-NEXT: cmpb $4, %r8b
; CHECK-NEXT: movzbl %r8b, %r8d
; CHECK-NEXT: cmovgel %ecx, %r8d
; CHECK-NEXT: sete %r9b
; CHECK-NEXT: addb %r9b, %dl
; CHECK-NEXT: leal (,%rdx,4), %r9d
; CHECK-NEXT: addb %r8b, %r9b
; CHECK-NEXT: shlb $2, %r9b
; CHECK-NEXT: movzbl %r9b, %r9d
; CHECK-NEXT: movl %esi, (%rdi,%r9,4)
; CHECK-NEXT: movl %esi, 8(%rdi,%r9,4)
; CHECK-NEXT: movl %esi, 4(%rdi,%r9,4)
; CHECK-NEXT: movl %esi, 12(%rdi,%r9,4)
; CHECK-NEXT: incb %r8b
; CHECK-NEXT: decb %al
; CHECK-NEXT: jne LBB0_1
; CHECK-NEXT: ## %bb.2: ## %return
; CHECK-NEXT: retq
bb.nph:
br label %bb
bb: ; preds = %bb, %bb.nph
%j.010 = phi i8 [ 0, %bb.nph ], [ %14, %bb ] ; <i8> [#uses=1]
%k.19 = phi i8 [ 0, %bb.nph ], [ %.k.1, %bb ] ; <i8> [#uses=1]
%i0.08 = phi i8 [ 0, %bb.nph ], [ %15, %bb ] ; <i8> [#uses=3]
%0 = icmp slt i8 %i0.08, 4 ; <i1> [#uses=1]
%iftmp.0.0 = select i1 %0, i8 %i0.08, i8 0 ; <i8> [#uses=2]
%1 = icmp eq i8 %i0.08, 4 ; <i1> [#uses=1]
%2 = zext i1 %1 to i8 ; <i8> [#uses=1]
%.k.1 = add i8 %2, %k.19 ; <i8> [#uses=2]
%3 = shl i8 %.k.1, 2 ; <i8> [#uses=1]
%4 = add i8 %3, %iftmp.0.0 ; <i8> [#uses=1]
%5 = shl i8 %4, 2 ; <i8> [#uses=1]
%6 = zext i8 %5 to i64 ; <i64> [#uses=4]
%7 = getelementptr inbounds i32, ptr %array, i64 %6 ; <ptr> [#uses=1]
store i32 %r0, ptr %7, align 4
%8 = or i64 %6, 2 ; <i64> [#uses=1]
%9 = getelementptr inbounds i32, ptr %array, i64 %8 ; <ptr> [#uses=1]
store i32 %r0, ptr %9, align 4
%10 = or i64 %6, 1 ; <i64> [#uses=1]
%11 = getelementptr inbounds i32, ptr %array, i64 %10 ; <ptr> [#uses=1]
store i32 %r0, ptr %11, align 4
%12 = or i64 %6, 3 ; <i64> [#uses=1]
%13 = getelementptr inbounds i32, ptr %array, i64 %12 ; <ptr> [#uses=1]
store i32 %r0, ptr %13, align 4
%14 = add nsw i8 %j.010, 1 ; <i8> [#uses=2]
%15 = add i8 %iftmp.0.0, 1 ; <i8> [#uses=1]
%exitcond = icmp eq i8 %14, 32 ; <i1> [#uses=1]
br i1 %exitcond, label %return, label %bb
return: ; preds = %bb
ret void
}
define void @test1(ptr nocapture %array, i32 %r0, i8 signext %k, i8 signext %i0) nounwind {
; CHECK-LABEL: test1:
; CHECK: ## %bb.0: ## %bb.nph
; CHECK-NEXT: ## kill: def $ecx killed $ecx def $rcx
; CHECK-NEXT: movb $32, %al
; CHECK-NEXT: xorl %r8d, %r8d
; CHECK-NEXT: .p2align 4, 0x90
; CHECK-NEXT: LBB1_1: ## %for.body
; CHECK-NEXT: ## =>This Inner Loop Header: Depth=1
; CHECK-NEXT: cmpb $4, %cl
; CHECK-NEXT: movzbl %cl, %ecx
; CHECK-NEXT: cmovgel %r8d, %ecx
; CHECK-NEXT: sete %r9b
; CHECK-NEXT: addb %r9b, %dl
; CHECK-NEXT: leal (,%rcx,4), %r9d
; CHECK-NEXT: movl %edx, %r10d
; CHECK-NEXT: shlb $4, %r10b
; CHECK-NEXT: addb %r9b, %r10b
; CHECK-NEXT: movzbl %r10b, %r9d
; CHECK-NEXT: movl %esi, (%rdi,%r9,4)
; CHECK-NEXT: movl %esi, 8(%rdi,%r9,4)
; CHECK-NEXT: movl %esi, 4(%rdi,%r9,4)
; CHECK-NEXT: movl %esi, 12(%rdi,%r9,4)
; CHECK-NEXT: incb %cl
; CHECK-NEXT: decb %al
; CHECK-NEXT: jne LBB1_1
; CHECK-NEXT: ## %bb.2: ## %for.end
; CHECK-NEXT: retq
bb.nph:
br label %for.body
for.body: ; preds = %for.body, %bb.nph
%j.065 = phi i8 [ 0, %bb.nph ], [ %inc52, %for.body ] ; <i8> [#uses=1]
%i0.addr.064 = phi i8 [ %i0, %bb.nph ], [ %add, %for.body ] ; <i8> [#uses=3]
%k.addr.163 = phi i8 [ %k, %bb.nph ], [ %inc.k.addr.1, %for.body ] ; <i8> [#uses=1]
%cmp5 = icmp slt i8 %i0.addr.064, 4 ; <i1> [#uses=1]
%cond = select i1 %cmp5, i8 %i0.addr.064, i8 0 ; <i8> [#uses=2]
%cmp12 = icmp eq i8 %i0.addr.064, 4 ; <i1> [#uses=1]
%inc = zext i1 %cmp12 to i8 ; <i8> [#uses=1]
%inc.k.addr.1 = add i8 %inc, %k.addr.163 ; <i8> [#uses=2]
%mul = shl i8 %cond, 2 ; <i8> [#uses=1]
%mul22 = shl i8 %inc.k.addr.1, 4 ; <i8> [#uses=1]
%add23 = add i8 %mul22, %mul ; <i8> [#uses=1]
%idxprom = zext i8 %add23 to i64 ; <i64> [#uses=4]
%arrayidx = getelementptr inbounds i32, ptr %array, i64 %idxprom ; <ptr> [#uses=1]
store i32 %r0, ptr %arrayidx
%add3356 = or i64 %idxprom, 2 ; <i64> [#uses=1]
%arrayidx36 = getelementptr inbounds i32, ptr %array, i64 %add3356 ; <ptr> [#uses=1]
store i32 %r0, ptr %arrayidx36
%add4058 = or i64 %idxprom, 1 ; <i64> [#uses=1]
%arrayidx43 = getelementptr inbounds i32, ptr %array, i64 %add4058 ; <ptr> [#uses=1]
store i32 %r0, ptr %arrayidx43
%add4760 = or i64 %idxprom, 3 ; <i64> [#uses=1]
%arrayidx50 = getelementptr inbounds i32, ptr %array, i64 %add4760 ; <ptr> [#uses=1]
store i32 %r0, ptr %arrayidx50
%inc52 = add nsw i8 %j.065, 1 ; <i8> [#uses=2]
%add = add i8 %cond, 1 ; <i8> [#uses=1]
%exitcond = icmp eq i8 %inc52, 32 ; <i1> [#uses=1]
br i1 %exitcond, label %for.end, label %for.body
for.end: ; preds = %for.body
ret void
}
|