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