<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>