<div dir="ltr"><div class="gmail_extra"><div class="gmail_quote">On Thu, Dec 11, 2014 at 2:13 PM, Steven Wu <span dir="ltr"><<a href="mailto:stevenwu@apple.com" target="_blank">stevenwu@apple.com</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div style="word-wrap:break-word">Hi David<div><br></div><div>Here is another infinite loop fall out from this patch. Here is a test case:</div><div> define float @test(float %arg) {<br> entry:<br>   %0 = fpext float %arg to double<br>   %1 = frem double %0, 0xBAD<br>   %2 = fptrunc double %1 to float<br>   ret float %2<br> }</div><div><br></div><div>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></blockquote><div><br></div><div>I think that makes sense.</div><div> </div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div style="word-wrap:break-word"><div>Here is a patch. Let me know what you think.</div></div></blockquote><div><br></div><div>LGTM if you include a test case.</div><div> </div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div style="word-wrap:break-word"><div><br></div><div>diff --git a/lib/Transforms/InstCombine/InstCombineCasts.cpp b/lib/Transforms/InstCombine/InstCombineCasts.cpp<br>index aba77bb..357bf24 100644<br>--- a/lib/Transforms/InstCombine/InstCombineCasts.cpp<br>+++ b/lib/Transforms/InstCombine/InstCombineCasts.cpp<br>@@ -1269,16 +1269,19 @@ Instruction *InstCombiner::visitFPTrunc(FPTruncInst &CI) {<span class=""><br>         // type of OpI doesn't enter into things at all.  We simply evaluate<br>         // in whichever source type is larger, then convert to the<br>         // destination type.<br></span>-        if (LHSWidth < SrcWidth)<br>-          LHSOrig = Builder->CreateFPExt(LHSOrig, RHSOrig->getType());<br>-        else if (RHSWidth <= SrcWidth)<br>-          RHSOrig = Builder->CreateFPExt(RHSOrig, LHSOrig->getType());<br>-        if (LHSOrig != OpI->getOperand(0) || RHSOrig != OpI->getOperand(1)) {<br>-          Value *ExactResult = Builder->CreateFRem(LHSOrig, RHSOrig);<br>-          if (Instruction *RI = dyn_cast<Instruction>(ExactResult))<br>-            RI->copyFastMathFlags(OpI);<br>-          return CastInst::CreateFPCast(ExactResult, CI.getType());<br>+        if (SrcWidth != OpWidth) {<br>+          if (LHSWidth < SrcWidth)<span class=""><br>+            LHSOrig = Builder->CreateFPExt(LHSOrig, RHSOrig->getType());<br></span>+          else if (RHSWidth <= SrcWidth)<span class=""><br>+            RHSOrig = Builder->CreateFPExt(RHSOrig, LHSOrig->getType());<br>+          if (LHSOrig != OpI->getOperand(0) || RHSOrig != OpI->getOperand(1)) {<br>+            Value *ExactResult = Builder->CreateFRem(LHSOrig, RHSOrig);<br></span>+            if (Instruction *RI = dyn_cast<Instruction>(ExactResult))<br>+              RI->copyFastMathFlags(OpI);<br>+            return CastInst::CreateFPCast(ExactResult, CI.getType());<br>+          }<br>         }<br>+        break;<br>     }<br> <br>Thanks</div><div><br></div><div>Steven</div><div><div><blockquote type="cite"><div>On Nov 18, 2014, at 2:06 PM, David Majnemer <<a href="mailto:david.majnemer@gmail.com" target="_blank">david.majnemer@gmail.com</a>> wrote:</div><br><div><span style="font-family:Helvetica;font-size:12px;font-style:normal;font-variant:normal;font-weight:normal;letter-spacing:normal;line-height:normal;text-align:start;text-indent:0px;text-transform:none;white-space:normal;word-spacing:0px;float:none;display:inline!important">majnemer</span></div></blockquote></div><br></div></div></blockquote></div><br></div></div>