-
Notifications
You must be signed in to change notification settings - Fork 10.8k
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
[RISCV] Hoist immediate addresses from loads/stores #83644
Conversation
@llvm/pr-subscribers-llvm-transforms @llvm/pr-subscribers-backend-risc-v Author: Visoiu Mistrih Francis (francisvm) ChangesIn case of loads/stores from an immediate address, avoid rematerializing the constant for every block and allow consthoist to hoist it to the entry block. Full diff: https://github.com/llvm/llvm-project/pull/83644.diff 2 Files Affected:
diff --git a/llvm/lib/Target/RISCV/RISCVTargetTransformInfo.cpp b/llvm/lib/Target/RISCV/RISCVTargetTransformInfo.cpp
index 2e4e69fb4f920f..035d0ace1cd260 100644
--- a/llvm/lib/Target/RISCV/RISCVTargetTransformInfo.cpp
+++ b/llvm/lib/Target/RISCV/RISCVTargetTransformInfo.cpp
@@ -162,6 +162,14 @@ InstructionCost RISCVTTIImpl::getIntImmCostInst(unsigned Opcode, unsigned Idx,
// split up large offsets in GEP into better parts than ConstantHoisting
// can.
return TTI::TCC_Free;
+ case Instruction::Store:
+ // If the address is a constant, use the materialization cost.
+ if (Idx == 1)
+ return getIntImmCost(Imm, Ty, CostKind);
+ return TTI::TCC_Free;
+ case Instruction::Load:
+ // If the address is a constant, use the materialization cost.
+ return getIntImmCost(Imm, Ty, CostKind);
case Instruction::And:
// zext.h
if (Imm == UINT64_C(0xffff) && ST->hasStdExtZbb())
diff --git a/llvm/test/Transforms/ConstantHoisting/RISCV/immediates.ll b/llvm/test/Transforms/ConstantHoisting/RISCV/immediates.ll
index 131ef673a61f82..3f1dc0d643d57a 100644
--- a/llvm/test/Transforms/ConstantHoisting/RISCV/immediates.ll
+++ b/llvm/test/Transforms/ConstantHoisting/RISCV/immediates.ll
@@ -150,3 +150,43 @@ define i64 @test16(i64 %a) nounwind {
ret i64 %2
}
+; Check that we hoist the absolute address of the stores to the entry block.
+define void @test17(ptr %s, i32 %size) nounwind {
+; CHECK-LABEL: test17
+; CHECK: %const = bitcast i32 -1073741792 to i32
+; CHECK: %0 = inttoptr i32 %const to ptr
+; CHECK: store i32 20, ptr %0
+; CHECK: %1 = inttoptr i32 %const to ptr
+; CHECK: store i32 10, ptr %1
+entry:
+ %cond = icmp eq i32 %size, 0
+ br i1 %cond, label %if.true, label %exit
+if.true:
+ store i32 20, ptr inttoptr (i32 -1073741792 to ptr)
+ br label %exit
+exit:
+ store i32 10, ptr inttoptr (i32 -1073741792 to ptr)
+ ret void
+}
+
+; Check that we hoist the absolute address of the loads to the entry block.
+define i32 @test18(ptr %s, i32 %size) nounwind {
+; CHECK-LABEL: test18
+; CHECK: %const = bitcast i32 -1073741792 to i32
+; CHECK: %0 = inttoptr i32 %const to ptr
+; CHECK: %1 = load i32, ptr %0
+; CHECK: %2 = inttoptr i32 %const to ptr
+; CHECK: %3 = load i32, ptr %2
+entry:
+ %cond = icmp eq i32 %size, 0
+ br i1 %cond, label %if.true, label %if.false
+if.true:
+ %0 = load i32, ptr inttoptr (i32 -1073741792 to ptr)
+ br label %return
+if.false:
+ %1 = load i32, ptr inttoptr (i32 -1073741792 to ptr)
+ br label %return
+return:
+ %val = phi i32 [%0, %if.true], [%1, %if.false]
+ ret i32 %val
+}
|
a0b7046
to
d5b6740
Compare
In case of loads/stores from an immediate address, avoid rematerializing the constant for every block and allow consthoist to hoist it to the entry block.
d5b6740
to
344b545
Compare
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
LGTM.
In case of loads/stores from an immediate address, avoid rematerializing the constant for every block and allow consthoist to hoist it to the entry block. (cherry picked from commit eceb24c)
[RISCV] Hoist immediate addresses from loads/stores (llvm#83644)
In case of loads/stores from an immediate address, avoid rematerializing the constant for every block and allow consthoist to hoist it to the entry block.