[llvm-commits] [llvm] r165126 - /llvm/trunk/lib/Transforms/Utils/BypassSlowDivision.cpp

Nick Lewycky nicholas at mxc.ca
Thu Oct 4 01:37:13 PDT 2012


Preston Gurd wrote:
> Author: pgurd
> Date: Wed Oct  3 11:11:44 2012
> New Revision: 165126
>
> URL: http://llvm.org/viewvc/llvm-project?rev=165126&view=rev
> Log:
> This Patch corrects a problem whereby the optimization to use a faster divide
> instruction (for Intel Atom) was not being done by Clang, because
> the type context used by Clang is not the default context.

No, this is wrong. Please revert this patch.

The point of having multiple contexts is to permit two users of 
llvm-as-a-library in a single program to work without interfering with 
each other. Even just converting an integer type from context A to a 
different context would cause a data race between this and another 
thread that's using the global context.

There's a special exception for the ilist end iterator using 
getGlobalContext(), but pretty much anything else that isn't the 
top-level program calling getGlobalContext() is a bug.

I think the bug is in lib/Target/X86/X86ISelLowering.cpp where we add 
the slow bypass types using getGlobalContext(). And I have bad news, 
which is that you don't have the context at the point where your code 
that neesd it currently is (and indeed, none of the rest of the 
constructor relies on having it either). Is there a reason you need 
Type* in BypassSlowDivTypes, or could you just have the bitwidth of 
integers? (ie., do you care about vectors?)

Nick

> It fixes the problem by getting the global context types for each div/rem
> instruction in order to compare them against the types in the BypassTypeMap.
>
> Tests for this will be done as a separate patch to Clang.
>
> Patch by Tyler Nowicki.
>
>
> Modified:
>      llvm/trunk/lib/Transforms/Utils/BypassSlowDivision.cpp
>
> Modified: llvm/trunk/lib/Transforms/Utils/BypassSlowDivision.cpp
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Transforms/Utils/BypassSlowDivision.cpp?rev=165126&r1=165125&r2=165126&view=diff
> ==============================================================================
> --- llvm/trunk/lib/Transforms/Utils/BypassSlowDivision.cpp (original)
> +++ llvm/trunk/lib/Transforms/Utils/BypassSlowDivision.cpp Wed Oct  3 11:11:44 2012
> @@ -238,14 +238,24 @@
>       if (!UseDivOp&&  !UseRemOp)
>         continue;
>
> +    // Skip division on vector types, only optimize integer instructions
> +    if (!J->getType()->isIntegerTy())
> +      continue;
> +
> +    // Get same type in global context
> +    IntegerType *T = cast<IntegerType>(J->getType());
> +    IntegerType *GT = IntegerType::get(getGlobalContext(), T->getBitWidth());
> +
>       // Continue if div/rem type is not bypassed
> -    DenseMap<Type *, Type *>::const_iterator BT =
> -      BypassTypeMap.find(J->getType());
> -    if (BT == BypassTypeMap.end())
> +    DenseMap<Type *, Type *>::const_iterator BI = BypassTypeMap.find(GT);
> +    if (BI == BypassTypeMap.end())
>         continue;
>
> -    IntegerType *BypassType = cast<IntegerType>(BT->second);
> -    MadeChange |= reuseOrInsertFastDiv(F, I, J, BypassType, UseDivOp,
> +    // Get the bypass type in the original context
> +    IntegerType *GBT = cast<IntegerType>(BI->second);
> +    IntegerType *BT = IntegerType::get(J->getContext(), GBT->getBitWidth());
> +
> +    MadeChange |= reuseOrInsertFastDiv(F, I, J, BT, UseDivOp,
>                                          UseSignedOp, DivCache);
>     }
>
>
>
> _______________________________________________
> llvm-commits mailing list
> llvm-commits at cs.uiuc.edu
> http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits
>




More information about the llvm-commits mailing list