mirror of
https://github.com/RPCS3/llvm.git
synced 2024-11-28 06:00:30 +00:00
3 more bugs from the SPEC codes and from richards_benchmark.c
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@6458 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
parent
b17343d81e
commit
162421522b
156
test/CodeGen/Generic/2003-05-28-ManyArgs.ll
Normal file
156
test/CodeGen/Generic/2003-05-28-ManyArgs.ll
Normal file
@ -0,0 +1,156 @@
|
||||
;; Date: May 28, 2003.
|
||||
;; From: test/Programs/External/SPEC/CINT2000/175.vpr.llvm.bc
|
||||
;; Function: int %main(int %argc.1, sbyte** %argv.1)
|
||||
;;
|
||||
;; Error: A function call with about 56 arguments causes an assertion failure
|
||||
;; in llc because the register allocator cannot find a register
|
||||
;; not used explicitly by the call instruction.
|
||||
;;
|
||||
;; Cause: Regalloc was not keeping track of free registers correctly.
|
||||
;; It was counting the registers allocated to all outgoing arguments,
|
||||
;; even though most of those are copied to the stack (so those
|
||||
;; registers are not actually used by the call instruction).
|
||||
;;
|
||||
;; Fixed: By rewriting selection and allocation so that selection explicitly
|
||||
;; inserts all copy operations required for passing arguments and
|
||||
;; for the return value of a call, copying to/from registers
|
||||
;; and/or to stack locations as needed.
|
||||
;;
|
||||
|
||||
target endian = little
|
||||
target pointersize = 32
|
||||
%struct..s_annealing_sched = type { uint, float, float, float, float }
|
||||
%struct..s_chan = type { uint, float, float, float, float }
|
||||
%struct..s_det_routing_arch = type { uint, float, float, float, uint, int, short, short, short, float, float }
|
||||
%struct..s_placer_opts = type { int, float, int, uint, sbyte*, uint, int }
|
||||
%struct..s_router_opts = type { float, float, float, float, float, int, int, uint, int }
|
||||
%struct..s_segment_inf = type { float, int, short, short, float, float, uint, float, float }
|
||||
%struct..s_switch_inf = type { uint, float, float, float, float }
|
||||
|
||||
implementation
|
||||
|
||||
int %main(int %argc.1, sbyte** %argv.1) {
|
||||
entry:
|
||||
%net_file = alloca [300 x sbyte]
|
||||
%place_file = alloca [300 x sbyte]
|
||||
%arch_file = alloca [300 x sbyte]
|
||||
%route_file = alloca [300 x sbyte]
|
||||
%full_stats = alloca uint
|
||||
%operation = alloca int
|
||||
%verify_binary_search = alloca uint
|
||||
%show_graphics = alloca uint
|
||||
%annealing_sched = alloca %struct..s_annealing_sched
|
||||
%placer_opts = alloca %struct..s_placer_opts
|
||||
%router_opts = alloca %struct..s_router_opts
|
||||
%det_routing_arch = alloca %struct..s_det_routing_arch
|
||||
%segment_inf = alloca %struct..s_segment_inf*
|
||||
%timing_inf = alloca { uint, float, float, float, float, float, float, float, float, float, float }
|
||||
%tmp.101 = getelementptr %struct..s_placer_opts* %placer_opts, long 0, ubyte 4
|
||||
%tmp.105 = getelementptr [300 x sbyte]* %net_file, long 0, long 0
|
||||
%tmp.106 = getelementptr [300 x sbyte]* %arch_file, long 0, long 0
|
||||
%tmp.107 = getelementptr [300 x sbyte]* %place_file, long 0, long 0
|
||||
%tmp.108 = getelementptr [300 x sbyte]* %route_file, long 0, long 0
|
||||
%tmp.109 = getelementptr { uint, float, float, float, float, float, float, float, float, float, float }* %timing_inf, long 0, ubyte 0
|
||||
%tmp.112 = getelementptr %struct..s_placer_opts* %placer_opts, long 0, ubyte 0
|
||||
%tmp.114 = getelementptr %struct..s_placer_opts* %placer_opts, long 0, ubyte 6
|
||||
%tmp.118 = getelementptr %struct..s_router_opts* %router_opts, long 0, ubyte 7
|
||||
%tmp.135 = load int* %operation
|
||||
%tmp.137 = load int* %tmp.112
|
||||
%tmp.138 = getelementptr %struct..s_placer_opts* %placer_opts, long 0, ubyte 1
|
||||
%tmp.139 = load float* %tmp.138
|
||||
%tmp.140 = getelementptr %struct..s_placer_opts* %placer_opts, long 0, ubyte 2
|
||||
%tmp.141 = load int* %tmp.140
|
||||
%tmp.142 = getelementptr %struct..s_placer_opts* %placer_opts, long 0, ubyte 3
|
||||
%tmp.143 = load uint* %tmp.142
|
||||
%tmp.145 = load sbyte** %tmp.101
|
||||
%tmp.146 = getelementptr %struct..s_placer_opts* %placer_opts, long 0, ubyte 5
|
||||
%tmp.147 = load uint* %tmp.146
|
||||
%tmp.149 = load int* %tmp.114
|
||||
%tmp.154 = load uint* %full_stats
|
||||
%tmp.155 = load uint* %verify_binary_search
|
||||
%tmp.156 = getelementptr %struct..s_annealing_sched* %annealing_sched, long 0, ubyte 0
|
||||
%tmp.157 = load uint* %tmp.156
|
||||
%tmp.158 = getelementptr %struct..s_annealing_sched* %annealing_sched, long 0, ubyte 1
|
||||
%tmp.159 = load float* %tmp.158
|
||||
%tmp.160 = getelementptr %struct..s_annealing_sched* %annealing_sched, long 0, ubyte 2
|
||||
%tmp.161 = load float* %tmp.160
|
||||
%tmp.162 = getelementptr %struct..s_annealing_sched* %annealing_sched, long 0, ubyte 3
|
||||
%tmp.163 = load float* %tmp.162
|
||||
%tmp.164 = getelementptr %struct..s_annealing_sched* %annealing_sched, long 0, ubyte 4
|
||||
%tmp.165 = load float* %tmp.164
|
||||
%tmp.166 = getelementptr %struct..s_router_opts* %router_opts, long 0, ubyte 0
|
||||
%tmp.167 = load float* %tmp.166
|
||||
%tmp.168 = getelementptr %struct..s_router_opts* %router_opts, long 0, ubyte 1
|
||||
%tmp.169 = load float* %tmp.168
|
||||
%tmp.170 = getelementptr %struct..s_router_opts* %router_opts, long 0, ubyte 2
|
||||
%tmp.171 = load float* %tmp.170
|
||||
%tmp.172 = getelementptr %struct..s_router_opts* %router_opts, long 0, ubyte 3
|
||||
%tmp.173 = load float* %tmp.172
|
||||
%tmp.174 = getelementptr %struct..s_router_opts* %router_opts, long 0, ubyte 4
|
||||
%tmp.175 = load float* %tmp.174
|
||||
%tmp.176 = getelementptr %struct..s_router_opts* %router_opts, long 0, ubyte 5
|
||||
%tmp.177 = load int* %tmp.176
|
||||
%tmp.178 = getelementptr %struct..s_router_opts* %router_opts, long 0, ubyte 6
|
||||
%tmp.179 = load int* %tmp.178
|
||||
%tmp.181 = load uint* %tmp.118
|
||||
%tmp.182 = getelementptr %struct..s_router_opts* %router_opts, long 0, ubyte 8
|
||||
%tmp.183 = load int* %tmp.182
|
||||
%tmp.184 = getelementptr %struct..s_det_routing_arch* %det_routing_arch, long 0, ubyte 0
|
||||
%tmp.185 = load uint* %tmp.184
|
||||
%tmp.186 = getelementptr %struct..s_det_routing_arch* %det_routing_arch, long 0, ubyte 1
|
||||
%tmp.187 = load float* %tmp.186
|
||||
%tmp.188 = getelementptr %struct..s_det_routing_arch* %det_routing_arch, long 0, ubyte 2
|
||||
%tmp.189 = load float* %tmp.188
|
||||
%tmp.190 = getelementptr %struct..s_det_routing_arch* %det_routing_arch, long 0, ubyte 3
|
||||
%tmp.191 = load float* %tmp.190
|
||||
%tmp.192 = getelementptr %struct..s_det_routing_arch* %det_routing_arch, long 0, ubyte 4
|
||||
%tmp.193 = load uint* %tmp.192
|
||||
%tmp.194 = getelementptr %struct..s_det_routing_arch* %det_routing_arch, long 0, ubyte 5
|
||||
%tmp.195 = load int* %tmp.194
|
||||
%tmp.196 = getelementptr %struct..s_det_routing_arch* %det_routing_arch, long 0, ubyte 6
|
||||
%tmp.197 = load short* %tmp.196
|
||||
%tmp.198 = getelementptr %struct..s_det_routing_arch* %det_routing_arch, long 0, ubyte 7
|
||||
%tmp.199 = load short* %tmp.198
|
||||
%tmp.200 = getelementptr %struct..s_det_routing_arch* %det_routing_arch, long 0, ubyte 8
|
||||
%tmp.201 = load short* %tmp.200
|
||||
%tmp.202 = getelementptr %struct..s_det_routing_arch* %det_routing_arch, long 0, ubyte 9
|
||||
%tmp.203 = load float* %tmp.202
|
||||
%tmp.204 = getelementptr %struct..s_det_routing_arch* %det_routing_arch, long 0, ubyte 10
|
||||
%tmp.205 = load float* %tmp.204
|
||||
%tmp.206 = load %struct..s_segment_inf** %segment_inf
|
||||
%tmp.208 = load uint* %tmp.109
|
||||
%tmp.209 = getelementptr { uint, float, float, float, float, float, float, float, float, float, float }* %timing_inf, long 0, ubyte 1
|
||||
%tmp.210 = load float* %tmp.209
|
||||
%tmp.211 = getelementptr { uint, float, float, float, float, float, float, float, float, float, float }* %timing_inf, long 0, ubyte 2
|
||||
%tmp.212 = load float* %tmp.211
|
||||
%tmp.213 = getelementptr { uint, float, float, float, float, float, float, float, float, float, float }* %timing_inf, long 0, ubyte 3
|
||||
%tmp.214 = load float* %tmp.213
|
||||
%tmp.215 = getelementptr { uint, float, float, float, float, float, float, float, float, float, float }* %timing_inf, long 0, ubyte 4
|
||||
%tmp.216 = load float* %tmp.215
|
||||
%tmp.217 = getelementptr { uint, float, float, float, float, float, float, float, float, float, float }* %timing_inf, long 0, ubyte 5
|
||||
%tmp.218 = load float* %tmp.217
|
||||
%tmp.219 = getelementptr { uint, float, float, float, float, float, float, float, float, float, float }* %timing_inf, long 0, ubyte 6
|
||||
%tmp.220 = load float* %tmp.219
|
||||
%tmp.221 = getelementptr { uint, float, float, float, float, float, float, float, float, float, float }* %timing_inf, long 0, ubyte 7
|
||||
%tmp.222 = load float* %tmp.221
|
||||
%tmp.223 = getelementptr { uint, float, float, float, float, float, float, float, float, float, float }* %timing_inf, long 0, ubyte 8
|
||||
%tmp.224 = load float* %tmp.223
|
||||
%tmp.225 = getelementptr { uint, float, float, float, float, float, float, float, float, float, float }* %timing_inf, long 0, ubyte 9
|
||||
%tmp.226 = load float* %tmp.225
|
||||
%tmp.227 = getelementptr { uint, float, float, float, float, float, float, float, float, float, float }* %timing_inf, long 0, ubyte 10
|
||||
%tmp.228 = load float* %tmp.227
|
||||
call void %place_and_route( int %tmp.135, int %tmp.137, float %tmp.139, int %tmp.141, uint %tmp.143, sbyte* %tmp.145, uint %tmp.147, int %tmp.149, sbyte* %tmp.107, sbyte* %tmp.105, sbyte* %tmp.106, sbyte* %tmp.108, uint %tmp.154, uint %tmp.155, uint %tmp.157, float %tmp.159, float %tmp.161, float %tmp.163, float %tmp.165, float %tmp.167, float %tmp.169, float %tmp.171, float %tmp.173, float %tmp.175, int %tmp.177, int %tmp.179, uint %tmp.181, int %tmp.183, uint %tmp.185, float %tmp.187, float %tmp.189, float %tmp.191, uint %tmp.193, int %tmp.195, short %tmp.197, short %tmp.199, short %tmp.201, float %tmp.203, float %tmp.205, %struct..s_segment_inf* %tmp.206, uint %tmp.208, float %tmp.210, float %tmp.212, float %tmp.214, float %tmp.216, float %tmp.218, float %tmp.220, float %tmp.222, float %tmp.224, float %tmp.226, float %tmp.228 )
|
||||
%tmp.231 = load uint* %show_graphics
|
||||
%tmp.232 = setne uint %tmp.231, 0
|
||||
br bool %tmp.232, label %then.2, label %endif.2
|
||||
|
||||
then.2:
|
||||
br label %endif.2
|
||||
|
||||
endif.2:
|
||||
ret int 0
|
||||
}
|
||||
|
||||
declare int %printf(sbyte*, ...)
|
||||
|
||||
declare void %place_and_route(int, int, float, int, uint, sbyte*, uint, int, sbyte*, sbyte*, sbyte*, sbyte*, uint, uint, uint, float, float, float, float, float, float, float, float, float, int, int, uint, int, uint, float, float, float, uint, int, short, short, short, float, float, %struct..s_segment_inf*, uint, float, float, float, float, float, float, float, float, float, float)
|
48
test/CodeGen/Generic/2003-05-30-BadFoldGEP.ll
Normal file
48
test/CodeGen/Generic/2003-05-30-BadFoldGEP.ll
Normal file
@ -0,0 +1,48 @@
|
||||
;; Date: May 28, 2003.
|
||||
;; From: test/Programs/External/SPEC/CINT2000/254.gap.llvm.bc
|
||||
;; Function: int %OpenOutput(sbyte* %filename.1)
|
||||
;;
|
||||
;; Error: A sequence of GEPs is folded incorrectly by llc during selection
|
||||
;; causing an assertion about a dynamic casting error.
|
||||
;; This code sequence was produced (correctly) by preselection
|
||||
;; from a nested pair of ConstantExpr getelementptrs.
|
||||
;; The code below is the output of preselection.
|
||||
;; The original ConstantExprs are included in a comment.
|
||||
;;
|
||||
;; Cause: FoldGetElemChain() was inserting an extra leading 0 even though
|
||||
;; the first instruction in the sequence contributes no indices.
|
||||
;; The next instruction contributes a leading non-zero so another
|
||||
;; zero should not be added before it!
|
||||
;;
|
||||
|
||||
|
||||
%FileType = type { int, [256 x sbyte], int, int, int, int }
|
||||
%OutputFiles = uninitialized global [16 x %FileType]
|
||||
%Output = internal global %FileType* null
|
||||
|
||||
|
||||
implementation; Functions:
|
||||
|
||||
internal int %OpenOutput(sbyte* %filename.1) {
|
||||
entry:
|
||||
%tmp.0 = load %FileType** %Output
|
||||
%tmp.4 = getelementptr %FileType* %tmp.0, long 1
|
||||
|
||||
;;------ Original instruction in 254.gap.llvm.bc:
|
||||
;; %tmp.10 = seteq { int, [256 x sbyte], int, int, int, int }* %tmp.4, getelementptr ([16 x { int, [256 x sbyte], int, int, int, int }]* getelementptr ([16 x { int, [256 x sbyte], int, int, int, int }]* %OutputFiles, long 1), long 0, long 0)
|
||||
|
||||
;;------ Code sequence produced by preselection phase for above instr:
|
||||
;; This code sequence is folded incorrectly by llc during selection
|
||||
;; causing an assertion about a dynamic casting error.
|
||||
%addrOfGlobal = getelementptr [16 x %FileType]* %OutputFiles, long 0
|
||||
%constantGEP = getelementptr [16 x %FileType]* %addrOfGlobal, long 1
|
||||
%constantGEP = getelementptr [16 x %FileType]* %constantGEP, long 0, long 0
|
||||
%tmp.10 = seteq %FileType* %tmp.4, %constantGEP
|
||||
br bool %tmp.10, label %return, label %endif.0
|
||||
|
||||
endif.0:
|
||||
ret int 0
|
||||
|
||||
return:
|
||||
ret int 1
|
||||
}
|
58
test/CodeGen/Generic/2003-05-30-BadPreselectPhi.ll
Normal file
58
test/CodeGen/Generic/2003-05-30-BadPreselectPhi.ll
Normal file
@ -0,0 +1,58 @@
|
||||
;; Date: May 28, 2003.
|
||||
;; From: test/Programs/SingleSource/richards_benchmark.c
|
||||
;; Function: struct task *handlerfn(struct packet *pkt)
|
||||
;;
|
||||
;; Error: PreSelection puts the arguments of the Phi just before
|
||||
;; the Phi instead of in predecessor blocks. This later
|
||||
;; causes llc to produces an invalid register <NULL VALUE>
|
||||
;; for the phi arguments.
|
||||
;;
|
||||
;; PreSelection Output:
|
||||
;; *** LLVM code after pre-selection for function handlerfn:
|
||||
;;
|
||||
;;
|
||||
;; %struct..task* %handlerfn(%struct..packet*) {
|
||||
;; ; <label>:0 ; No predecessors!
|
||||
;; setne %struct..packet* %0, null ; <bool>:0 [#uses=1]
|
||||
;; br bool %0, label %1, label %2
|
||||
;;
|
||||
;; ; <label>:1 ; preds = %0
|
||||
;; br label %2
|
||||
;;
|
||||
;; ; <label>:2 ; preds = %0, %1
|
||||
;; %addrOfGlobal = getelementptr int* %v2, long 0 ; <int*> [#uses=1]
|
||||
;; %addrOfGlobal1 = getelementptr int* %v1, long 0 ; <int*> [#uses=1]
|
||||
;; phi int* [ %addrOfGlobal, %1 ], [ %addrOfGlobal1, %0 ] ; <int*>:0 [#uses=1]
|
||||
;; cast int* %0 to %struct..packet* ; <%struct..packet*>:1 [#uses=1]
|
||||
;; call void %append( %struct..packet* %0, %struct..packet* %1 )
|
||||
;; ret %struct..task* null
|
||||
;; }
|
||||
;; llc: ../../../include/llvm/CodeGen/MachineInstr.h:294: int MachineOperand::getAllocatedRegNum() const: Assertion `hasAllocatedReg()' failed.
|
||||
;;
|
||||
|
||||
|
||||
target endian = little
|
||||
target pointersize = 32
|
||||
%struct..packet = type { %struct..packet*, int, int, int, [4 x sbyte] }
|
||||
%struct..task = type { %struct..task*, int, int, %struct..packet*, int, %struct..task* (%struct..packet*)*, int, int }
|
||||
%v1 = external global int
|
||||
%v2 = external global int
|
||||
|
||||
implementation ; Functions:
|
||||
|
||||
%struct..task* %handlerfn(%struct..packet* %pkt.2) {
|
||||
entry: ; No predecessors!
|
||||
%tmp.1 = setne %struct..packet* %pkt.2, null
|
||||
br bool %tmp.1, label %cond_false, label %cond_continue
|
||||
|
||||
cond_false: ; preds = %entry
|
||||
br label %cond_continue
|
||||
|
||||
cond_continue: ; preds = %entry, %cond_false
|
||||
%mem_tmp.0 = phi int* [ %v2, %cond_false ], [ %v1, %entry ]
|
||||
%tmp.12 = cast int* %mem_tmp.0 to %struct..packet*
|
||||
call void %append( %struct..packet* %pkt.2, %struct..packet* %tmp.12 )
|
||||
ret %struct..task* null
|
||||
}
|
||||
|
||||
declare void %append(%struct..packet*, %struct..packet*)
|
156
test/LLC/2003-05-28-ManyArgs.ll
Normal file
156
test/LLC/2003-05-28-ManyArgs.ll
Normal file
@ -0,0 +1,156 @@
|
||||
;; Date: May 28, 2003.
|
||||
;; From: test/Programs/External/SPEC/CINT2000/175.vpr.llvm.bc
|
||||
;; Function: int %main(int %argc.1, sbyte** %argv.1)
|
||||
;;
|
||||
;; Error: A function call with about 56 arguments causes an assertion failure
|
||||
;; in llc because the register allocator cannot find a register
|
||||
;; not used explicitly by the call instruction.
|
||||
;;
|
||||
;; Cause: Regalloc was not keeping track of free registers correctly.
|
||||
;; It was counting the registers allocated to all outgoing arguments,
|
||||
;; even though most of those are copied to the stack (so those
|
||||
;; registers are not actually used by the call instruction).
|
||||
;;
|
||||
;; Fixed: By rewriting selection and allocation so that selection explicitly
|
||||
;; inserts all copy operations required for passing arguments and
|
||||
;; for the return value of a call, copying to/from registers
|
||||
;; and/or to stack locations as needed.
|
||||
;;
|
||||
|
||||
target endian = little
|
||||
target pointersize = 32
|
||||
%struct..s_annealing_sched = type { uint, float, float, float, float }
|
||||
%struct..s_chan = type { uint, float, float, float, float }
|
||||
%struct..s_det_routing_arch = type { uint, float, float, float, uint, int, short, short, short, float, float }
|
||||
%struct..s_placer_opts = type { int, float, int, uint, sbyte*, uint, int }
|
||||
%struct..s_router_opts = type { float, float, float, float, float, int, int, uint, int }
|
||||
%struct..s_segment_inf = type { float, int, short, short, float, float, uint, float, float }
|
||||
%struct..s_switch_inf = type { uint, float, float, float, float }
|
||||
|
||||
implementation
|
||||
|
||||
int %main(int %argc.1, sbyte** %argv.1) {
|
||||
entry:
|
||||
%net_file = alloca [300 x sbyte]
|
||||
%place_file = alloca [300 x sbyte]
|
||||
%arch_file = alloca [300 x sbyte]
|
||||
%route_file = alloca [300 x sbyte]
|
||||
%full_stats = alloca uint
|
||||
%operation = alloca int
|
||||
%verify_binary_search = alloca uint
|
||||
%show_graphics = alloca uint
|
||||
%annealing_sched = alloca %struct..s_annealing_sched
|
||||
%placer_opts = alloca %struct..s_placer_opts
|
||||
%router_opts = alloca %struct..s_router_opts
|
||||
%det_routing_arch = alloca %struct..s_det_routing_arch
|
||||
%segment_inf = alloca %struct..s_segment_inf*
|
||||
%timing_inf = alloca { uint, float, float, float, float, float, float, float, float, float, float }
|
||||
%tmp.101 = getelementptr %struct..s_placer_opts* %placer_opts, long 0, ubyte 4
|
||||
%tmp.105 = getelementptr [300 x sbyte]* %net_file, long 0, long 0
|
||||
%tmp.106 = getelementptr [300 x sbyte]* %arch_file, long 0, long 0
|
||||
%tmp.107 = getelementptr [300 x sbyte]* %place_file, long 0, long 0
|
||||
%tmp.108 = getelementptr [300 x sbyte]* %route_file, long 0, long 0
|
||||
%tmp.109 = getelementptr { uint, float, float, float, float, float, float, float, float, float, float }* %timing_inf, long 0, ubyte 0
|
||||
%tmp.112 = getelementptr %struct..s_placer_opts* %placer_opts, long 0, ubyte 0
|
||||
%tmp.114 = getelementptr %struct..s_placer_opts* %placer_opts, long 0, ubyte 6
|
||||
%tmp.118 = getelementptr %struct..s_router_opts* %router_opts, long 0, ubyte 7
|
||||
%tmp.135 = load int* %operation
|
||||
%tmp.137 = load int* %tmp.112
|
||||
%tmp.138 = getelementptr %struct..s_placer_opts* %placer_opts, long 0, ubyte 1
|
||||
%tmp.139 = load float* %tmp.138
|
||||
%tmp.140 = getelementptr %struct..s_placer_opts* %placer_opts, long 0, ubyte 2
|
||||
%tmp.141 = load int* %tmp.140
|
||||
%tmp.142 = getelementptr %struct..s_placer_opts* %placer_opts, long 0, ubyte 3
|
||||
%tmp.143 = load uint* %tmp.142
|
||||
%tmp.145 = load sbyte** %tmp.101
|
||||
%tmp.146 = getelementptr %struct..s_placer_opts* %placer_opts, long 0, ubyte 5
|
||||
%tmp.147 = load uint* %tmp.146
|
||||
%tmp.149 = load int* %tmp.114
|
||||
%tmp.154 = load uint* %full_stats
|
||||
%tmp.155 = load uint* %verify_binary_search
|
||||
%tmp.156 = getelementptr %struct..s_annealing_sched* %annealing_sched, long 0, ubyte 0
|
||||
%tmp.157 = load uint* %tmp.156
|
||||
%tmp.158 = getelementptr %struct..s_annealing_sched* %annealing_sched, long 0, ubyte 1
|
||||
%tmp.159 = load float* %tmp.158
|
||||
%tmp.160 = getelementptr %struct..s_annealing_sched* %annealing_sched, long 0, ubyte 2
|
||||
%tmp.161 = load float* %tmp.160
|
||||
%tmp.162 = getelementptr %struct..s_annealing_sched* %annealing_sched, long 0, ubyte 3
|
||||
%tmp.163 = load float* %tmp.162
|
||||
%tmp.164 = getelementptr %struct..s_annealing_sched* %annealing_sched, long 0, ubyte 4
|
||||
%tmp.165 = load float* %tmp.164
|
||||
%tmp.166 = getelementptr %struct..s_router_opts* %router_opts, long 0, ubyte 0
|
||||
%tmp.167 = load float* %tmp.166
|
||||
%tmp.168 = getelementptr %struct..s_router_opts* %router_opts, long 0, ubyte 1
|
||||
%tmp.169 = load float* %tmp.168
|
||||
%tmp.170 = getelementptr %struct..s_router_opts* %router_opts, long 0, ubyte 2
|
||||
%tmp.171 = load float* %tmp.170
|
||||
%tmp.172 = getelementptr %struct..s_router_opts* %router_opts, long 0, ubyte 3
|
||||
%tmp.173 = load float* %tmp.172
|
||||
%tmp.174 = getelementptr %struct..s_router_opts* %router_opts, long 0, ubyte 4
|
||||
%tmp.175 = load float* %tmp.174
|
||||
%tmp.176 = getelementptr %struct..s_router_opts* %router_opts, long 0, ubyte 5
|
||||
%tmp.177 = load int* %tmp.176
|
||||
%tmp.178 = getelementptr %struct..s_router_opts* %router_opts, long 0, ubyte 6
|
||||
%tmp.179 = load int* %tmp.178
|
||||
%tmp.181 = load uint* %tmp.118
|
||||
%tmp.182 = getelementptr %struct..s_router_opts* %router_opts, long 0, ubyte 8
|
||||
%tmp.183 = load int* %tmp.182
|
||||
%tmp.184 = getelementptr %struct..s_det_routing_arch* %det_routing_arch, long 0, ubyte 0
|
||||
%tmp.185 = load uint* %tmp.184
|
||||
%tmp.186 = getelementptr %struct..s_det_routing_arch* %det_routing_arch, long 0, ubyte 1
|
||||
%tmp.187 = load float* %tmp.186
|
||||
%tmp.188 = getelementptr %struct..s_det_routing_arch* %det_routing_arch, long 0, ubyte 2
|
||||
%tmp.189 = load float* %tmp.188
|
||||
%tmp.190 = getelementptr %struct..s_det_routing_arch* %det_routing_arch, long 0, ubyte 3
|
||||
%tmp.191 = load float* %tmp.190
|
||||
%tmp.192 = getelementptr %struct..s_det_routing_arch* %det_routing_arch, long 0, ubyte 4
|
||||
%tmp.193 = load uint* %tmp.192
|
||||
%tmp.194 = getelementptr %struct..s_det_routing_arch* %det_routing_arch, long 0, ubyte 5
|
||||
%tmp.195 = load int* %tmp.194
|
||||
%tmp.196 = getelementptr %struct..s_det_routing_arch* %det_routing_arch, long 0, ubyte 6
|
||||
%tmp.197 = load short* %tmp.196
|
||||
%tmp.198 = getelementptr %struct..s_det_routing_arch* %det_routing_arch, long 0, ubyte 7
|
||||
%tmp.199 = load short* %tmp.198
|
||||
%tmp.200 = getelementptr %struct..s_det_routing_arch* %det_routing_arch, long 0, ubyte 8
|
||||
%tmp.201 = load short* %tmp.200
|
||||
%tmp.202 = getelementptr %struct..s_det_routing_arch* %det_routing_arch, long 0, ubyte 9
|
||||
%tmp.203 = load float* %tmp.202
|
||||
%tmp.204 = getelementptr %struct..s_det_routing_arch* %det_routing_arch, long 0, ubyte 10
|
||||
%tmp.205 = load float* %tmp.204
|
||||
%tmp.206 = load %struct..s_segment_inf** %segment_inf
|
||||
%tmp.208 = load uint* %tmp.109
|
||||
%tmp.209 = getelementptr { uint, float, float, float, float, float, float, float, float, float, float }* %timing_inf, long 0, ubyte 1
|
||||
%tmp.210 = load float* %tmp.209
|
||||
%tmp.211 = getelementptr { uint, float, float, float, float, float, float, float, float, float, float }* %timing_inf, long 0, ubyte 2
|
||||
%tmp.212 = load float* %tmp.211
|
||||
%tmp.213 = getelementptr { uint, float, float, float, float, float, float, float, float, float, float }* %timing_inf, long 0, ubyte 3
|
||||
%tmp.214 = load float* %tmp.213
|
||||
%tmp.215 = getelementptr { uint, float, float, float, float, float, float, float, float, float, float }* %timing_inf, long 0, ubyte 4
|
||||
%tmp.216 = load float* %tmp.215
|
||||
%tmp.217 = getelementptr { uint, float, float, float, float, float, float, float, float, float, float }* %timing_inf, long 0, ubyte 5
|
||||
%tmp.218 = load float* %tmp.217
|
||||
%tmp.219 = getelementptr { uint, float, float, float, float, float, float, float, float, float, float }* %timing_inf, long 0, ubyte 6
|
||||
%tmp.220 = load float* %tmp.219
|
||||
%tmp.221 = getelementptr { uint, float, float, float, float, float, float, float, float, float, float }* %timing_inf, long 0, ubyte 7
|
||||
%tmp.222 = load float* %tmp.221
|
||||
%tmp.223 = getelementptr { uint, float, float, float, float, float, float, float, float, float, float }* %timing_inf, long 0, ubyte 8
|
||||
%tmp.224 = load float* %tmp.223
|
||||
%tmp.225 = getelementptr { uint, float, float, float, float, float, float, float, float, float, float }* %timing_inf, long 0, ubyte 9
|
||||
%tmp.226 = load float* %tmp.225
|
||||
%tmp.227 = getelementptr { uint, float, float, float, float, float, float, float, float, float, float }* %timing_inf, long 0, ubyte 10
|
||||
%tmp.228 = load float* %tmp.227
|
||||
call void %place_and_route( int %tmp.135, int %tmp.137, float %tmp.139, int %tmp.141, uint %tmp.143, sbyte* %tmp.145, uint %tmp.147, int %tmp.149, sbyte* %tmp.107, sbyte* %tmp.105, sbyte* %tmp.106, sbyte* %tmp.108, uint %tmp.154, uint %tmp.155, uint %tmp.157, float %tmp.159, float %tmp.161, float %tmp.163, float %tmp.165, float %tmp.167, float %tmp.169, float %tmp.171, float %tmp.173, float %tmp.175, int %tmp.177, int %tmp.179, uint %tmp.181, int %tmp.183, uint %tmp.185, float %tmp.187, float %tmp.189, float %tmp.191, uint %tmp.193, int %tmp.195, short %tmp.197, short %tmp.199, short %tmp.201, float %tmp.203, float %tmp.205, %struct..s_segment_inf* %tmp.206, uint %tmp.208, float %tmp.210, float %tmp.212, float %tmp.214, float %tmp.216, float %tmp.218, float %tmp.220, float %tmp.222, float %tmp.224, float %tmp.226, float %tmp.228 )
|
||||
%tmp.231 = load uint* %show_graphics
|
||||
%tmp.232 = setne uint %tmp.231, 0
|
||||
br bool %tmp.232, label %then.2, label %endif.2
|
||||
|
||||
then.2:
|
||||
br label %endif.2
|
||||
|
||||
endif.2:
|
||||
ret int 0
|
||||
}
|
||||
|
||||
declare int %printf(sbyte*, ...)
|
||||
|
||||
declare void %place_and_route(int, int, float, int, uint, sbyte*, uint, int, sbyte*, sbyte*, sbyte*, sbyte*, uint, uint, uint, float, float, float, float, float, float, float, float, float, int, int, uint, int, uint, float, float, float, uint, int, short, short, short, float, float, %struct..s_segment_inf*, uint, float, float, float, float, float, float, float, float, float, float)
|
48
test/LLC/2003-05-30-BadFoldGEP.ll
Normal file
48
test/LLC/2003-05-30-BadFoldGEP.ll
Normal file
@ -0,0 +1,48 @@
|
||||
;; Date: May 28, 2003.
|
||||
;; From: test/Programs/External/SPEC/CINT2000/254.gap.llvm.bc
|
||||
;; Function: int %OpenOutput(sbyte* %filename.1)
|
||||
;;
|
||||
;; Error: A sequence of GEPs is folded incorrectly by llc during selection
|
||||
;; causing an assertion about a dynamic casting error.
|
||||
;; This code sequence was produced (correctly) by preselection
|
||||
;; from a nested pair of ConstantExpr getelementptrs.
|
||||
;; The code below is the output of preselection.
|
||||
;; The original ConstantExprs are included in a comment.
|
||||
;;
|
||||
;; Cause: FoldGetElemChain() was inserting an extra leading 0 even though
|
||||
;; the first instruction in the sequence contributes no indices.
|
||||
;; The next instruction contributes a leading non-zero so another
|
||||
;; zero should not be added before it!
|
||||
;;
|
||||
|
||||
|
||||
%FileType = type { int, [256 x sbyte], int, int, int, int }
|
||||
%OutputFiles = uninitialized global [16 x %FileType]
|
||||
%Output = internal global %FileType* null
|
||||
|
||||
|
||||
implementation; Functions:
|
||||
|
||||
internal int %OpenOutput(sbyte* %filename.1) {
|
||||
entry:
|
||||
%tmp.0 = load %FileType** %Output
|
||||
%tmp.4 = getelementptr %FileType* %tmp.0, long 1
|
||||
|
||||
;;------ Original instruction in 254.gap.llvm.bc:
|
||||
;; %tmp.10 = seteq { int, [256 x sbyte], int, int, int, int }* %tmp.4, getelementptr ([16 x { int, [256 x sbyte], int, int, int, int }]* getelementptr ([16 x { int, [256 x sbyte], int, int, int, int }]* %OutputFiles, long 1), long 0, long 0)
|
||||
|
||||
;;------ Code sequence produced by preselection phase for above instr:
|
||||
;; This code sequence is folded incorrectly by llc during selection
|
||||
;; causing an assertion about a dynamic casting error.
|
||||
%addrOfGlobal = getelementptr [16 x %FileType]* %OutputFiles, long 0
|
||||
%constantGEP = getelementptr [16 x %FileType]* %addrOfGlobal, long 1
|
||||
%constantGEP = getelementptr [16 x %FileType]* %constantGEP, long 0, long 0
|
||||
%tmp.10 = seteq %FileType* %tmp.4, %constantGEP
|
||||
br bool %tmp.10, label %return, label %endif.0
|
||||
|
||||
endif.0:
|
||||
ret int 0
|
||||
|
||||
return:
|
||||
ret int 1
|
||||
}
|
58
test/LLC/2003-05-30-BadPreselectPhi.ll
Normal file
58
test/LLC/2003-05-30-BadPreselectPhi.ll
Normal file
@ -0,0 +1,58 @@
|
||||
;; Date: May 28, 2003.
|
||||
;; From: test/Programs/SingleSource/richards_benchmark.c
|
||||
;; Function: struct task *handlerfn(struct packet *pkt)
|
||||
;;
|
||||
;; Error: PreSelection puts the arguments of the Phi just before
|
||||
;; the Phi instead of in predecessor blocks. This later
|
||||
;; causes llc to produces an invalid register <NULL VALUE>
|
||||
;; for the phi arguments.
|
||||
;;
|
||||
;; PreSelection Output:
|
||||
;; *** LLVM code after pre-selection for function handlerfn:
|
||||
;;
|
||||
;;
|
||||
;; %struct..task* %handlerfn(%struct..packet*) {
|
||||
;; ; <label>:0 ; No predecessors!
|
||||
;; setne %struct..packet* %0, null ; <bool>:0 [#uses=1]
|
||||
;; br bool %0, label %1, label %2
|
||||
;;
|
||||
;; ; <label>:1 ; preds = %0
|
||||
;; br label %2
|
||||
;;
|
||||
;; ; <label>:2 ; preds = %0, %1
|
||||
;; %addrOfGlobal = getelementptr int* %v2, long 0 ; <int*> [#uses=1]
|
||||
;; %addrOfGlobal1 = getelementptr int* %v1, long 0 ; <int*> [#uses=1]
|
||||
;; phi int* [ %addrOfGlobal, %1 ], [ %addrOfGlobal1, %0 ] ; <int*>:0 [#uses=1]
|
||||
;; cast int* %0 to %struct..packet* ; <%struct..packet*>:1 [#uses=1]
|
||||
;; call void %append( %struct..packet* %0, %struct..packet* %1 )
|
||||
;; ret %struct..task* null
|
||||
;; }
|
||||
;; llc: ../../../include/llvm/CodeGen/MachineInstr.h:294: int MachineOperand::getAllocatedRegNum() const: Assertion `hasAllocatedReg()' failed.
|
||||
;;
|
||||
|
||||
|
||||
target endian = little
|
||||
target pointersize = 32
|
||||
%struct..packet = type { %struct..packet*, int, int, int, [4 x sbyte] }
|
||||
%struct..task = type { %struct..task*, int, int, %struct..packet*, int, %struct..task* (%struct..packet*)*, int, int }
|
||||
%v1 = external global int
|
||||
%v2 = external global int
|
||||
|
||||
implementation ; Functions:
|
||||
|
||||
%struct..task* %handlerfn(%struct..packet* %pkt.2) {
|
||||
entry: ; No predecessors!
|
||||
%tmp.1 = setne %struct..packet* %pkt.2, null
|
||||
br bool %tmp.1, label %cond_false, label %cond_continue
|
||||
|
||||
cond_false: ; preds = %entry
|
||||
br label %cond_continue
|
||||
|
||||
cond_continue: ; preds = %entry, %cond_false
|
||||
%mem_tmp.0 = phi int* [ %v2, %cond_false ], [ %v1, %entry ]
|
||||
%tmp.12 = cast int* %mem_tmp.0 to %struct..packet*
|
||||
call void %append( %struct..packet* %pkt.2, %struct..packet* %tmp.12 )
|
||||
ret %struct..task* null
|
||||
}
|
||||
|
||||
declare void %append(%struct..packet*, %struct..packet*)
|
Loading…
Reference in New Issue
Block a user