[LLVMdev] a LICM bug (in LLVM-2.7)?
Chuck Zhao
czhao at eecg.toronto.edu
Sun Aug 15 07:53:52 PDT 2010
Thank you very much, Eugene,
This explains it nicely.
Chuck
On 8/15/2010 10:36 AM, Eugene Toder wrote:
> I don't think licm looks at loads/stores to allocas -- these are
> usually handled by mem2reg which happens much earlier (if you run your
> example with -mem2reg you'll see it already deleted the store). In
> fact, licm sinks the stores by converting them to stores to allocas
> first and running mem2reg on that.
>
> If you change your example to
>
> void testLICM(int* restrict p)
> {
> int i,N=100;
> for(i=0;i<N;i++){
> *p = 1;
> printf("i: %d\n",i);
> }
> printf("data: %d\n", *p);
> }
>
> and run opt with -mem2reg -loop-rotate -licm you can see the store being sunk.
>
> Eugene
>
> On Sun, Aug 15, 2010 at 3:47 AM, Chuck Zhao<czhao at eecg.toronto.edu> wrote:
>> I am studying the Transform/Scalar/LICM.cpp pass, and wrote a simple test
>> program to validate.
>>
>> void testLICM(void){
>> int i,N=100;
>> int data;
>> for(i=0;i<N;i++){
>> data = 1;
>> printf("i: %d\n",i);
>> }
>> printf("data: %d\n", data);
>> }
>>
>>
>> I expect the "data=1" will be moved out of loop (either hoist or sink).
>> However, to my surprise, that statement remains within the loop after -licm.
>>
>> This is the licm produced IR:
>>
>> define void @testLICM() nounwind {
>> entry:
>> %i = alloca i32 ;<i32*> [#uses=3]
>> %N = alloca i32 ;<i32*> [#uses=2]
>> %data = alloca i32 ;<i32*> [#uses=2]
>> %"alloca point" = bitcast i32 0 to i32 ;<i32> [#uses=0]
>> call void @llvm.dbg.declare(metadata !{i32* %i}, metadata !0), !dbg !7
>> call void @llvm.dbg.declare(metadata !{i32* %N}, metadata !8), !dbg !7
>> call void @llvm.dbg.declare(metadata !{i32* %data}, metadata !9), !dbg !7
>> store i32 100, i32* %N, align 4, !dbg !10
>> store i32 0, i32* %i, align 4, !dbg !11
>> %0 = load i32* %N, align 4, !dbg !11 ;<i32> [#uses=1]
>> %i.promoted = load i32* %i ;<i32> [#uses=1]
>> br label %bb1, !dbg !11
>>
>> bb: ; preds = %bb1
>> store i32 1, i32* %data, align 4, !dbg !12
>> %1 = call i32 (i8*, ...)* @printf(i8* noalias getelementptr inbounds ([7 x
>> i8]* @.str, i32 0, i32 0), i32 %i.tmp.0) nounwind, !dbg !13 ;<i32>
>> [#uses=0]
>> %2 = add nsw i32 %i.tmp.0, 1, !dbg !11 ;<i32> [#uses=1]
>> br label %bb1, !dbg !11
>>
>> bb1: ; preds = %bb, %entry
>> %i.tmp.0 = phi i32 [ %i.promoted, %entry ], [ %2, %bb ] ;<i32> [#uses=4]
>> %3 = icmp slt i32 %i.tmp.0, %0, !dbg !11 ;<i1> [#uses=1]
>> br i1 %3, label %bb, label %bb2, !dbg !11
>>
>> bb2: ; preds = %bb1
>> store i32 %i.tmp.0, i32* %i
>> %4 = load i32* %data, align 4, !dbg !14 ;<i32> [#uses=1]
>> %5 = call i32 (i8*, ...)* @printf(i8* noalias getelementptr inbounds ([10
>> x i8]* @.str1, i32 0, i32 0), i32 %4) nounwind, !dbg !14 ;<i32> [#uses=0]
>> br label %return, !dbg !15
>>
>> return: ; preds = %bb2
>> ret void, !dbg !15
>> }
>>
>>
>> I ran the program with licm only option through opt:
>> opt -licm< test.bc> test.licm.bc
>>
>>
>> Is this a bug, or am I running it in a wrong way?
>>
>> Thank you
>>
>> Chuck
>>
>>
>> _______________________________________________
>> LLVM Developers mailing list
>> LLVMdev at cs.uiuc.edu http://llvm.cs.uiuc.edu
>> http://lists.cs.uiuc.edu/mailman/listinfo/llvmdev
>>
>>
More information about the llvm-dev
mailing list