mirror of
https://github.com/llvm/llvm-project.git
synced 2025-04-14 15:56:32 +00:00
[KeyInstr][Clang] While stmt atom
See test comment for possible future improvement. This patch is part of a stack that teaches Clang to generate Key Instructions metadata for C and C++. The Key Instructions project is introduced, including a "quick summary" section at the top which adds context for this PR, here: https://discourse.llvm.org/t/rfc-improving-is-stmt-placement-for-better-interactive-debugging/82668 The feature is only functional in LLVM if LLVM is built with CMake flag LLVM_EXPERIMENTAL_KEY_INSTRUCTIONs. Eventually that flag will be removed. The Clang-side work is demoed here: https://github.com/llvm/llvm-project/pull/130943
This commit is contained in:
parent
2ee4d451f7
commit
38f3eec43e
@ -1130,7 +1130,14 @@ void CodeGenFunction::EmitWhileStmt(const WhileStmt &S,
|
||||
if (!Weights && CGM.getCodeGenOpts().OptimizationLevel)
|
||||
BoolCondVal = emitCondLikelihoodViaExpectIntrinsic(
|
||||
BoolCondVal, Stmt::getLikelihood(S.getBody()));
|
||||
Builder.CreateCondBr(BoolCondVal, LoopBody, ExitBlock, Weights);
|
||||
auto *I = Builder.CreateCondBr(BoolCondVal, LoopBody, ExitBlock, Weights);
|
||||
// Key Instructions: Emit the condition and branch as separate atoms to
|
||||
// match existing loop stepping behaviour. FIXME: We could have the branch
|
||||
// as the backup location for the condition, which would probably be a
|
||||
// better experience. Explore this later.
|
||||
if (auto *I = dyn_cast<llvm::Instruction>(BoolCondVal))
|
||||
addInstToNewSourceAtom(I, nullptr);
|
||||
addInstToNewSourceAtom(I, nullptr);
|
||||
|
||||
if (ExitBlock != LoopExit.getBlock()) {
|
||||
EmitBlock(ExitBlock);
|
||||
|
34
clang/test/KeyInstructions/while.c
Normal file
34
clang/test/KeyInstructions/while.c
Normal file
@ -0,0 +1,34 @@
|
||||
// RUN: %clang -gkey-instructions -x c++ -std=c++17 %s -gmlt -S -emit-llvm -o - \
|
||||
// RUN: | FileCheck %s --implicit-check-not atomGroup --implicit-check-not atomRank
|
||||
|
||||
// RUN: %clang -gkey-instructions -x c %s -gmlt -S -emit-llvm -o - \
|
||||
// RUN: | FileCheck %s --implicit-check-not atomGroup --implicit-check-not atomRank
|
||||
|
||||
// Perennial quesiton: should the `dec` be in its own source atom or not
|
||||
// (currently it is).
|
||||
|
||||
// We've made the cmp and br separate source atoms for now, to match existing
|
||||
// behaviour in this case:
|
||||
// 1. while (
|
||||
// 2. int i = --End
|
||||
// 3. ) {
|
||||
// 4. useValue(i);
|
||||
// 5. }
|
||||
// Without Key Instructions we go: 2, 1[, 4, 2, 1]+
|
||||
// Without separating cmp and br with Key Instructions we'd get:
|
||||
// 1[, 4, 1]+. If we made the cmp higher precedence than the
|
||||
// br and had them in the same group, we could get:
|
||||
// 2, [4, 2]+ which might be nicer. FIXME: do that later.
|
||||
|
||||
void a(int A) {
|
||||
// CHECK: %dec = add nsw i32 %0, -1, !dbg [[G1R2:!.*]]
|
||||
// CHECK: store i32 %dec, ptr %A.addr{{.*}}, !dbg [[G1R1:!.*]]
|
||||
// CHECK: %tobool = icmp ne i32 %dec, 0, !dbg [[G2R1:!.*]]
|
||||
// CHECK: br i1 %tobool, label %while.body, label %while.end, !dbg [[G3R1:!.*]]
|
||||
while (--A) { };
|
||||
}
|
||||
|
||||
// CHECK: [[G1R2]] = !DILocation({{.*}}, atomGroup: 1, atomRank: 2)
|
||||
// CHECK: [[G1R1]] = !DILocation({{.*}}, atomGroup: 1, atomRank: 1)
|
||||
// CHECK: [[G2R1]] = !DILocation({{.*}}, atomGroup: 2, atomRank: 1)
|
||||
// CHECK: [[G3R1]] = !DILocation({{.*}}, atomGroup: 3, atomRank: 1)
|
Loading…
x
Reference in New Issue
Block a user