[llvm-dev] NSW and ExtLdPromotion()

Lawrence via llvm-dev llvm-dev at lists.llvm.org
Mon Aug 10 18:53:56 PDT 2015

Hi, All:


I have a testcase which produced incorrect result, it's caused by the
combination of nsw flag and ExtLdPromotion, I am leaning to say Clang set
nsw flag incorrectly, but please let me know if I was wrong.


Here is the reduced testcase:


long long foo(int *a)


long long c;

c = *a * 1405;

return c;



Clang emitted the following IR (It is done by EmitMUL() in CGExprScalar.cpp,
CGF.getLangOpts().getSignedOverflowBehavior()=LangOptions::SOB_Undefined and


; Function Attrs: nounwind readonly

define i64 @foo(i32* nocapture readonly %a) #0 {


  %0 = load i32* %a, align 4, !tbaa !1

  %mul = mul nsw i32 %0, 1405

  %conv = sext i32 %mul to i64

  ret i64 %conv



Question 1: Is it reasonable to say "mul" is "No Signed Wrap" ?  *a *1405
could overflow though.

Question 2: Why SignedOverflowBehavior is set to LangOptions::SOB_Undefined
by default?

Question 3: What about CGF.SanOpts.has(SanitizerKind::SignedIntegerOverflow)


Because of nsw, and with Quentin patch (git-svn-id:
91177308-0d34-0410-b5e6-96231b3b80d8), ExtLdPromotion() in
CodeGenPrepare.cpp is able promote the sext to the following:

define i64 @foo(i32* nocapture readonly %a) #0 {


  %0 = load i32* %a, align 4, !tbaa !1

  %conv = sext i32 %0 to i64

  %mul = mul nsw i64 %conv, 1405

  ret i64 %mul



This promotion itself looks fine to me if nsw is true, and the final code

        ldrsw    x8, [x0]

        movz    w9, #0x57d

        mul      x0, x8, x9



The results is different from a 32-bit mul then sext, at least for my


Without nsw, ExtLdPromotion() didn't change anything, and the result is


Any thoughts would be helpful.





Lawrence Hu








-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/llvm-dev/attachments/20150810/219aa61c/attachment.html>

More information about the llvm-dev mailing list