Hi,
opt -O1 converts the attached test.ll to test_opt.ll.
"
opt --version
LLVM (http://llvm.org/):
LLVM version 3.8.0
DEBUG build with assertions.
Built Jun 23 2016 (18:32:09).
Default target: i686-pc-linux-gnu
Host CPU: k8-sse3
"
test.ll:
"
; ModuleID = 'test.bc'
@__mla__system.1 = global i32 0
@0 = internal global [12 x i8] zeroinitializer
@1 = internal global [8 x i8] zeroinitializer
@2 = internal constant [2 x i8] c"\0A\00"
@3 = internal constant [3 x i8] c"%u\00"
@4 = internal constant [5 x i8] c"%hhd\00"
@5 = internal constant [4 x i8] c"%hd\00"
@6 = internal constant [3 x i8] c"%d\00"
@7 = internal constant [5 x i8] c"%lld\00"
@8 = internal constant [3 x i8] c"%c\00"
@9 = internal constant [3 x i8] c"%s\00"
@10 = internal constant [3 x i8] c"%p\00"
@11 = internal constant [3 x i8] c"%e\00"
define internal [8 x i8] @12(i32, i8*) {
%3 = alloca [8 x i8], i8 1
%4 = alloca i32, i8 1
%5 = alloca i8*, i8 1
store i32 %0, i32* %4
store i8* %1, i8** %5
%6 = load i32, i32* %4
%7 = bitcast [8 x i8]* %3 to i8*
%8 = getelementptr inbounds i8, i8* %7, i8 0
%9 = bitcast i8* %8 to i32*
store i32 %6, i32* %9
%10 = load i8*, i8** %5
%11 = bitcast [8 x i8]* %3 to i8*
%12 = getelementptr inbounds i8, i8* %11, i8 4
%13 = bitcast i8* %12 to i8**
store i8* %10, i8** %13
%14 = load [8 x i8], [8 x i8]* %3
ret [8 x i8] %14
}
define i32 @main() {
%1 = bitcast i32 2 to i32
%2 = bitcast [12 x i8]* @0 to i8*
%3 = getelementptr inbounds i8, i8* %2, i8 0
%4 = call [8 x i8] @12(i32 %1, i8* %3)
[...]
"
test_opt.ll:
"
; ModuleID = 'test_opt.bc'
@__mla__system.1 = global i32 0
@0 = internal global [12 x i8] zeroinitializer
@1 = internal unnamed_addr global [8 x i8] zeroinitializer
; Function Attrs: norecurse nounwind readnone
define internal fastcc [8 x i8] @2() unnamed_addr #0 {
ret [8 x i8] [i8 2, i8 0, i8 0, i8 0, i8 undef, i8 undef, i8 undef, i8
undef]
}
; Function Attrs: norecurse nounwind
define i32 @main() #1 {
%1 = tail call fastcc [8 x i8] @2()
store [8 x i8] %1, [8 x i8]* @1, align 1
%2 = load i8*, i8** bitcast (i8* getelementptr inbounds ([8 x i8], [8 x i8]*
@1, i64 0, i64 4) to i8**), align 8
%3 = icmp eq i8* %2, getelementptr inbounds ([12 x i8], [12 x i8]* @0, i64
0, i64 0)
br i1 %3, label %5, label %4
; <label>:4 ; preds = %0
store i32 1, i32* @__mla__system.1, align 4
br label %5
; <label>:5 ; preds = %0, %4
%6 = load i32, i32* @__mla__system.1, align 4
ret i32 %6
}
attributes #0 = { norecurse nounwind readnone }
attributes #1 = { norecurse nounwind }
"
which looks incorrect to me and returns 1 instead of the expected 0 at
runtime. The testcase compiled without optimisation works as expected.
The input file has been produced with the MSElang compiler.
What is wrong?
Thanks, Martin
-------------- next part --------------
A non-text attachment was scrubbed...
Name: test.ll
Type: text/x-objcsrc
Size: 2367 bytes
Desc: not available
URL:
<http://lists.llvm.org/pipermail/llvm-dev/attachments/20160624/cd744718/attachment.bin>
-------------- next part --------------
; ModuleID = 'test_opt.bc'
@__mla__system.1 = global i32 0
@0 = internal global [12 x i8] zeroinitializer
@1 = internal unnamed_addr global [8 x i8] zeroinitializer
; Function Attrs: norecurse nounwind readnone
define internal fastcc [8 x i8] @2() unnamed_addr #0 {
ret [8 x i8] [i8 2, i8 0, i8 0, i8 0, i8 undef, i8 undef, i8 undef, i8 undef]
}
; Function Attrs: norecurse nounwind
define i32 @main() #1 {
%1 = tail call fastcc [8 x i8] @2()
store [8 x i8] %1, [8 x i8]* @1, align 1
%2 = load i8*, i8** bitcast (i8* getelementptr inbounds ([8 x i8], [8 x i8]*
@1, i64 0, i64 4) to i8**), align 8
%3 = icmp eq i8* %2, getelementptr inbounds ([12 x i8], [12 x i8]* @0, i64 0,
i64 0)
br i1 %3, label %5, label %4
; <label>:4 ; preds = %0
store i32 1, i32* @__mla__system.1, align 4
br label %5
; <label>:5 ; preds = %0, %4
%6 = load i32, i32* @__mla__system.1, align 4
ret i32 %6
}
attributes #0 = { norecurse nounwind readnone }
attributes #1 = { norecurse nounwind }