3 more bugs from the SPEC codes and from richards_benchmark.c
authorVikram S. Adve <vadve@cs.uiuc.edu>
Sat, 31 May 2003 04:45:56 +0000 (04:45 +0000)
committerVikram S. Adve <vadve@cs.uiuc.edu>
Sat, 31 May 2003 04:45:56 +0000 (04:45 +0000)
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@6458 91177308-0d34-0410-b5e6-96231b3b80d8

test/CodeGen/Generic/2003-05-28-ManyArgs.ll [new file with mode: 0644]
test/CodeGen/Generic/2003-05-30-BadFoldGEP.ll [new file with mode: 0644]
test/CodeGen/Generic/2003-05-30-BadPreselectPhi.ll [new file with mode: 0644]
test/LLC/2003-05-28-ManyArgs.ll [new file with mode: 0644]
test/LLC/2003-05-30-BadFoldGEP.ll [new file with mode: 0644]
test/LLC/2003-05-30-BadPreselectPhi.ll [new file with mode: 0644]

diff --git a/test/CodeGen/Generic/2003-05-28-ManyArgs.ll b/test/CodeGen/Generic/2003-05-28-ManyArgs.ll
new file mode 100644 (file)
index 0000000..56dc8bb
--- /dev/null
@@ -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)
diff --git a/test/CodeGen/Generic/2003-05-30-BadFoldGEP.ll b/test/CodeGen/Generic/2003-05-30-BadFoldGEP.ll
new file mode 100644 (file)
index 0000000..47caabb
--- /dev/null
@@ -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
+}
diff --git a/test/CodeGen/Generic/2003-05-30-BadPreselectPhi.ll b/test/CodeGen/Generic/2003-05-30-BadPreselectPhi.ll
new file mode 100644 (file)
index 0000000..76f4a91
--- /dev/null
@@ -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*)
diff --git a/test/LLC/2003-05-28-ManyArgs.ll b/test/LLC/2003-05-28-ManyArgs.ll
new file mode 100644 (file)
index 0000000..56dc8bb
--- /dev/null
@@ -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)
diff --git a/test/LLC/2003-05-30-BadFoldGEP.ll b/test/LLC/2003-05-30-BadFoldGEP.ll
new file mode 100644 (file)
index 0000000..47caabb
--- /dev/null
@@ -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
+}
diff --git a/test/LLC/2003-05-30-BadPreselectPhi.ll b/test/LLC/2003-05-30-BadPreselectPhi.ll
new file mode 100644 (file)
index 0000000..76f4a91
--- /dev/null
@@ -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*)