Home | History | Annotate | Download | only in X86
      1 ; RUN: llc < %s -march=x86 -enable-lsr-nested | FileCheck %s
      2 ;
      3 ; Nested LSR is required to optimize this case.
      4 ; We do not expect to see this form of IR without -enable-iv-rewrite.
      5 
      6 define void @borf(i8* nocapture %in, i8* nocapture %out) nounwind {
      7 ; CHECK: borf:
      8 ; CHECK-NOT: inc
      9 ; CHECK-NOT: leal 1(
     10 ; CHECK-NOT: leal -1(
     11 ; CHECK: decl
     12 ; CHECK-NEXT: cmpl $-478
     13 ; CHECK: ret
     14 
     15 bb4.thread:
     16 	br label %bb2.outer
     17 
     18 bb2.outer:		; preds = %bb4, %bb4.thread
     19 	%indvar18 = phi i32 [ 0, %bb4.thread ], [ %indvar.next28, %bb4 ]		; <i32> [#uses=3]
     20 	%tmp34 = mul i32 %indvar18, 65535		; <i32> [#uses=1]
     21 	%i.0.reg2mem.0.ph = add i32 %tmp34, 639		; <i32> [#uses=1]
     22 	%0 = and i32 %i.0.reg2mem.0.ph, 65535		; <i32> [#uses=1]
     23 	%1 = mul i32 %0, 480		; <i32> [#uses=1]
     24 	%tmp20 = mul i32 %indvar18, -478		; <i32> [#uses=1]
     25 	br label %bb2
     26 
     27 bb2:		; preds = %bb2, %bb2.outer
     28 	%indvar = phi i32 [ 0, %bb2.outer ], [ %indvar.next, %bb2 ]		; <i32> [#uses=3]
     29 	%ctg2 = getelementptr i8* %out, i32 %tmp20		; <i8*> [#uses=1]
     30 	%tmp21 = ptrtoint i8* %ctg2 to i32		; <i32> [#uses=1]
     31 	%tmp23 = sub i32 %tmp21, %indvar		; <i32> [#uses=1]
     32 	%out_addr.0.reg2mem.0 = inttoptr i32 %tmp23 to i8*		; <i8*> [#uses=1]
     33 	%tmp25 = mul i32 %indvar, 65535		; <i32> [#uses=1]
     34 	%j.0.reg2mem.0 = add i32 %tmp25, 479		; <i32> [#uses=1]
     35 	%2 = and i32 %j.0.reg2mem.0, 65535		; <i32> [#uses=1]
     36 	%3 = add i32 %1, %2		; <i32> [#uses=9]
     37 	%4 = add i32 %3, -481		; <i32> [#uses=1]
     38 	%5 = getelementptr i8* %in, i32 %4		; <i8*> [#uses=1]
     39 	%6 = load i8* %5, align 1		; <i8> [#uses=1]
     40 	%7 = add i32 %3, -480		; <i32> [#uses=1]
     41 	%8 = getelementptr i8* %in, i32 %7		; <i8*> [#uses=1]
     42 	%9 = load i8* %8, align 1		; <i8> [#uses=1]
     43 	%10 = add i32 %3, -479		; <i32> [#uses=1]
     44 	%11 = getelementptr i8* %in, i32 %10		; <i8*> [#uses=1]
     45 	%12 = load i8* %11, align 1		; <i8> [#uses=1]
     46 	%13 = add i32 %3, -1		; <i32> [#uses=1]
     47 	%14 = getelementptr i8* %in, i32 %13		; <i8*> [#uses=1]
     48 	%15 = load i8* %14, align 1		; <i8> [#uses=1]
     49 	%16 = getelementptr i8* %in, i32 %3		; <i8*> [#uses=1]
     50 	%17 = load i8* %16, align 1		; <i8> [#uses=1]
     51 	%18 = add i32 %3, 1		; <i32> [#uses=1]
     52 	%19 = getelementptr i8* %in, i32 %18		; <i8*> [#uses=1]
     53 	%20 = load i8* %19, align 1		; <i8> [#uses=1]
     54 	%21 = add i32 %3, 481		; <i32> [#uses=1]
     55 	%22 = getelementptr i8* %in, i32 %21		; <i8*> [#uses=1]
     56 	%23 = load i8* %22, align 1		; <i8> [#uses=1]
     57 	%24 = add i32 %3, 480		; <i32> [#uses=1]
     58 	%25 = getelementptr i8* %in, i32 %24		; <i8*> [#uses=1]
     59 	%26 = load i8* %25, align 1		; <i8> [#uses=1]
     60 	%27 = add i32 %3, 479		; <i32> [#uses=1]
     61 	%28 = getelementptr i8* %in, i32 %27		; <i8*> [#uses=1]
     62 	%29 = load i8* %28, align 1		; <i8> [#uses=1]
     63 	%30 = add i8 %9, %6		; <i8> [#uses=1]
     64 	%31 = add i8 %30, %12		; <i8> [#uses=1]
     65 	%32 = add i8 %31, %15		; <i8> [#uses=1]
     66 	%33 = add i8 %32, %17		; <i8> [#uses=1]
     67 	%34 = add i8 %33, %20		; <i8> [#uses=1]
     68 	%35 = add i8 %34, %23		; <i8> [#uses=1]
     69 	%36 = add i8 %35, %26		; <i8> [#uses=1]
     70 	%37 = add i8 %36, %29		; <i8> [#uses=1]
     71 	store i8 %37, i8* %out_addr.0.reg2mem.0, align 1
     72 	%indvar.next = add i32 %indvar, 1		; <i32> [#uses=2]
     73 	%exitcond = icmp eq i32 %indvar.next, 478		; <i1> [#uses=1]
     74 	br i1 %exitcond, label %bb4, label %bb2
     75 
     76 bb4:		; preds = %bb2
     77 	%indvar.next28 = add i32 %indvar18, 1		; <i32> [#uses=2]
     78 	%exitcond29 = icmp eq i32 %indvar.next28, 638		; <i1> [#uses=1]
     79 	br i1 %exitcond29, label %return, label %bb2.outer
     80 
     81 return:		; preds = %bb4
     82 	ret void
     83 }
     84