[PATCH] D33284: [CodeGen] Propagate LValueBaseInfo instead of AlignmentSource

John McCall via Phabricator via cfe-commits cfe-commits at lists.llvm.org
Wed May 17 13:21:54 PDT 2017


rjmccall added inline comments.


================
Comment at: lib/CodeGen/CGExpr.cpp:2256
             Address(CapLVal.getPointer(), getContext().getDeclAlign(VD)),
-            CapLVal.getType(), AlignmentSource::Decl);
+            CapLVal.getType(), LValueBaseInfo(AlignmentSource::Decl, MayAlias));
       }
----------------
kparzysz wrote:
> rjmccall wrote:
> > Hmm.  I think your side of this is right, but I'm not sure that the original code is correct to override with AlignmentSource::Decl, because the captured field might be a reference.  In fact, I'm not sure why this is overwriting the alignment, either; it should be able to just return the result of EmitCapturedFieldLValue, and that should be more correct for the same reason.  Do any tests break if you do that?
> There is one failure in check-clang: test/OpenMP/task_codegen.cpp.
> 
> 
> ```
> ; Function Attrs: noinline nounwind
> define internal i32 @.omp_task_entry..14(i32, %struct.kmp_task_t_with_privates.13* noalias) #1 {
> entry:
>   %.global_tid..addr.i = alloca i32, align 4
>   %.part_id..addr.i = alloca i32*, align 8
>   %.privates..addr.i = alloca i8*, align 8
>   %.copy_fn..addr.i = alloca void (i8*, ...)*, align 8
>   %.task_t..addr.i = alloca i8*, align 8
>   %__context.addr.i = alloca %struct.anon.12*, align 8
>   %.addr = alloca i32, align 4
>   %.addr1 = alloca %struct.kmp_task_t_with_privates.13*, align 8
>   store i32 %0, i32* %.addr, align 4
>   store %struct.kmp_task_t_with_privates.13* %1, %struct.kmp_task_t_with_privates.13** %.addr1, align 8
>   %2 = load i32, i32* %.addr, align 4
>   %3 = load %struct.kmp_task_t_with_privates.13*, %struct.kmp_task_t_with_privates.13** %.addr1, align 8
>   %4 = getelementptr inbounds %struct.kmp_task_t_with_privates.13, %struct.kmp_task_t_with_privates.13* %3, i32 0, i32 0
>   %5 = getelementptr inbounds %struct.kmp_task_t, %struct.kmp_task_t* %4, i32 0, i32 2
>   %6 = getelementptr inbounds %struct.kmp_task_t, %struct.kmp_task_t* %4, i32 0, i32 0
>   %7 = load i8*, i8** %6, align 8
>   %8 = bitcast i8* %7 to %struct.anon.12*
>   %9 = bitcast %struct.kmp_task_t_with_privates.13* %3 to i8*
>   store i32 %2, i32* %.global_tid..addr.i, align 4
>   store i32* %5, i32** %.part_id..addr.i, align 8
>   store i8* null, i8** %.privates..addr.i, align 8
>   store void (i8*, ...)* null, void (i8*, ...)** %.copy_fn..addr.i, align 8
>   store i8* %9, i8** %.task_t..addr.i, align 8
>   store %struct.anon.12* %8, %struct.anon.12** %__context.addr.i, align 8
>   %10 = load %struct.anon.12*, %struct.anon.12** %__context.addr.i, align 8
>   store i32 4, i32* @a, align 4
>   %11 = getelementptr inbounds %struct.anon.12, %struct.anon.12* %10, i32 0, i32 0
>   %ref.i = load i32*, i32** %11, align 8
>   store i32 5, i32* %ref.i, align 128      // XXX This alignment is 4 with that change.
>   ret i32 0
> }
> ```
> 
Ah, okay, I see what's happening here.  The field is actually *always* a reference, and and because it's just a reference the type doesn't have the declared alignment of the variable.

I think your change is probably the most reasonable approach.


Repository:
  rL LLVM

https://reviews.llvm.org/D33284





More information about the cfe-commits mailing list