Skip to content

Commit 8e738de

Browse files
author
Shen, Shore
authored
2 parents 313ff2b + b9af349 commit 8e738de

File tree

2 files changed

+96
-0
lines changed

2 files changed

+96
-0
lines changed

llvm/lib/CodeGen/CodeGenPrepare.cpp

Lines changed: 46 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@
1919
#include "llvm/ADT/MapVector.h"
2020
#include "llvm/ADT/PointerIntPair.h"
2121
#include "llvm/ADT/STLExtras.h"
22+
#include "llvm/ADT/SmallBitVector.h"
2223
#include "llvm/ADT/SmallPtrSet.h"
2324
#include "llvm/ADT/SmallVector.h"
2425
#include "llvm/ADT/Statistic.h"
@@ -3549,13 +3550,58 @@ class TypePromotionTransaction {
35493550
LLVM_DEBUG(dbgs() << "Do: MutateType: " << *Inst << " with " << *NewTy
35503551
<< "\n");
35513552
Inst->mutateType(NewTy);
3553+
// Handle debug Info
3554+
mutateDgbInfo(Inst, NewTy);
3555+
}
3556+
3557+
void mutateDgbInfo(Instruction *I, Type *Ty) {
3558+
SmallVector<DbgVariableRecord *> Dbgs;
3559+
findDbgUsers(I, Dbgs);
3560+
for (DbgVariableRecord *Dbg : Dbgs) {
3561+
DIExpression *Expr = Dbg->getExpression();
3562+
if (!Expr)
3563+
continue;
3564+
std::optional<DIExpression::NewElementsRef> Elems =
3565+
Expr->getNewElementsRef();
3566+
if (!Elems.has_value())
3567+
continue;
3568+
// Collect arg of Inst
3569+
uint32_t Idx = 0;
3570+
SmallBitVector Idxs(Dbg->getNumVariableLocationOps());
3571+
for (auto *VMD : Dbg->location_ops()) {
3572+
if (VMD == I) {
3573+
Idxs.set(Idx);
3574+
}
3575+
Idx++;
3576+
}
3577+
// Replace types
3578+
DIExprBuilder Builder(Expr->getContext());
3579+
unsigned long ArgI = 0;
3580+
for (auto [I, Op] : enumerate(*Elems)) {
3581+
const DIOp::Arg *AsArg = std::get_if<DIOp::Arg>(&Op);
3582+
const DIOp::Convert *CvtArg = std::get_if<DIOp::Convert>(&Op);
3583+
if (AsArg && Idxs[AsArg->getIndex()]) {
3584+
ArgI = I;
3585+
Builder.append<DIOp::Arg>(AsArg->getIndex(), Ty);
3586+
if (Ty != OrigTy)
3587+
Builder.append<DIOp::Convert>(OrigTy);
3588+
} else if (!(CvtArg && I == ArgI + 1 &&
3589+
CvtArg->getResultType() == Ty)) {
3590+
Builder.append(Op);
3591+
}
3592+
I++;
3593+
}
3594+
Dbg->setExpression(Builder.intoExpression());
3595+
}
35523596
}
35533597

35543598
/// Mutate the instruction back to its original type.
35553599
void undo() override {
35563600
LLVM_DEBUG(dbgs() << "Undo: MutateType: " << *Inst << " with " << *OrigTy
35573601
<< "\n");
35583602
Inst->mutateType(OrigTy);
3603+
// Handle debug Info
3604+
mutateDgbInfo(Inst, OrigTy);
35593605
}
35603606
};
35613607

