[PATCH] D47423: Simplify recursive launder.invariant.group and strip
Piotr Padlewski via Phabricator via llvm-commits
llvm-commits at lists.llvm.org
Tue Jul 10 17:32:02 PDT 2018
Prazek added inline comments.
================
Comment at: llvm/lib/Transforms/InstCombine/InstCombineCalls.cpp:1294-1295
+ "simplifyInvariantGroupIntrinsic only handles launder and strip");
+ if (Result->getType()->getPointerAddressSpace() !=
+ II.getType()->getPointerAddressSpace())
+ Result = IC.Builder.CreateAddrSpaceCast(Result, II.getType());
----------------
rsmith wrote:
> Prazek wrote:
> > rsmith wrote:
> > > I think this is still not right from the `bitcast` / `addrspacecast` perspective: if we previously had a `bitcast` from one address space to another, this will convert it into an `addrspacecast`, which may mean something else. As a pathological example, if we had:
> > >
> > > ```
> > > %a = call launder(...) ; i8 addrspace(0)*
> > > %b = bitcast %a to i8 addrspace(1)*
> > > %c = addrspacecast %b to i8 addrspace(2)*
> > > %d = bitcast %c to i8 addrspacecast(3)*
> > > %e = call launder(%d)
> > > ```
> > >
> > > ... then you need to rebuild an addrspacecast from address space 1 to address space 2, even though your source is in address space 0 and your destination is in address space 3. (And in general, you may need to rebuild more than one address space cast.)
> > AFAIK the addrspace casts are just like bitcasts, so code like this:
> > define i8 addrspace(3)* @foo(i8* %a) {
> >
> > %b = addrspacecast i8* %a to i8 addrspace(1)*
> > %c = addrspacecast i8 addrspace(1)* %b to i8 addrspace(2)*
> > %d = addrspacecast i8 addrspace(2)* %c to i8 addrspace(3)*
> >
> > ret i8 addrspace(3)* %d
> > }
> > Is optimized by opt to:
> > define i8 addrspace(3)* @foo(i8* readnone %a) local_unnamed_addr #0 {
> > %d = addrspacecast i8* %a to i8 addrspace(3)*
> > ret i8 addrspace(3)* %d
> > }
> >
> > I didn't use bitcasts because if I am not wrong, you cant cast between addrspace with bitcast. Do you think that with this assumption the transformation is correct?
> >
> >
> I can't find any restriction that would prevent bitcasting between pointers to different address spaces; the only restriction on pointer `bitcast` I can find in the LangRef is that the source and destination pointer types be the same size. In practice, LLVM appears to produce inttoptr(ptrtoint(p)) instead of a cross-address-space bitcast, though, so maybe it's not actually permitted.
>
> Feedback from someone who knows the IR rules better than I do would be useful :)
I tried the bitcasting that you showed and it failed like:
opt-5.0: test.ll:3:18: error: invalid cast opcode for cast from 'i8*' to 'i8 addrspace(1)*'
So I guess the LangRef should be more precise about it.
But anyway, Even if it would be ok, it does not change anything - we can still get rid of the bitcasts/addrspacecasts when going throught multiple conversions.
Repository:
rL LLVM
https://reviews.llvm.org/D47423
More information about the llvm-commits
mailing list