@@ -143,6 +143,10 @@ BatchedBackendLLVM::BatchedBackendLLVM(ShadingSystemImpl& shadingsys,
143143 case 8 : m_true_mask_value = Mask<8 >(true ).value (); break ;
144144 default : OSL_ASSERT (0 && " unsupported vector width" );
145145 }
146+
147+ // Select the appropriate ustring representation
148+ ll.ustring_rep (LLVM_Util::UstringRep::hash);
149+
146150 ll.dumpasm (shadingsys.m_llvm_dumpasm );
147151 ll.jit_fma (shadingsys.m_llvm_jit_fma );
148152 ll.jit_aggressive (shadingsys.m_llvm_jit_aggressive );
@@ -191,7 +195,7 @@ BatchedBackendLLVM::llvm_pass_type(const TypeSpec& typespec)
191195 else if (t == TypeDesc::INT)
192196 lt = ll.type_int ();
193197 else if (t == TypeDesc::STRING)
194- lt = (llvm::Type*)ll.type_ustring ();
198+ lt = (llvm::Type*)ll.type_real_ustring ();
195199 else if (t.aggregate == TypeDesc::VEC3)
196200 lt = (llvm::Type*)ll.type_void_ptr (); // llvm_type_triple_ptr();
197201 else if (t.aggregate == TypeDesc::MATRIX44)
@@ -271,9 +275,9 @@ BatchedBackendLLVM::llvm_assign_zero(const Symbol& sym)
271275 zero = ll.wide_constant (0 );
272276 } else if (elemtype.is_string_based ()) {
273277 if (sym.is_uniform ())
274- zero = ll.constant (ustring ( ));
278+ zero = ll.constant (uint64_t ( 0 ));
275279 else
276- zero = ll.wide_constant (ustring ( ));
280+ zero = ll.wide_constant (uint64_t ( 0 ));
277281 } else if (elemtype.is_closure_based ()) {
278282 if (sym.is_uniform ())
279283 zero = ll.void_ptr_null ();
@@ -715,7 +719,8 @@ llvm::Value*
715719BatchedBackendLLVM::llvm_load_value (const Symbol& sym, int deriv,
716720 llvm::Value* arrayindex, int component,
717721 TypeDesc cast, bool op_is_uniform,
718- bool index_is_uniform)
722+ bool index_is_uniform,
723+ bool always_real_ustring)
719724{
720725 // A uniform symbol can be broadcast into a varying value.
721726 // But a varying symbol can NOT be loaded into a uniform value.
@@ -780,9 +785,15 @@ BatchedBackendLLVM::llvm_load_value(const Symbol& sym, int deriv,
780785 if (sym.typespec ().is_string ()) {
781786 ustring string_val = sym.get_string ();
782787 if (op_is_uniform) {
783- return ll.constant (string_val);
788+ if (!always_real_ustring)
789+ return ll.constant (string_val);
790+ else
791+ return ll.constant_real_ustring (string_val);
784792 } else {
785- return ll.wide_constant (string_val);
793+ if (!always_real_ustring)
794+ return ll.wide_constant (string_val);
795+ else
796+ return ll.wide_constant_real_ustring (string_val);
786797 }
787798 }
788799 OSL_ASSERT (0 && " unhandled constant type" );
@@ -796,7 +807,17 @@ BatchedBackendLLVM::llvm_load_value(const Symbol& sym, int deriv,
796807 sym.forced_llvm_bool ());
797808}
798809
810+ llvm::Value*
811+ BatchedBackendLLVM::llvm_const_hash (string_view str)
812+ {
813+ return llvm_const_hash (ustring (str));
814+ }
799815
816+ llvm::Value*
817+ BatchedBackendLLVM::llvm_const_hash (ustring str)
818+ {
819+ return ll.constant64 ((uint64_t )str.hash ());
820+ }
800821
801822llvm::Value*
802823BatchedBackendLLVM::llvm_load_mask (const Symbol& cond)
@@ -1717,6 +1738,7 @@ BatchedBackendLLVM::llvm_call_function(const FuncSpec& name,
17171738 = llvm_load_value (s, /* deriv=*/ d,
17181739 /* component*/ c, TypeUnknown,
17191740 function_is_uniform);
1741+
17201742 // Store our wide pointer on the stack
17211743 llvm_store_value (wide_value, tmpptr, t, d, NULL , c,
17221744 /* dst_is_uniform*/ false );
0 commit comments