Chris Lattner
2008-Jan-22 17:53 UTC
[LLVMdev] [llvm-commits] a question about type conversion propagation and elimination
On Jan 22, 2008, at 2:10 AM, humeafo wrote:> I am a newbie to LLVM, so I have to say sorry if I asked the > question in the wrong place. > In some cases when I generate LLVM IR from machine assembly(with > limited type information) I have to convert the pointers to I32, > after the standard mem2reg pass there still are things like: > > inttoptr i32 %1 to i8* > > While in fact this can be replaced by the I8* operations, because > the I8* can be unsigned compared, and get rid of the redundant > Instrs, Is there any pass > can do this, or is there any tricks to avoid these redundant > conversions while retain the meaning of the program?Sure, the instcombine pass will do this. Make sure to add the correct target data string though. For example, if I add the datalayout string for x86-32 darwin: target datalayout = "e-p:32:32:32-i1:8:8-i8:8:8-i16:16:16-i32:32:32- i64:32:64-f32:32:32-f64:32:64-v64:64:64-v128:128:128-a0:0:64- f80:128:128" Instcombine produces: define i8* @tag_on(i8* %ptr, i8* %end, i8 %tag) { Entry: icmp ugt i8* %end, %ptr ; <i1>:0 [#uses=1] br i1 %0, label %B1, label %B2 B1: ; preds = %Entry store i8 1, i8* %ptr %ctg2 = getelementptr i8* %ptr, i32 1 ; <i8*> [#uses=1] br label %B2 B2: ; preds = %B1, %Entry %eax.0.in = phi i8* [ %ctg2, %B1 ], [ %ptr, %Entry ] ; <i8*> [#uses=4] icmp ult i8* %eax.0.in, %end ; <i1>:1 [#uses=1] br i1 %1, label %B3, label %exit B3: ; preds = %B2 store i8 1, i8* %eax.0.in %ctg21 = getelementptr i8* %eax.0.in, i32 1 ; <i8*> [#uses=1] br label %exit exit: ; preds = %B3, %B2 %eax.1.in = phi i8* [ %ctg21, %B3 ], [ %eax.0.in, %B2 ] ; <i8*> [#uses=1] ret i8* %eax.1.in } Note that it eliminated all the ptrtoint casts (in this case) and infered some getelementptrs. I'm sending this to the llvmdev list, which is a better place for high- level questions than llvm-commits. -Chris> > define i8* @tag_on(i8* %ptr, i8* %end, i8 %tag) { > Entry: > ptrtoint i8* %end to i32 ; <i32>:0 [#uses=2] > ptrtoint i8* %ptr to i32 ; <i32>:1 [#uses=4] > icmp ugt i32 %0, %1 ; <i1>:2 [#uses=1] > br i1 %2, label %B1, label %B2 > > B1: ; preds = %Entry > inttoptr i32 %1 to i8* ; <i8*>:3 [#uses=1] > store i8 1, i8* %3 > add i32 %1, 1 ; <i32>:4 [#uses=1] > br label %B2 > > B2: ; preds = %Entry, %B1 > %eax.0 = phi i32 [ %4, %B1 ], [ %1, %Entry ] ; > <i32> [#uses=4] > icmp ugt i32 %0, %eax.0 ; <i1>:5 [#uses=1] > br i1 %5, label %B3, label %exit > > B3: ; preds = %B2 > inttoptr i32 %eax.0 to i8* ; <i8*>:6 [#uses=1] > store i8 1, i8* %6 > add i32 %eax.0, 1 ; <i32>:7 [#uses=1] > br label %exit > > exit: ; preds = %B2, %B3 > %eax.1 = phi i32 [ %7, %B3 ], [ %eax.0, %B2 ] ; > <i32> [#uses=1] > inttoptr i32 %eax.1 to i8* ; <i8*>:8 [#uses=1] > ret i8* %8 > } > > humeafo > 2008-01-22 > _______________________________________________ > llvm-commits mailing list > llvm-commits at cs.uiuc.edu > http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits-------------- next part -------------- An HTML attachment was scrubbed... URL: <http://lists.llvm.org/pipermail/llvm-dev/attachments/20080122/eb6ca4b1/attachment.html>
Reasonably Related Threads
- [LLVMdev] va_arg
- No RID Set found for this server. Can't self-allocate
- [LLVMdev] codegen of volatile aggregate copies (was "Weird volatile propagation" on llvm-dev)
- [LLVMdev] Weird volatile propagation ?
- [LLVMdev] Live code elimination problem in code generation