xref: /llvm-project/llvm/test/CodeGen/RISCV/loop-strength-reduce-add-cheaper-than-mul.ll (revision 1456b68686808fa7c6ed7327aba65b639f81d5b8)
1923831ebSPhilip Reames; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
2923831ebSPhilip Reames; RUN: llc < %s -mtriple=riscv32 -verify-machineinstrs -mattr=+m | FileCheck %s -check-prefixes=RV32
3923831ebSPhilip Reames; RUN: llc < %s -mtriple=riscv64 -verify-machineinstrs -mattr=+m | FileCheck %s -check-prefixes=RV64
4923831ebSPhilip Reames
5923831ebSPhilip Reames; Test case:
6923831ebSPhilip Reames; - Addition should be cheaper than multiplication
7923831ebSPhilip Reames
8923831ebSPhilip Reames; The following LLVM IR simulates:
9923831ebSPhilip Reames; int8_t flag2[8193];
10923831ebSPhilip Reames; void test(int i) {
11923831ebSPhilip Reames;   int tmp = i * 2;
12923831ebSPhilip Reames; 	if (i * 2 > 8192) return ;
13923831ebSPhilip Reames;   for (int j = 0; ; ++j) {
14923831ebSPhilip Reames; 		int offset = j * i + tmp;
15923831ebSPhilip Reames; 		flag2[offset] = 0;
16923831ebSPhilip Reames; 		if (offset + i > 8192) break;
17923831ebSPhilip Reames;   }
18923831ebSPhilip Reames; }
19923831ebSPhilip Reames
20923831ebSPhilip Reames; After LSR:
21923831ebSPhilip Reames; int8_t flag2[8193];
22923831ebSPhilip Reames; void test(int i) {
23923831ebSPhilip Reames; 	int j = i * 2;
24923831ebSPhilip Reames; 	if (j > 8193) return ;
25923831ebSPhilip Reames;   do {
26923831ebSPhilip Reames; 		flag2[j] = 0;
27923831ebSPhilip Reames; 		j += i;
28923831ebSPhilip Reames;   } while (j < 8193);
29923831ebSPhilip Reames; }
30923831ebSPhilip Reames
31*1456b686SNikita Popov@flags2 = internal global [8193 x i8] zeroinitializer, align 32		; <ptr> [#uses=1]
32923831ebSPhilip Reames
33923831ebSPhilip Reamesdefine void @test(i32 signext %i) nounwind {
34923831ebSPhilip Reames; RV32-LABEL: test:
35923831ebSPhilip Reames; RV32:       # %bb.0: # %entry
36923831ebSPhilip Reames; RV32-NEXT:    slli a1, a0, 1
37923831ebSPhilip Reames; RV32-NEXT:    lui a3, 2
38923831ebSPhilip Reames; RV32-NEXT:    blt a3, a1, .LBB0_3
39923831ebSPhilip Reames; RV32-NEXT:  # %bb.1: # %bb.preheader
40923831ebSPhilip Reames; RV32-NEXT:    lui a2, %hi(flags2)
41923831ebSPhilip Reames; RV32-NEXT:    addi a2, a2, %lo(flags2)
42923831ebSPhilip Reames; RV32-NEXT:    addi a3, a3, 1
43923831ebSPhilip Reames; RV32-NEXT:  .LBB0_2: # %bb
44923831ebSPhilip Reames; RV32-NEXT:    # =>This Inner Loop Header: Depth=1
45aaad5075SCraig Topper; RV32-NEXT:    add a4, a2, a1
46923831ebSPhilip Reames; RV32-NEXT:    add a1, a1, a0
47923831ebSPhilip Reames; RV32-NEXT:    sb zero, 0(a4)
48923831ebSPhilip Reames; RV32-NEXT:    blt a1, a3, .LBB0_2
49923831ebSPhilip Reames; RV32-NEXT:  .LBB0_3: # %return
50923831ebSPhilip Reames; RV32-NEXT:    ret
51923831ebSPhilip Reames;
52923831ebSPhilip Reames; RV64-LABEL: test:
53923831ebSPhilip Reames; RV64:       # %bb.0: # %entry
54923831ebSPhilip Reames; RV64-NEXT:    slliw a1, a0, 1
55974e2e69SCraig Topper; RV64-NEXT:    lui a3, 2
56974e2e69SCraig Topper; RV64-NEXT:    blt a3, a1, .LBB0_3
57923831ebSPhilip Reames; RV64-NEXT:  # %bb.1: # %bb.preheader
58974e2e69SCraig Topper; RV64-NEXT:    lui a2, %hi(flags2)
59974e2e69SCraig Topper; RV64-NEXT:    addi a2, a2, %lo(flags2)
60974e2e69SCraig Topper; RV64-NEXT:    addiw a3, a3, 1
61923831ebSPhilip Reames; RV64-NEXT:  .LBB0_2: # %bb
62923831ebSPhilip Reames; RV64-NEXT:    # =>This Inner Loop Header: Depth=1
63974e2e69SCraig Topper; RV64-NEXT:    slli a4, a1, 32
64974e2e69SCraig Topper; RV64-NEXT:    srli a4, a4, 32
65974e2e69SCraig Topper; RV64-NEXT:    add a4, a2, a4
66974e2e69SCraig Topper; RV64-NEXT:    addw a1, a1, a0
67974e2e69SCraig Topper; RV64-NEXT:    sb zero, 0(a4)
68974e2e69SCraig Topper; RV64-NEXT:    blt a1, a3, .LBB0_2
69923831ebSPhilip Reames; RV64-NEXT:  .LBB0_3: # %return
70923831ebSPhilip Reames; RV64-NEXT:    ret
71923831ebSPhilip Reamesentry:
72923831ebSPhilip Reames	%k_addr.012 = shl i32 %i, 1
73923831ebSPhilip Reames	%tmp14 = icmp sgt i32 %k_addr.012, 8192
74923831ebSPhilip Reames	br i1 %tmp14, label %return, label %bb
75923831ebSPhilip Reames
76923831ebSPhilip Reamesbb:
77923831ebSPhilip Reames	%indvar = phi i32 [ 0, %entry ], [ %indvar.next, %bb ]
78923831ebSPhilip Reames	%tmp.15 = mul i32 %indvar, %i
798fa32a74SCraig Topper	%tmp.16 = add i32 %tmp.15, %k_addr.012
80923831ebSPhilip Reames	%gep.upgrd.1 = zext i32 %tmp.16 to i64
81*1456b686SNikita Popov	%tmp = getelementptr [8193 x i8], ptr @flags2, i32 0, i64 %gep.upgrd.1
82*1456b686SNikita Popov	store i8 0, ptr %tmp
83923831ebSPhilip Reames	%tmp.17 = add i32 %tmp.16, %i
84923831ebSPhilip Reames	%tmp.upgrd.2 = icmp sgt i32 %tmp.17, 8192
85923831ebSPhilip Reames	%indvar.next = add i32 %indvar, 1
86923831ebSPhilip Reames	br i1 %tmp.upgrd.2, label %return, label %bb
87923831ebSPhilip Reames
88923831ebSPhilip Reamesreturn:
89923831ebSPhilip Reames	ret void
90923831ebSPhilip Reames}
91