This patch fixes PR37526 by simplifying the newly generated LoadInst
instructions. If the pointer address is a bitcast from the pointer to
the NewType, we can just remove this extra bitcast instead of creating
the new one. This fixes the PR37526 + may speed up the whole compilation
process.
Details
Details
Diff Detail
Diff Detail
- Repository
- rL LLVM
- Build Status
Buildable 18417 Build 18417: arc lint + arc unit
Event Timeline
| lib/Transforms/InstCombine/InstCombineLoadStoreAlloca.cpp | ||
|---|---|---|
| 467 | NewPtr = Op0 ? | |
| lib/Transforms/InstCombine/InstCombineLoadStoreAlloca.cpp | ||
|---|---|---|
| 462–467 | Use a matcher to simplify this? Value *NewPtr;
if (!(match(Ptr, m_BitCast(m_Value(NewPtr))) &&
NewPtr->getType()->getPointerElementType() == NewTy &&
NewPtr->getType()->getPointerAddressSpace() == AS))
NewPtr = IC.Builder.CreateBitCast(Ptr, NewTy->getPointerTo(AS)); | |
| test/Transforms/InstCombine/PR37526.ll | ||
| 5–7 | We shouldn't need a struct or loop to repro - something like this should be ok? define void @PR37526(i32* %pz, i32* %px, i32* %py) {
%t1 = bitcast i32* %pz to i64*
%t2 = load i32, i32* %py
%t3 = load i32, i32* %px
%cmp = icmp slt i32 %t2, %t3
%select = select i1 %cmp, i32* %px, i32* %py
%bc = bitcast i32* %select to i64*
%r = load i64, i64* %bc
store i64 %r, i64* %t1
ret void
} | |
NewPtr = Op0 ?