brintos

brintos / llvm-project-archived public Read only

0
0
Text · 8.1 KiB · c7896a3 Raw
235 lines · plain
1; RUN: opt < %s -disable-output "-passes=print<scalar-evolution>" -S 2>&1 | FileCheck %s2 3; Indvars should be able to find the trip count for the bb6 loop4; without using a maximum calculation (icmp, select) because it should5; be able to prove that the comparison is guarded by an appropriate6; conditional branch. Unfortunately, indvars is not yet able to find7; the comparison for the other two loops in this testcase.8;9; CHECK: Loop %bb6: backedge-taken count is (-1 + %w)10 11target 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"12target triple = "i386-apple-darwin9"13 14define void @foo(ptr %r, i32 %s, i32 %w, i32 %x, ptr %j, i32 %d) nounwind {15entry:16	%0 = mul i32 %x, %w		; <i32> [#uses=2]17	%1 = mul i32 %x, %w		; <i32> [#uses=1]18	%2 = sdiv i32 %1, 4		; <i32> [#uses=1]19	%.sum2 = add i32 %2, %0		; <i32> [#uses=2]20	%cond = icmp eq i32 %d, 1		; <i1> [#uses=1]21	br i1 %cond, label %bb29, label %bb10.preheader22 23bb10.preheader:		; preds = %entry24	%3 = icmp sgt i32 %x, 0		; <i1> [#uses=1]25	br i1 %3, label %bb.nph9, label %bb18.loopexit26 27bb.nph7:		; preds = %bb7.preheader28	%4 = mul i32 %y.08, %w		; <i32> [#uses=1]29	%5 = mul i32 %y.08, %s		; <i32> [#uses=1]30	%6 = add i32 %5, 1		; <i32> [#uses=1]31	br label %bb632 33bb6:		; preds = %bb7, %bb.nph734	%x.06 = phi i32 [ %13, %bb7 ], [ 0, %bb.nph7 ]		; <i32> [#uses=3]35	%7 = add i32 %x.06, %4		; <i32> [#uses=1]36	%8 = shl i32 %x.06, 1		; <i32> [#uses=1]37	%9 = add i32 %6, %8		; <i32> [#uses=1]38	%10 = getelementptr i8, ptr %r, i32 %9		; <ptr> [#uses=1]39	%11 = load i8, ptr %10, align 1		; <i8> [#uses=1]40	%12 = getelementptr i8, ptr %j, i32 %7		; <ptr> [#uses=1]41	store i8 %11, ptr %12, align 142	%13 = add i32 %x.06, 1		; <i32> [#uses=2]43	br label %bb744 45bb7:		; preds = %bb646	%14 = icmp slt i32 %13, %w		; <i1> [#uses=1]47	br i1 %14, label %bb6, label %bb7.bb9_crit_edge48 49bb7.bb9_crit_edge:		; preds = %bb750	br label %bb951 52bb9:		; preds = %bb7.preheader, %bb7.bb9_crit_edge53	%15 = add i32 %y.08, 1		; <i32> [#uses=2]54	br label %bb1055 56bb10:		; preds = %bb957	%16 = icmp slt i32 %15, %x		; <i1> [#uses=1]58	br i1 %16, label %bb7.preheader, label %bb10.bb18.loopexit_crit_edge59 60bb10.bb18.loopexit_crit_edge:		; preds = %bb1061	br label %bb10.bb18.loopexit_crit_edge.split62 63bb10.bb18.loopexit_crit_edge.split:		; preds = %bb.nph9, %bb10.bb18.loopexit_crit_edge64	br label %bb18.loopexit65 66bb.nph9:		; preds = %bb10.preheader67	%17 = icmp sgt i32 %w, 0		; <i1> [#uses=1]68	br i1 %17, label %bb.nph9.split, label %bb10.bb18.loopexit_crit_edge.split69 70bb.nph9.split:		; preds = %bb.nph971	br label %bb7.preheader72 73bb7.preheader:		; preds = %bb.nph9.split, %bb1074	%y.08 = phi i32 [ %15, %bb10 ], [ 0, %bb.nph9.split ]		; <i32> [#uses=3]75	br i1 true, label %bb.nph7, label %bb976 77bb.nph5:		; preds = %bb18.loopexit78	%18 = sdiv i32 %w, 2		; <i32> [#uses=1]79	%19 = icmp slt i32 %w, 2		; <i1> [#uses=1]80	%20 = sdiv i32 %x, 2		; <i32> [#uses=1]81	br i1 %19, label %bb18.bb20_crit_edge.split, label %bb.nph5.split82 83bb.nph5.split:		; preds = %bb.nph584	br label %bb1385 86bb13:		; preds = %bb18, %bb.nph5.split87	%y.14 = phi i32 [ %42, %bb18 ], [ 0, %bb.nph5.split ]		; <i32> [#uses=4]88	%21 = mul i32 %18, %y.14		; <i32> [#uses=2]89	%22 = shl i32 %y.14, 1		; <i32> [#uses=1]90	%23 = srem i32 %y.14, 2		; <i32> [#uses=1]91	%24 = add i32 %23, %22		; <i32> [#uses=1]92	%25 = mul i32 %24, %s		; <i32> [#uses=2]93	br i1 true, label %bb.nph3, label %bb1794 95bb.nph3:		; preds = %bb1396	%26 = add i32 %21, %0		; <i32> [#uses=1]97	%27 = add i32 %21, %.sum2		; <i32> [#uses=1]98	%28 = sdiv i32 %w, 2		; <i32> [#uses=1]99	br label %bb14100 101bb14:		; preds = %bb15, %bb.nph3102	%x.12 = phi i32 [ %40, %bb15 ], [ 0, %bb.nph3 ]		; <i32> [#uses=5]103	%29 = shl i32 %x.12, 2		; <i32> [#uses=1]104	%30 = add i32 %29, %25		; <i32> [#uses=1]105	%31 = getelementptr i8, ptr %r, i32 %30		; <ptr> [#uses=1]106	%32 = load i8, ptr %31, align 1		; <i8> [#uses=1]107	%.sum = add i32 %26, %x.12		; <i32> [#uses=1]108	%33 = getelementptr i8, ptr %j, i32 %.sum		; <ptr> [#uses=1]109	store i8 %32, ptr %33, align 1110	%34 = shl i32 %x.12, 2		; <i32> [#uses=1]111	%35 = or i32 %34, 2		; <i32> [#uses=1]112	%36 = add i32 %35, %25		; <i32> [#uses=1]113	%37 = getelementptr i8, ptr %r, i32 %36		; <ptr> [#uses=1]114	%38 = load i8, ptr %37, align 1		; <i8> [#uses=1]115	%.sum6 = add i32 %27, %x.12		; <i32> [#uses=1]116	%39 = getelementptr i8, ptr %j, i32 %.sum6		; <ptr> [#uses=1]117	store i8 %38, ptr %39, align 1118	%40 = add i32 %x.12, 1		; <i32> [#uses=2]119	br label %bb15120 121bb15:		; preds = %bb14122	%41 = icmp sgt i32 %28, %40		; <i1> [#uses=1]123	br i1 %41, label %bb14, label %bb15.bb17_crit_edge124 125bb15.bb17_crit_edge:		; preds = %bb15126	br label %bb17127 128bb17:		; preds = %bb15.bb17_crit_edge, %bb13129	%42 = add i32 %y.14, 1		; <i32> [#uses=2]130	br label %bb18131 132bb18.loopexit:		; preds = %bb10.bb18.loopexit_crit_edge.split, %bb10.preheader133	%43 = icmp slt i32 %x, 2		; <i1> [#uses=1]134	br i1 %43, label %bb20, label %bb.nph5135 136bb18:		; preds = %bb17137	%44 = icmp sgt i32 %20, %42		; <i1> [#uses=1]138	br i1 %44, label %bb13, label %bb18.bb20_crit_edge139 140bb18.bb20_crit_edge:		; preds = %bb18141	br label %bb18.bb20_crit_edge.split142 143bb18.bb20_crit_edge.split:		; preds = %bb18.bb20_crit_edge, %bb.nph5144	br label %bb20145 146bb20:		; preds = %bb18.bb20_crit_edge.split, %bb18.loopexit147	switch i32 %d, label %return [148		i32 3, label %bb22149		i32 1, label %bb29150	]151 152bb22:		; preds = %bb20153	%45 = mul i32 %x, %w		; <i32> [#uses=1]154	%46 = sdiv i32 %45, 4		; <i32> [#uses=1]155	%.sum3 = add i32 %46, %.sum2		; <i32> [#uses=2]156	%47 = add i32 %x, 15		; <i32> [#uses=1]157	%48 = and i32 %47, -16		; <i32> [#uses=1]158	%49 = add i32 %w, 15		; <i32> [#uses=1]159	%50 = and i32 %49, -16		; <i32> [#uses=1]160	%51 = mul i32 %48, %s		; <i32> [#uses=1]161	%52 = icmp sgt i32 %x, 0		; <i1> [#uses=1]162	br i1 %52, label %bb.nph, label %bb26163 164bb.nph:		; preds = %bb22165	br label %bb23166 167bb23:		; preds = %bb24, %bb.nph168	%y.21 = phi i32 [ %57, %bb24 ], [ 0, %bb.nph ]		; <i32> [#uses=3]169	%53 = mul i32 %y.21, %50		; <i32> [#uses=1]170	%.sum1 = add i32 %53, %51		; <i32> [#uses=1]171	%54 = getelementptr i8, ptr %r, i32 %.sum1		; <ptr> [#uses=1]172	%55 = mul i32 %y.21, %w		; <i32> [#uses=1]173	%.sum5 = add i32 %55, %.sum3		; <i32> [#uses=1]174	%56 = getelementptr i8, ptr %j, i32 %.sum5		; <ptr> [#uses=1]175	tail call void @llvm.memcpy.p0.p0.i32(ptr %56, ptr %54, i32 %w, i1 false)176	%57 = add i32 %y.21, 1		; <i32> [#uses=2]177	br label %bb24178 179bb24:		; preds = %bb23180	%58 = icmp slt i32 %57, %x		; <i1> [#uses=1]181	br i1 %58, label %bb23, label %bb24.bb26_crit_edge182 183bb24.bb26_crit_edge:		; preds = %bb24184	br label %bb26185 186bb26:		; preds = %bb24.bb26_crit_edge, %bb22187	%59 = mul i32 %x, %w		; <i32> [#uses=1]188	%.sum4 = add i32 %.sum3, %59		; <i32> [#uses=1]189	%60 = getelementptr i8, ptr %j, i32 %.sum4		; <ptr> [#uses=1]190	%61 = mul i32 %x, %w		; <i32> [#uses=1]191	%62 = sdiv i32 %61, 2		; <i32> [#uses=1]192	tail call void @llvm.memset.p0.i32(ptr %60, i8 -128, i32 %62, i1 false)193	ret void194 195bb29:		; preds = %bb20, %entry196	%63 = add i32 %w, 15		; <i32> [#uses=1]197	%64 = and i32 %63, -16		; <i32> [#uses=1]198	%65 = icmp sgt i32 %x, 0		; <i1> [#uses=1]199	br i1 %65, label %bb.nph11, label %bb33200 201bb.nph11:		; preds = %bb29202	br label %bb30203 204bb30:		; preds = %bb31, %bb.nph11205	%y.310 = phi i32 [ %70, %bb31 ], [ 0, %bb.nph11 ]		; <i32> [#uses=3]206	%66 = mul i32 %y.310, %64		; <i32> [#uses=1]207	%67 = getelementptr i8, ptr %r, i32 %66		; <ptr> [#uses=1]208	%68 = mul i32 %y.310, %w		; <i32> [#uses=1]209	%69 = getelementptr i8, ptr %j, i32 %68		; <ptr> [#uses=1]210	tail call void @llvm.memcpy.p0.p0.i32(ptr %69, ptr %67, i32 %w, i1 false)211	%70 = add i32 %y.310, 1		; <i32> [#uses=2]212	br label %bb31213 214bb31:		; preds = %bb30215	%71 = icmp slt i32 %70, %x		; <i1> [#uses=1]216	br i1 %71, label %bb30, label %bb31.bb33_crit_edge217 218bb31.bb33_crit_edge:		; preds = %bb31219	br label %bb33220 221bb33:		; preds = %bb31.bb33_crit_edge, %bb29222	%72 = mul i32 %x, %w		; <i32> [#uses=1]223	%73 = getelementptr i8, ptr %j, i32 %72		; <ptr> [#uses=1]224	%74 = mul i32 %x, %w		; <i32> [#uses=1]225	%75 = sdiv i32 %74, 2		; <i32> [#uses=1]226	tail call void @llvm.memset.p0.i32(ptr %73, i8 -128, i32 %75, i1 false)227	ret void228 229return:		; preds = %bb20230	ret void231}232 233declare void @llvm.memcpy.p0.p0.i32(ptr nocapture, ptr nocapture, i32, i1) nounwind234declare void @llvm.memset.p0.i32(ptr nocapture, i8, i32, i1) nounwind235