[llvm-dev] If there are some passes in LLVM do the opposite of the SROA(Scalar Replacement of Aggregates) pass

Lin-Ya Yu via llvm-dev llvm-dev at lists.llvm.org
Wed Mar 6 04:13:17 PST 2019


Hi Victor and LLVM developers,

(+ Reformat the example for web browser reader

Thanks for your reply!:) reg2mem transforms values back to pointers. But I
would like to look for the pass or any functions provided in LLVM to get
the disaggregate structs back to aggregate struct. My goal is to do the
transformation to coalesce the accesses from the same struct together.

Below is an example to explain clearer what I am looking for. In the IR, I
would like to have 2 load instructions that each loads a variable in the
struct transform to one single load instruction that directly loads the
struct.

If this makes sense and anyone knows whether there is related passes or
functions exists. Thanks for helping!

-Lin-Ya

%struct.mystruct = type <{ i8, i16, i8 }>

@llvm.global_ctors = appending global [0 x { i32, void ()*, i8* }]
zeroinitializer

define i32 @_Z3accP8mystructPcPs(%struct.mystruct* noalias nonnull %input,
i8* %a, i16* noalias nonnull %b) {
entry:
  br label %for.inc

for.inc:                                          ; preds = %for.inc, %entry
  %i.03 = phi i32 [ 0, %entry ], [ %inc, %for.inc ]
  %idxprom = sext i32 %i.03 to i64
  %a11 = getelementptr inbounds %struct.mystruct, %struct.mystruct* %input,
i64 %idxprom, i32 0
  %0 = load i8, i8* %a11, align 4
  %arrayidx3 = getelementptr inbounds i8, i8* %a, i64 %idxprom
  store i8 %0, i8* %arrayidx3, align 1
  %b62 = getelementptr inbounds %struct.mystruct, %struct.mystruct* %input,
i64 %idxprom, i32 1
  %1 = load i16, i16* %b62, align 1
  %arrayidx8 = getelementptr inbounds i16, i16* %b, i64 %idxprom
  store i16 %1, i16* %arrayidx8, align 2
  %inc = add nsw i32 %i.03, 1
  %cmp = icmp slt i32 %inc, 10
  br i1 %cmp, label %for.inc, label %for.end

for.end:                                          ; preds = %for.inc
  ret i32 0
}


Lin-Ya Yu <yu810226 at gmail.com> 於 2019年3月6日 週三 下午12:06寫道:

> Hi Victor and LLVM developers,
>
> Thanks for your reply!:) reg2mem transforms values back to pointers. But I
> would like to look for the pass or any functions provided in LLVM to get
> the disaggregate structs back to aggregate struct. My goal is to do the
> transformation to coalesce the accesses from the same struct together.
>
> Below is an example to explain clearer what I am looking for. In the IR, I
> would like to have 2 load instructions that each loads a variable in the
> struct transform to one single load instruction that directly loads the
> struct.
>
> If this makes sense and anyone knows whether there is related passes or
> functions exists. Thanks for helping!
>
> -Lin-Ya
>
> Exported from Notepad++
> %struct.mystruct = type <{ i8, i16, i8 }> @llvm.global_ctors = appending
> global [0 x { i32, void ()*, i8* }] zeroinitializer define i32
> @_Z3accP8mystructPcPs(%struct.mystruct* noalias nonnull %input, i8*
> noalias nonnull %a, i16* noalias nonnull %b) { entry: br label %for.inc
> for.inc: ; preds = %for.inc, %entry %i.03 = phi i32 [ 0, %entry ], [ %inc,
> %for.inc ] %idxprom = sext i32 %i.03 to i64 %a11 = getelementptr inbounds
> %struct.mystruct, %struct.mystruct* %input, i64 %idxprom, i32 0 %0 = load
> i8, i8* %a11, align 4 %arrayidx3 = getelementptr inbounds i8, i8* %a, i64
> %idxprom store i8 %0, i8* %arrayidx3, align 1 %b62 = getelementptr
> inbounds %struct.mystruct, %struct.mystruct* %input, i64 %idxprom, i32 1
> %1 = load i16, i16* %b62, align 1 %arrayidx8 = getelementptr inbounds i16,
> i16* %b, i64 %idxprom store i16 %1, i16* %arrayidx8, align 2 %inc = add
> nsw i32 %i.03, 1 %cmp = icmp slt i32 %inc, 10 br i1 %cmp, label %for.inc,
> label %for.end for.end: ; preds = %for.inc ret i32 0 }
>
>
>
>
>
>
>
>
>
>
>

-- 
From: yu810226 at gmail.com
于琳雅
Mobile Pone: 0926239522
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/llvm-dev/attachments/20190306/bb71487d/attachment-0001.html>


More information about the llvm-dev mailing list