xref: /aosp_15_r20/external/llvm/test/CodeGen/X86/change-compare-stride-1.ll (revision 9880d6810fe72a1726cb53787c6711e909410d58)
1*9880d681SAndroid Build Coastguard Worker; RUN: llc < %s -march=x86-64 -enable-lsr-nested | FileCheck %s
2*9880d681SAndroid Build Coastguard Worker;
3*9880d681SAndroid Build Coastguard Worker; Nested LSR is required to optimize this case.
4*9880d681SAndroid Build Coastguard Worker; We do not expect to see this form of IR without -enable-iv-rewrite.
5*9880d681SAndroid Build Coastguard Worker
6*9880d681SAndroid Build Coastguard Worker; xfailed for now because the scheduler two-address hack has been disabled.
7*9880d681SAndroid Build Coastguard Worker; Now it's generating a leal -1 rather than a decq.
8*9880d681SAndroid Build Coastguard Worker; XFAIL: *
9*9880d681SAndroid Build Coastguard Worker
10*9880d681SAndroid Build Coastguard Workerdefine void @borf(i8* nocapture %in, i8* nocapture %out) nounwind {
11*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: borf:
12*9880d681SAndroid Build Coastguard Worker; CHECK-NOT: inc
13*9880d681SAndroid Build Coastguard Worker; CHECK-NOT: leal 1(
14*9880d681SAndroid Build Coastguard Worker; CHECK-NOT: leal -1(
15*9880d681SAndroid Build Coastguard Worker; CHECK: decq
16*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: cmpq $-478
17*9880d681SAndroid Build Coastguard Worker; CHECK: ret
18*9880d681SAndroid Build Coastguard Worker
19*9880d681SAndroid Build Coastguard Workerbb4.thread:
20*9880d681SAndroid Build Coastguard Worker	br label %bb2.outer
21*9880d681SAndroid Build Coastguard Worker
22*9880d681SAndroid Build Coastguard Workerbb2.outer:		; preds = %bb4, %bb4.thread
23*9880d681SAndroid Build Coastguard Worker	%indvar19 = phi i64 [ 0, %bb4.thread ], [ %indvar.next29, %bb4 ]		; <i64> [#uses=3]
24*9880d681SAndroid Build Coastguard Worker	%indvar31 = trunc i64 %indvar19 to i16		; <i16> [#uses=1]
25*9880d681SAndroid Build Coastguard Worker	%i.0.reg2mem.0.ph = sub i16 639, %indvar31		; <i16> [#uses=1]
26*9880d681SAndroid Build Coastguard Worker	%0 = zext i16 %i.0.reg2mem.0.ph to i32		; <i32> [#uses=1]
27*9880d681SAndroid Build Coastguard Worker	%1 = mul i32 %0, 480		; <i32> [#uses=1]
28*9880d681SAndroid Build Coastguard Worker	%tmp21 = mul i64 %indvar19, -478		; <i64> [#uses=1]
29*9880d681SAndroid Build Coastguard Worker	br label %bb2
30*9880d681SAndroid Build Coastguard Worker
31*9880d681SAndroid Build Coastguard Workerbb2:		; preds = %bb2, %bb2.outer
32*9880d681SAndroid Build Coastguard Worker	%indvar = phi i64 [ 0, %bb2.outer ], [ %indvar.next, %bb2 ]		; <i64> [#uses=3]
33*9880d681SAndroid Build Coastguard Worker	%indvar16 = trunc i64 %indvar to i16		; <i16> [#uses=1]
34*9880d681SAndroid Build Coastguard Worker	%ctg2 = getelementptr i8, i8* %out, i64 %tmp21		; <i8*> [#uses=1]
35*9880d681SAndroid Build Coastguard Worker	%tmp22 = ptrtoint i8* %ctg2 to i64		; <i64> [#uses=1]
36*9880d681SAndroid Build Coastguard Worker	%tmp24 = sub i64 %tmp22, %indvar		; <i64> [#uses=1]
37*9880d681SAndroid Build Coastguard Worker	%out_addr.0.reg2mem.0 = inttoptr i64 %tmp24 to i8*		; <i8*> [#uses=1]
38*9880d681SAndroid Build Coastguard Worker	%j.0.reg2mem.0 = sub i16 479, %indvar16		; <i16> [#uses=1]
39*9880d681SAndroid Build Coastguard Worker	%2 = zext i16 %j.0.reg2mem.0 to i32		; <i32> [#uses=1]
40*9880d681SAndroid Build Coastguard Worker	%3 = add i32 %1, %2		; <i32> [#uses=9]
41*9880d681SAndroid Build Coastguard Worker	%4 = add i32 %3, -481		; <i32> [#uses=1]
42*9880d681SAndroid Build Coastguard Worker	%5 = zext i32 %4 to i64		; <i64> [#uses=1]
43*9880d681SAndroid Build Coastguard Worker	%6 = getelementptr i8, i8* %in, i64 %5		; <i8*> [#uses=1]
44*9880d681SAndroid Build Coastguard Worker	%7 = load i8, i8* %6, align 1		; <i8> [#uses=1]
45*9880d681SAndroid Build Coastguard Worker	%8 = add i32 %3, -480		; <i32> [#uses=1]
46*9880d681SAndroid Build Coastguard Worker	%9 = zext i32 %8 to i64		; <i64> [#uses=1]
47*9880d681SAndroid Build Coastguard Worker	%10 = getelementptr i8, i8* %in, i64 %9		; <i8*> [#uses=1]
48*9880d681SAndroid Build Coastguard Worker	%11 = load i8, i8* %10, align 1		; <i8> [#uses=1]
49*9880d681SAndroid Build Coastguard Worker	%12 = add i32 %3, -479		; <i32> [#uses=1]
50*9880d681SAndroid Build Coastguard Worker	%13 = zext i32 %12 to i64		; <i64> [#uses=1]
51*9880d681SAndroid Build Coastguard Worker	%14 = getelementptr i8, i8* %in, i64 %13		; <i8*> [#uses=1]
52*9880d681SAndroid Build Coastguard Worker	%15 = load i8, i8* %14, align 1		; <i8> [#uses=1]
53*9880d681SAndroid Build Coastguard Worker	%16 = add i32 %3, -1		; <i32> [#uses=1]
54*9880d681SAndroid Build Coastguard Worker	%17 = zext i32 %16 to i64		; <i64> [#uses=1]
55*9880d681SAndroid Build Coastguard Worker	%18 = getelementptr i8, i8* %in, i64 %17		; <i8*> [#uses=1]
56*9880d681SAndroid Build Coastguard Worker	%19 = load i8, i8* %18, align 1		; <i8> [#uses=1]
57*9880d681SAndroid Build Coastguard Worker	%20 = zext i32 %3 to i64		; <i64> [#uses=1]
58*9880d681SAndroid Build Coastguard Worker	%21 = getelementptr i8, i8* %in, i64 %20		; <i8*> [#uses=1]
59*9880d681SAndroid Build Coastguard Worker	%22 = load i8, i8* %21, align 1		; <i8> [#uses=1]
60*9880d681SAndroid Build Coastguard Worker	%23 = add i32 %3, 1		; <i32> [#uses=1]
61*9880d681SAndroid Build Coastguard Worker	%24 = zext i32 %23 to i64		; <i64> [#uses=1]
62*9880d681SAndroid Build Coastguard Worker	%25 = getelementptr i8, i8* %in, i64 %24		; <i8*> [#uses=1]
63*9880d681SAndroid Build Coastguard Worker	%26 = load i8, i8* %25, align 1		; <i8> [#uses=1]
64*9880d681SAndroid Build Coastguard Worker	%27 = add i32 %3, 481		; <i32> [#uses=1]
65*9880d681SAndroid Build Coastguard Worker	%28 = zext i32 %27 to i64		; <i64> [#uses=1]
66*9880d681SAndroid Build Coastguard Worker	%29 = getelementptr i8, i8* %in, i64 %28		; <i8*> [#uses=1]
67*9880d681SAndroid Build Coastguard Worker	%30 = load i8, i8* %29, align 1		; <i8> [#uses=1]
68*9880d681SAndroid Build Coastguard Worker	%31 = add i32 %3, 480		; <i32> [#uses=1]
69*9880d681SAndroid Build Coastguard Worker	%32 = zext i32 %31 to i64		; <i64> [#uses=1]
70*9880d681SAndroid Build Coastguard Worker	%33 = getelementptr i8, i8* %in, i64 %32		; <i8*> [#uses=1]
71*9880d681SAndroid Build Coastguard Worker	%34 = load i8, i8* %33, align 1		; <i8> [#uses=1]
72*9880d681SAndroid Build Coastguard Worker	%35 = add i32 %3, 479		; <i32> [#uses=1]
73*9880d681SAndroid Build Coastguard Worker	%36 = zext i32 %35 to i64		; <i64> [#uses=1]
74*9880d681SAndroid Build Coastguard Worker	%37 = getelementptr i8, i8* %in, i64 %36		; <i8*> [#uses=1]
75*9880d681SAndroid Build Coastguard Worker	%38 = load i8, i8* %37, align 1		; <i8> [#uses=1]
76*9880d681SAndroid Build Coastguard Worker	%39 = add i8 %11, %7		; <i8> [#uses=1]
77*9880d681SAndroid Build Coastguard Worker	%40 = add i8 %39, %15		; <i8> [#uses=1]
78*9880d681SAndroid Build Coastguard Worker	%41 = add i8 %40, %19		; <i8> [#uses=1]
79*9880d681SAndroid Build Coastguard Worker	%42 = add i8 %41, %22		; <i8> [#uses=1]
80*9880d681SAndroid Build Coastguard Worker	%43 = add i8 %42, %26		; <i8> [#uses=1]
81*9880d681SAndroid Build Coastguard Worker	%44 = add i8 %43, %30		; <i8> [#uses=1]
82*9880d681SAndroid Build Coastguard Worker	%45 = add i8 %44, %34		; <i8> [#uses=1]
83*9880d681SAndroid Build Coastguard Worker	%46 = add i8 %45, %38		; <i8> [#uses=1]
84*9880d681SAndroid Build Coastguard Worker	store i8 %46, i8* %out_addr.0.reg2mem.0, align 1
85*9880d681SAndroid Build Coastguard Worker	%indvar.next = add i64 %indvar, 1		; <i64> [#uses=2]
86*9880d681SAndroid Build Coastguard Worker	%exitcond = icmp eq i64 %indvar.next, 478		; <i1> [#uses=1]
87*9880d681SAndroid Build Coastguard Worker	br i1 %exitcond, label %bb4, label %bb2
88*9880d681SAndroid Build Coastguard Worker
89*9880d681SAndroid Build Coastguard Workerbb4:		; preds = %bb2
90*9880d681SAndroid Build Coastguard Worker	%indvar.next29 = add i64 %indvar19, 1		; <i64> [#uses=2]
91*9880d681SAndroid Build Coastguard Worker	%exitcond30 = icmp eq i64 %indvar.next29, 638		; <i1> [#uses=1]
92*9880d681SAndroid Build Coastguard Worker	br i1 %exitcond30, label %return, label %bb2.outer
93*9880d681SAndroid Build Coastguard Worker
94*9880d681SAndroid Build Coastguard Workerreturn:		; preds = %bb4
95*9880d681SAndroid Build Coastguard Worker	ret void
96*9880d681SAndroid Build Coastguard Worker}
97