Lines changed: 50 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,50 @@
1+
; RUN: llc -stop-after=codegenprepare < %s | FileCheck %s
2+
target datalayout = "e-p:64:64-p1:64:64-p2:32:32-p3:32:32-p4:64:64-p5:32:32-p6:32:32-p7:160:256:256:32-p8:128:128:128:48-p9:192:256:256:32-i64:64-v16:16-v24:32-v32:32-v48:64-v96:128-v192:256-v256:256-v512:512-v1024:1024-v2048:2048-n32:64-S32-A5-G1-ni:7:8:9"
3+
target triple = "amdgcn-amd-amdhsa"
4+
5+
@0 = addrspace(4) constant [16 x i8] c"AAAAAAAAAAAAAAAA", align 16
6+
@1 = addrspace(1) constant [16 x i8] c"AAAAAAAAAAAAAAAA", align 16
7+
8+
define void @func1(i32 %a0, i8 %a1, ptr %a2) #0 {
9+
; CHECK: define void @func1(i32 %a0, i8 %a1, ptr %a2) #0 {
10+
; CHECK-NEXT: %promoted = zext i32 %a0 to i64
11+
; CHECK-NEXT: %vl0 = lshr i64 %promoted, 12
12+
; CHECK-NEXT: #dbg_value(!DIArgList(i32 0, i64 %vl0), !4, !DIExpression(DIOpArg(1, i64), DIOpConvert(i32), DIOpConvert(i8), DIOpFragment(24, 8)), !9)
13+
%vl0 = lshr i32 %a0, 12
14+
#dbg_value(!DIArgList(i32 0, i32 %vl0), !4, !DIExpression(DIOpArg(1, i32), DIOpConvert(i8), DIOpFragment(24, 8)), !9)
15+
%op0 = zext nneg i32 %vl0 to i64
16+
%op1 = getelementptr inbounds nuw i8, ptr addrspace(4) @0, i64 %op0
17+
%op2 = load i8, ptr addrspace(4) %op1, align 1
18+
store i8 %op2, ptr %a2, align 1
19+
ret void
20+
}
21+
22+
define void @func2(i32 %a0, i8 %a1, ptr %a2) #0 {
23+
; CHECK: define void @func2(i32 %a0, i8 %a1, ptr %a2) #0 {
24+
; CHECK-NEXT: %vl0 = lshr i32 %a0, 12
25+
; CHECK-NEXT: #dbg_value(!DIArgList(i32 0, i32 %vl0), !4, !DIExpression(DIOpArg(1, i32), DIOpConvert(i8), DIOpFragment(24, 8)), !9)
26+
%vl0 = lshr i32 %a0, 12
27+
#dbg_value(!DIArgList(i32 0, i32 %vl0), !4, !DIExpression(DIOpArg(1, i32), DIOpConvert(i8), DIOpFragment(24, 8)), !9)
28+
%op0 = zext nneg i32 %vl0 to i64
29+
%op1 = getelementptr inbounds nuw i8, ptr addrspace(1) @1, i64 %op0
30+
%op2 = load i8, ptr addrspace(1) %op1, align 1
31+
store i8 %op2, ptr %a2, align 1
32+
ret void
33+
}
34+
35+
36+
attributes #0 = { "target-cpu"="gfx1201" }
37+
38+
!llvm.dbg.cu = !{!0}
39+
!llvm.module.flags = !{!2, !3}
40+
41+
!0 = distinct !DICompileUnit(language: DW_LANG_C_plus_plus_14, file: !1, producer: "clang", isOptimized: true, runtimeVersion: 0, emissionKind: FullDebug)
42+
!1 = !DIFile(filename: "-", directory: "/")
43+
!2 = !{i32 7, !"Dwarf Version", i32 5}
44+
!3 = !{i32 2, !"Debug Info Version", i32 3}
45+
!4 = !DILocalVariable(name: "aux32", scope: !5, file: !1, line: 1757, type: !8)
46+
!5 = distinct !DISubprogram(name: "func", scope: !1, file: !1, line: 1754, type: !6, unit: !0)
47+
!6 = !DISubroutineType(types: !7)
48+
!7 = !{null}
49+
!8 = !DIBasicType(name: "unsigned int", size: 32, encoding: DW_ATE_unsigned)
50+
!9 = !DILocation(line: 0, scope: !5)

0 commit comments

Comments
 (0)