<html><head><meta http-equiv="Content-Type" content="text/html charset=utf-8"></head><body style="word-wrap: break-word; -webkit-nbsp-mode: space; -webkit-line-break: after-white-space;" class="">Hi David<div class=""><br class=""></div><div class="">Here is another infinite loop fall out from this patch. Here is a test case:</div><div class=""> define float @test(float %arg) {<br class=""> entry:<br class=""> %0 = fpext float %arg to double<br class=""> %1 = frem double %0, 0xBAD<br class=""> %2 = fptrunc double %1 to float<br class=""> ret float %2<br class=""> }</div><div class=""><br class=""></div><div class="">The test case has exactly the same pattern as the instruction generated from instcombine which suggests probably it shouldn’t generate a truncation of same type? Maybe even a smaller type?</div><div class="">Here is a patch. Let me know what you think.</div><div class=""><br class=""></div><div class="">diff --git a/lib/Transforms/InstCombine/InstCombineCasts.cpp b/lib/Transforms/InstCombine/InstCombineCasts.cpp<br class="">index aba77bb..357bf24 100644<br class="">--- a/lib/Transforms/InstCombine/InstCombineCasts.cpp<br class="">+++ b/lib/Transforms/InstCombine/InstCombineCasts.cpp<br class="">@@ -1269,16 +1269,19 @@ Instruction *InstCombiner::visitFPTrunc(FPTruncInst &CI) {<br class=""> // type of OpI doesn't enter into things at all. We simply evaluate<br class=""> // in whichever source type is larger, then convert to the<br class=""> // destination type.<br class="">- if (LHSWidth < SrcWidth)<br class="">- LHSOrig = Builder->CreateFPExt(LHSOrig, RHSOrig->getType());<br class="">- else if (RHSWidth <= SrcWidth)<br class="">- RHSOrig = Builder->CreateFPExt(RHSOrig, LHSOrig->getType());<br class="">- if (LHSOrig != OpI->getOperand(0) || RHSOrig != OpI->getOperand(1)) {<br class="">- Value *ExactResult = Builder->CreateFRem(LHSOrig, RHSOrig);<br class="">- if (Instruction *RI = dyn_cast<Instruction>(ExactResult))<br class="">- RI->copyFastMathFlags(OpI);<br class="">- return CastInst::CreateFPCast(ExactResult, CI.getType());<br class="">+ if (SrcWidth != OpWidth) {<br class="">+ if (LHSWidth < SrcWidth)<br class="">+ LHSOrig = Builder->CreateFPExt(LHSOrig, RHSOrig->getType());<br class="">+ else if (RHSWidth <= SrcWidth)<br class="">+ RHSOrig = Builder->CreateFPExt(RHSOrig, LHSOrig->getType());<br class="">+ if (LHSOrig != OpI->getOperand(0) || RHSOrig != OpI->getOperand(1)) {<br class="">+ Value *ExactResult = Builder->CreateFRem(LHSOrig, RHSOrig);<br class="">+ if (Instruction *RI = dyn_cast<Instruction>(ExactResult))<br class="">+ RI->copyFastMathFlags(OpI);<br class="">+ return CastInst::CreateFPCast(ExactResult, CI.getType());<br class="">+ }<br class=""> }<br class="">+ break;<br class=""> }<br class=""> <br class="">Thanks</div><div class=""><br class=""></div><div class="">Steven</div><div class=""><div><blockquote type="cite" class=""><div class="">On Nov 18, 2014, at 2:06 PM, David Majnemer <<a href="mailto:david.majnemer@gmail.com" class="">david.majnemer@gmail.com</a>> wrote:</div><br class="Apple-interchange-newline"><div class=""><span style="font-family: Helvetica; font-size: 12px; font-style: normal; font-variant: normal; font-weight: normal; letter-spacing: normal; line-height: normal; orphans: auto; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; widows: auto; word-spacing: 0px; -webkit-text-stroke-width: 0px; float: none; display: inline !important;" class="">majnemer</span></div></blockquote></div><br class=""></div></body></html>