Hi Chris,
> The condition "IterationCount->getType() != LargestType" doesn't > mean the IterationCount->getType's bitwidth < LargestType's > so, sometimes, (like in this testcase), it need a trunc not ext. > This patch is to fix it. Ah, I see. Thank you for checking in the testcase. The reason this looked fishy to me is that the code attempts to insert the IV as the largest type, but that it could then need a zero extend. Doesn't this mean the zero extend case (which I know you didn't put in there :) is really dead? If so, please remove it and switch back to a simple: if (IterationCount->getType() != LargestType) IterationCount = SCEVTruncateExpr::get(IterationCount, LargestType);
No, it's incorrect. That will fail llvm/test/Transforms/IndVarSimplify/exit_value_tests.llx ( which got an assertion) i think we should keep the extend code. Sheng. Thanks! If this doesn't make any sense, please feel free to ask for
clarification :) -Chris > Sheng > > > > DOUT << "INDVARS: New CanIV: " << *IndVar; >> >> if (!isa<SCEVCouldNotCompute>(IterationCount)) { >> - if (IterationCount->getType() != LargestType) >> + if (IterationCount->getType()->getPrimitiveSizeInBits() < >> + LargestType->getPrimitiveSizeInBits()) >> IterationCount = SCEVZeroExtendExpr::get(IterationCount, >> LargestType); >> + else if (IterationCount->getType() != LargestType) >> + IterationCount = SCEVTruncateExpr::get(IterationCount, >> LargestType); >> if (Instruction *DI = LinearFunctionTestReplace(L, >> IterationCount,Rewriter)) >> DeadInsts.insert(DI); >> } > > > <testcase.bc> > ; ModuleID = 'testcase.bc' > target 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" > target triple = "i686-pc-linux-gnu" > > define i32 @testcase(i5 zext %k) { > entry: > br label %bb2 > > bb: ; preds = %bb2 > %tmp1 = add i32 %tmp2, %result ; <i32> [#uses=1] > %indvar_next1 = add i5 %k_0, 1 ; <i5> [#uses=1] > br label %bb2 > > bb2: ; preds = %bb, %entry > %k_0 = phi i5 [ 0, %entry ], [ %indvar_next1, %bb ] ; <i5> [#uses=2] > %result = phi i32 [ 0, %entry ], [ %tmp1, %bb ] ; <i32> [#uses=2] > %tmp2 = zext i5 %k_0 to i32 ; <i32> [#uses=1] > %exitcond = icmp eq i32 %tmp2, 16 ; <i1> [#uses=1] > br i1 %exitcond, label %bb3, label %bb > > bb3: ; preds = %bb2 > ret i32 %result > }
_______________________________________________ llvm-commits mailing list llvm-commits@cs.uiuc.edu http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits