From 162421522bbffa872386c2dba372fdeef06b9972 Mon Sep 17 00:00:00 2001 From: "Vikram S. Adve" Date: Sat, 31 May 2003 04:45:56 +0000 Subject: [PATCH] 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 --- test/CodeGen/Generic/2003-05-28-ManyArgs.ll | 156 ++++++++++++++++++ test/CodeGen/Generic/2003-05-30-BadFoldGEP.ll | 48 ++++++ .../Generic/2003-05-30-BadPreselectPhi.ll | 58 +++++++ test/LLC/2003-05-28-ManyArgs.ll | 156 ++++++++++++++++++ test/LLC/2003-05-30-BadFoldGEP.ll | 48 ++++++ test/LLC/2003-05-30-BadPreselectPhi.ll | 58 +++++++ 6 files changed, 524 insertions(+) create mode 100644 test/CodeGen/Generic/2003-05-28-ManyArgs.ll create mode 100644 test/CodeGen/Generic/2003-05-30-BadFoldGEP.ll create mode 100644 test/CodeGen/Generic/2003-05-30-BadPreselectPhi.ll create mode 100644 test/LLC/2003-05-28-ManyArgs.ll create mode 100644 test/LLC/2003-05-30-BadFoldGEP.ll create mode 100644 test/LLC/2003-05-30-BadPreselectPhi.ll diff --git a/test/CodeGen/Generic/2003-05-28-ManyArgs.ll b/test/CodeGen/Generic/2003-05-28-ManyArgs.ll new file mode 100644 index 00000000000..56dc8bbdee7 --- /dev/null +++ b/test/CodeGen/Generic/2003-05-28-ManyArgs.ll @@ -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 index 00000000000..47caabbd767 --- /dev/null +++ b/test/CodeGen/Generic/2003-05-30-BadFoldGEP.ll @@ -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 index 00000000000..76f4a915463 --- /dev/null +++ b/test/CodeGen/Generic/2003-05-30-BadPreselectPhi.ll @@ -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 +;; for the phi arguments. +;; +;; PreSelection Output: +;; *** LLVM code after pre-selection for function handlerfn: +;; +;; +;; %struct..task* %handlerfn(%struct..packet*) { +;; ;