diff --git a/clang/lib/CodeGen/CGExpr.cpp b/clang/lib/CodeGen/CGExpr.cpp --- a/clang/lib/CodeGen/CGExpr.cpp +++ b/clang/lib/CodeGen/CGExpr.cpp @@ -2263,6 +2263,10 @@ llvm::Value *Val = Builder.CreateLoad(Ptr, Dst.isVolatileQualified(), "bf.load"); + // In the event the store is acting as an initialization, add a freeze + // instruction to prevent infinite poison propagation. + Val = Builder.CreateFreeze(Val, "bf.freeze"); + // Mask the source value as needed. if (!hasBooleanRepresentation(Dst.getType())) SrcVal = Builder.CreateAnd( diff --git a/clang/test/CodeGen/aapcs-bitfield.c b/clang/test/CodeGen/aapcs-bitfield.c --- a/clang/test/CodeGen/aapcs-bitfield.c +++ b/clang/test/CodeGen/aapcs-bitfield.c @@ -99,7 +99,8 @@ // LE-NEXT: entry: // LE-NEXT: [[TMP0:%.*]] = bitcast %struct.st0* [[M:%.*]] to i8* // LE-NEXT: [[BF_LOAD:%.*]] = load i8, i8* [[TMP0]], align 2 -// LE-NEXT: [[BF_CLEAR:%.*]] = and i8 [[BF_LOAD]], -128 +// LE-NEXT: [[BF_FREEZE:%.*]] = freeze i8 [[BF_LOAD]] +// LE-NEXT: [[BF_CLEAR:%.*]] = and i8 [[BF_FREEZE]], -128 // LE-NEXT: [[BF_SET:%.*]] = or i8 [[BF_CLEAR]], 1 // LE-NEXT: store i8 [[BF_SET]], i8* [[TMP0]], align 2 // LE-NEXT: ret void @@ -108,7 +109,8 @@ // BE-NEXT: entry: // BE-NEXT: [[TMP0:%.*]] = bitcast %struct.st0* [[M:%.*]] to i8* // BE-NEXT: [[BF_LOAD:%.*]] = load i8, i8* [[TMP0]], align 2 -// BE-NEXT: [[BF_CLEAR:%.*]] = and i8 [[BF_LOAD]], 1 +// BE-NEXT: [[BF_FREEZE:%.*]] = freeze i8 [[BF_LOAD]] +// BE-NEXT: [[BF_CLEAR:%.*]] = and i8 [[BF_FREEZE]], 1 // BE-NEXT: [[BF_SET:%.*]] = or i8 [[BF_CLEAR]], 2 // BE-NEXT: store i8 [[BF_SET]], i8* [[TMP0]], align 2 // BE-NEXT: ret void @@ -117,7 +119,8 @@ // LENUMLOADS-NEXT: entry: // LENUMLOADS-NEXT: [[TMP0:%.*]] = bitcast %struct.st0* [[M:%.*]] to i8* // LENUMLOADS-NEXT: [[BF_LOAD:%.*]] = load i8, i8* [[TMP0]], align 2 -// LENUMLOADS-NEXT: [[BF_CLEAR:%.*]] = and i8 [[BF_LOAD]], -128 +// LENUMLOADS-NEXT: [[BF_FREEZE:%.*]] = freeze i8 [[BF_LOAD]] +// LENUMLOADS-NEXT: [[BF_CLEAR:%.*]] = and i8 [[BF_FREEZE]], -128 // LENUMLOADS-NEXT: [[BF_SET:%.*]] = or i8 [[BF_CLEAR]], 1 // LENUMLOADS-NEXT: store i8 [[BF_SET]], i8* [[TMP0]], align 2 // LENUMLOADS-NEXT: ret void @@ -126,7 +129,8 @@ // BENUMLOADS-NEXT: entry: // BENUMLOADS-NEXT: [[TMP0:%.*]] = bitcast %struct.st0* [[M:%.*]] to i8* // BENUMLOADS-NEXT: [[BF_LOAD:%.*]] = load i8, i8* [[TMP0]], align 2 -// BENUMLOADS-NEXT: [[BF_CLEAR:%.*]] = and i8 [[BF_LOAD]], 1 +// BENUMLOADS-NEXT: [[BF_FREEZE:%.*]] = freeze i8 [[BF_LOAD]] +// BENUMLOADS-NEXT: [[BF_CLEAR:%.*]] = and i8 [[BF_FREEZE]], 1 // BENUMLOADS-NEXT: [[BF_SET:%.*]] = or i8 [[BF_CLEAR]], 2 // BENUMLOADS-NEXT: store i8 [[BF_SET]], i8* [[TMP0]], align 2 // BENUMLOADS-NEXT: ret void @@ -135,7 +139,8 @@ // LEWIDTH-NEXT: entry: // LEWIDTH-NEXT: [[TMP0:%.*]] = bitcast %struct.st0* [[M:%.*]] to i8* // LEWIDTH-NEXT: [[BF_LOAD:%.*]] = load i8, i8* [[TMP0]], align 2 -// LEWIDTH-NEXT: [[BF_CLEAR:%.*]] = and i8 [[BF_LOAD]], -128 +// LEWIDTH-NEXT: [[BF_FREEZE:%.*]] = freeze i8 [[BF_LOAD]] +// LEWIDTH-NEXT: [[BF_CLEAR:%.*]] = and i8 [[BF_FREEZE]], -128 // LEWIDTH-NEXT: [[BF_SET:%.*]] = or i8 [[BF_CLEAR]], 1 // LEWIDTH-NEXT: store i8 [[BF_SET]], i8* [[TMP0]], align 2 // LEWIDTH-NEXT: ret void @@ -144,7 +149,8 @@ // BEWIDTH-NEXT: entry: // BEWIDTH-NEXT: [[TMP0:%.*]] = bitcast %struct.st0* [[M:%.*]] to i8* // BEWIDTH-NEXT: [[BF_LOAD:%.*]] = load i8, i8* [[TMP0]], align 2 -// BEWIDTH-NEXT: [[BF_CLEAR:%.*]] = and i8 [[BF_LOAD]], 1 +// BEWIDTH-NEXT: [[BF_FREEZE:%.*]] = freeze i8 [[BF_LOAD]] +// BEWIDTH-NEXT: [[BF_CLEAR:%.*]] = and i8 [[BF_FREEZE]], 1 // BEWIDTH-NEXT: [[BF_SET:%.*]] = or i8 [[BF_CLEAR]], 2 // BEWIDTH-NEXT: store i8 [[BF_SET]], i8* [[TMP0]], align 2 // BEWIDTH-NEXT: ret void @@ -153,7 +159,8 @@ // LEWIDTHNUM-NEXT: entry: // LEWIDTHNUM-NEXT: [[TMP0:%.*]] = bitcast %struct.st0* [[M:%.*]] to i8* // LEWIDTHNUM-NEXT: [[BF_LOAD:%.*]] = load i8, i8* [[TMP0]], align 2 -// LEWIDTHNUM-NEXT: [[BF_CLEAR:%.*]] = and i8 [[BF_LOAD]], -128 +// LEWIDTHNUM-NEXT: [[BF_FREEZE:%.*]] = freeze i8 [[BF_LOAD]] +// LEWIDTHNUM-NEXT: [[BF_CLEAR:%.*]] = and i8 [[BF_FREEZE]], -128 // LEWIDTHNUM-NEXT: [[BF_SET:%.*]] = or i8 [[BF_CLEAR]], 1 // LEWIDTHNUM-NEXT: store i8 [[BF_SET]], i8* [[TMP0]], align 2 // LEWIDTHNUM-NEXT: ret void @@ -162,7 +169,8 @@ // BEWIDTHNUM-NEXT: entry: // BEWIDTHNUM-NEXT: [[TMP0:%.*]] = bitcast %struct.st0* [[M:%.*]] to i8* // BEWIDTHNUM-NEXT: [[BF_LOAD:%.*]] = load i8, i8* [[TMP0]], align 2 -// BEWIDTHNUM-NEXT: [[BF_CLEAR:%.*]] = and i8 [[BF_LOAD]], 1 +// BEWIDTHNUM-NEXT: [[BF_FREEZE:%.*]] = freeze i8 [[BF_LOAD]] +// BEWIDTHNUM-NEXT: [[BF_CLEAR:%.*]] = and i8 [[BF_FREEZE]], 1 // BEWIDTHNUM-NEXT: [[BF_SET:%.*]] = or i8 [[BF_CLEAR]], 2 // BEWIDTHNUM-NEXT: store i8 [[BF_SET]], i8* [[TMP0]], align 2 // BEWIDTHNUM-NEXT: ret void @@ -252,7 +260,8 @@ // LE-NEXT: entry: // LE-NEXT: [[TMP0:%.*]] = bitcast %struct.st1* [[M:%.*]] to i16* // LE-NEXT: [[BF_LOAD:%.*]] = load i16, i16* [[TMP0]], align 4 -// LE-NEXT: [[BF_CLEAR:%.*]] = and i16 [[BF_LOAD]], 1023 +// LE-NEXT: [[BF_FREEZE:%.*]] = freeze i16 [[BF_LOAD]] +// LE-NEXT: [[BF_CLEAR:%.*]] = and i16 [[BF_FREEZE]], 1023 // LE-NEXT: [[BF_SET:%.*]] = or i16 [[BF_CLEAR]], 1024 // LE-NEXT: store i16 [[BF_SET]], i16* [[TMP0]], align 4 // LE-NEXT: ret void @@ -261,7 +270,8 @@ // BE-NEXT: entry: // BE-NEXT: [[TMP0:%.*]] = bitcast %struct.st1* [[M:%.*]] to i16* // BE-NEXT: [[BF_LOAD:%.*]] = load i16, i16* [[TMP0]], align 4 -// BE-NEXT: [[BF_CLEAR:%.*]] = and i16 [[BF_LOAD]], -64 +// BE-NEXT: [[BF_FREEZE:%.*]] = freeze i16 [[BF_LOAD]] +// BE-NEXT: [[BF_CLEAR:%.*]] = and i16 [[BF_FREEZE]], -64 // BE-NEXT: [[BF_SET:%.*]] = or i16 [[BF_CLEAR]], 1 // BE-NEXT: store i16 [[BF_SET]], i16* [[TMP0]], align 4 // BE-NEXT: ret void @@ -270,7 +280,8 @@ // LENUMLOADS-NEXT: entry: // LENUMLOADS-NEXT: [[TMP0:%.*]] = bitcast %struct.st1* [[M:%.*]] to i16* // LENUMLOADS-NEXT: [[BF_LOAD:%.*]] = load i16, i16* [[TMP0]], align 4 -// LENUMLOADS-NEXT: [[BF_CLEAR:%.*]] = and i16 [[BF_LOAD]], 1023 +// LENUMLOADS-NEXT: [[BF_FREEZE:%.*]] = freeze i16 [[BF_LOAD]] +// LENUMLOADS-NEXT: [[BF_CLEAR:%.*]] = and i16 [[BF_FREEZE]], 1023 // LENUMLOADS-NEXT: [[BF_SET:%.*]] = or i16 [[BF_CLEAR]], 1024 // LENUMLOADS-NEXT: store i16 [[BF_SET]], i16* [[TMP0]], align 4 // LENUMLOADS-NEXT: ret void @@ -279,7 +290,8 @@ // BENUMLOADS-NEXT: entry: // BENUMLOADS-NEXT: [[TMP0:%.*]] = bitcast %struct.st1* [[M:%.*]] to i16* // BENUMLOADS-NEXT: [[BF_LOAD:%.*]] = load i16, i16* [[TMP0]], align 4 -// BENUMLOADS-NEXT: [[BF_CLEAR:%.*]] = and i16 [[BF_LOAD]], -64 +// BENUMLOADS-NEXT: [[BF_FREEZE:%.*]] = freeze i16 [[BF_LOAD]] +// BENUMLOADS-NEXT: [[BF_CLEAR:%.*]] = and i16 [[BF_FREEZE]], -64 // BENUMLOADS-NEXT: [[BF_SET:%.*]] = or i16 [[BF_CLEAR]], 1 // BENUMLOADS-NEXT: store i16 [[BF_SET]], i16* [[TMP0]], align 4 // BENUMLOADS-NEXT: ret void @@ -288,7 +300,8 @@ // LEWIDTH-NEXT: entry: // LEWIDTH-NEXT: [[TMP0:%.*]] = bitcast %struct.st1* [[M:%.*]] to i16* // LEWIDTH-NEXT: [[BF_LOAD:%.*]] = load i16, i16* [[TMP0]], align 4 -// LEWIDTH-NEXT: [[BF_CLEAR:%.*]] = and i16 [[BF_LOAD]], 1023 +// LEWIDTH-NEXT: [[BF_FREEZE:%.*]] = freeze i16 [[BF_LOAD]] +// LEWIDTH-NEXT: [[BF_CLEAR:%.*]] = and i16 [[BF_FREEZE]], 1023 // LEWIDTH-NEXT: [[BF_SET:%.*]] = or i16 [[BF_CLEAR]], 1024 // LEWIDTH-NEXT: store i16 [[BF_SET]], i16* [[TMP0]], align 4 // LEWIDTH-NEXT: ret void @@ -297,7 +310,8 @@ // BEWIDTH-NEXT: entry: // BEWIDTH-NEXT: [[TMP0:%.*]] = bitcast %struct.st1* [[M:%.*]] to i16* // BEWIDTH-NEXT: [[BF_LOAD:%.*]] = load i16, i16* [[TMP0]], align 4 -// BEWIDTH-NEXT: [[BF_CLEAR:%.*]] = and i16 [[BF_LOAD]], -64 +// BEWIDTH-NEXT: [[BF_FREEZE:%.*]] = freeze i16 [[BF_LOAD]] +// BEWIDTH-NEXT: [[BF_CLEAR:%.*]] = and i16 [[BF_FREEZE]], -64 // BEWIDTH-NEXT: [[BF_SET:%.*]] = or i16 [[BF_CLEAR]], 1 // BEWIDTH-NEXT: store i16 [[BF_SET]], i16* [[TMP0]], align 4 // BEWIDTH-NEXT: ret void @@ -306,7 +320,8 @@ // LEWIDTHNUM-NEXT: entry: // LEWIDTHNUM-NEXT: [[TMP0:%.*]] = bitcast %struct.st1* [[M:%.*]] to i16* // LEWIDTHNUM-NEXT: [[BF_LOAD:%.*]] = load i16, i16* [[TMP0]], align 4 -// LEWIDTHNUM-NEXT: [[BF_CLEAR:%.*]] = and i16 [[BF_LOAD]], 1023 +// LEWIDTHNUM-NEXT: [[BF_FREEZE:%.*]] = freeze i16 [[BF_LOAD]] +// LEWIDTHNUM-NEXT: [[BF_CLEAR:%.*]] = and i16 [[BF_FREEZE]], 1023 // LEWIDTHNUM-NEXT: [[BF_SET:%.*]] = or i16 [[BF_CLEAR]], 1024 // LEWIDTHNUM-NEXT: store i16 [[BF_SET]], i16* [[TMP0]], align 4 // LEWIDTHNUM-NEXT: ret void @@ -315,7 +330,8 @@ // BEWIDTHNUM-NEXT: entry: // BEWIDTHNUM-NEXT: [[TMP0:%.*]] = bitcast %struct.st1* [[M:%.*]] to i16* // BEWIDTHNUM-NEXT: [[BF_LOAD:%.*]] = load i16, i16* [[TMP0]], align 4 -// BEWIDTHNUM-NEXT: [[BF_CLEAR:%.*]] = and i16 [[BF_LOAD]], -64 +// BEWIDTHNUM-NEXT: [[BF_FREEZE:%.*]] = freeze i16 [[BF_LOAD]] +// BEWIDTHNUM-NEXT: [[BF_CLEAR:%.*]] = and i16 [[BF_FREEZE]], -64 // BEWIDTHNUM-NEXT: [[BF_SET:%.*]] = or i16 [[BF_CLEAR]], 1 // BEWIDTHNUM-NEXT: store i16 [[BF_SET]], i16* [[TMP0]], align 4 // BEWIDTHNUM-NEXT: ret void @@ -413,7 +429,8 @@ // LE-NEXT: entry: // LE-NEXT: [[C:%.*]] = getelementptr inbounds [[STRUCT_ST2:%.*]], %struct.st2* [[M:%.*]], i32 0, i32 1 // LE-NEXT: [[BF_LOAD:%.*]] = load i8, i8* [[C]], align 2 -// LE-NEXT: [[BF_CLEAR:%.*]] = and i8 [[BF_LOAD]], -128 +// LE-NEXT: [[BF_FREEZE:%.*]] = freeze i8 [[BF_LOAD]] +// LE-NEXT: [[BF_CLEAR:%.*]] = and i8 [[BF_FREEZE]], -128 // LE-NEXT: [[BF_SET:%.*]] = or i8 [[BF_CLEAR]], 1 // LE-NEXT: store i8 [[BF_SET]], i8* [[C]], align 2 // LE-NEXT: ret void @@ -422,7 +439,8 @@ // BE-NEXT: entry: // BE-NEXT: [[C:%.*]] = getelementptr inbounds [[STRUCT_ST2:%.*]], %struct.st2* [[M:%.*]], i32 0, i32 1 // BE-NEXT: [[BF_LOAD:%.*]] = load i8, i8* [[C]], align 2 -// BE-NEXT: [[BF_CLEAR:%.*]] = and i8 [[BF_LOAD]], 1 +// BE-NEXT: [[BF_FREEZE:%.*]] = freeze i8 [[BF_LOAD]] +// BE-NEXT: [[BF_CLEAR:%.*]] = and i8 [[BF_FREEZE]], 1 // BE-NEXT: [[BF_SET:%.*]] = or i8 [[BF_CLEAR]], 2 // BE-NEXT: store i8 [[BF_SET]], i8* [[C]], align 2 // BE-NEXT: ret void @@ -431,7 +449,8 @@ // LENUMLOADS-NEXT: entry: // LENUMLOADS-NEXT: [[C:%.*]] = getelementptr inbounds [[STRUCT_ST2:%.*]], %struct.st2* [[M:%.*]], i32 0, i32 1 // LENUMLOADS-NEXT: [[BF_LOAD:%.*]] = load i8, i8* [[C]], align 2 -// LENUMLOADS-NEXT: [[BF_CLEAR:%.*]] = and i8 [[BF_LOAD]], -128 +// LENUMLOADS-NEXT: [[BF_FREEZE:%.*]] = freeze i8 [[BF_LOAD]] +// LENUMLOADS-NEXT: [[BF_CLEAR:%.*]] = and i8 [[BF_FREEZE]], -128 // LENUMLOADS-NEXT: [[BF_SET:%.*]] = or i8 [[BF_CLEAR]], 1 // LENUMLOADS-NEXT: store i8 [[BF_SET]], i8* [[C]], align 2 // LENUMLOADS-NEXT: ret void @@ -440,7 +459,8 @@ // BENUMLOADS-NEXT: entry: // BENUMLOADS-NEXT: [[C:%.*]] = getelementptr inbounds [[STRUCT_ST2:%.*]], %struct.st2* [[M:%.*]], i32 0, i32 1 // BENUMLOADS-NEXT: [[BF_LOAD:%.*]] = load i8, i8* [[C]], align 2 -// BENUMLOADS-NEXT: [[BF_CLEAR:%.*]] = and i8 [[BF_LOAD]], 1 +// BENUMLOADS-NEXT: [[BF_FREEZE:%.*]] = freeze i8 [[BF_LOAD]] +// BENUMLOADS-NEXT: [[BF_CLEAR:%.*]] = and i8 [[BF_FREEZE]], 1 // BENUMLOADS-NEXT: [[BF_SET:%.*]] = or i8 [[BF_CLEAR]], 2 // BENUMLOADS-NEXT: store i8 [[BF_SET]], i8* [[C]], align 2 // BENUMLOADS-NEXT: ret void @@ -449,7 +469,8 @@ // LEWIDTH-NEXT: entry: // LEWIDTH-NEXT: [[C:%.*]] = getelementptr inbounds [[STRUCT_ST2:%.*]], %struct.st2* [[M:%.*]], i32 0, i32 1 // LEWIDTH-NEXT: [[BF_LOAD:%.*]] = load i8, i8* [[C]], align 2 -// LEWIDTH-NEXT: [[BF_CLEAR:%.*]] = and i8 [[BF_LOAD]], -128 +// LEWIDTH-NEXT: [[BF_FREEZE:%.*]] = freeze i8 [[BF_LOAD]] +// LEWIDTH-NEXT: [[BF_CLEAR:%.*]] = and i8 [[BF_FREEZE]], -128 // LEWIDTH-NEXT: [[BF_SET:%.*]] = or i8 [[BF_CLEAR]], 1 // LEWIDTH-NEXT: store i8 [[BF_SET]], i8* [[C]], align 2 // LEWIDTH-NEXT: ret void @@ -458,7 +479,8 @@ // BEWIDTH-NEXT: entry: // BEWIDTH-NEXT: [[C:%.*]] = getelementptr inbounds [[STRUCT_ST2:%.*]], %struct.st2* [[M:%.*]], i32 0, i32 1 // BEWIDTH-NEXT: [[BF_LOAD:%.*]] = load i8, i8* [[C]], align 2 -// BEWIDTH-NEXT: [[BF_CLEAR:%.*]] = and i8 [[BF_LOAD]], 1 +// BEWIDTH-NEXT: [[BF_FREEZE:%.*]] = freeze i8 [[BF_LOAD]] +// BEWIDTH-NEXT: [[BF_CLEAR:%.*]] = and i8 [[BF_FREEZE]], 1 // BEWIDTH-NEXT: [[BF_SET:%.*]] = or i8 [[BF_CLEAR]], 2 // BEWIDTH-NEXT: store i8 [[BF_SET]], i8* [[C]], align 2 // BEWIDTH-NEXT: ret void @@ -467,7 +489,8 @@ // LEWIDTHNUM-NEXT: entry: // LEWIDTHNUM-NEXT: [[C:%.*]] = getelementptr inbounds [[STRUCT_ST2:%.*]], %struct.st2* [[M:%.*]], i32 0, i32 1 // LEWIDTHNUM-NEXT: [[BF_LOAD:%.*]] = load i8, i8* [[C]], align 2 -// LEWIDTHNUM-NEXT: [[BF_CLEAR:%.*]] = and i8 [[BF_LOAD]], -128 +// LEWIDTHNUM-NEXT: [[BF_FREEZE:%.*]] = freeze i8 [[BF_LOAD]] +// LEWIDTHNUM-NEXT: [[BF_CLEAR:%.*]] = and i8 [[BF_FREEZE]], -128 // LEWIDTHNUM-NEXT: [[BF_SET:%.*]] = or i8 [[BF_CLEAR]], 1 // LEWIDTHNUM-NEXT: store i8 [[BF_SET]], i8* [[C]], align 2 // LEWIDTHNUM-NEXT: ret void @@ -476,7 +499,8 @@ // BEWIDTHNUM-NEXT: entry: // BEWIDTHNUM-NEXT: [[C:%.*]] = getelementptr inbounds [[STRUCT_ST2:%.*]], %struct.st2* [[M:%.*]], i32 0, i32 1 // BEWIDTHNUM-NEXT: [[BF_LOAD:%.*]] = load i8, i8* [[C]], align 2 -// BEWIDTHNUM-NEXT: [[BF_CLEAR:%.*]] = and i8 [[BF_LOAD]], 1 +// BEWIDTHNUM-NEXT: [[BF_FREEZE:%.*]] = freeze i8 [[BF_LOAD]] +// BEWIDTHNUM-NEXT: [[BF_CLEAR:%.*]] = and i8 [[BF_FREEZE]], 1 // BEWIDTHNUM-NEXT: [[BF_SET:%.*]] = or i8 [[BF_CLEAR]], 2 // BEWIDTHNUM-NEXT: store i8 [[BF_SET]], i8* [[C]], align 2 // BEWIDTHNUM-NEXT: ret void @@ -569,7 +593,8 @@ // LE-NEXT: entry: // LE-NEXT: [[TMP0:%.*]] = bitcast %struct.st3* [[M:%.*]] to i8* // LE-NEXT: [[BF_LOAD:%.*]] = load volatile i8, i8* [[TMP0]], align 2 -// LE-NEXT: [[BF_CLEAR:%.*]] = and i8 [[BF_LOAD]], -128 +// LE-NEXT: [[BF_FREEZE:%.*]] = freeze i8 [[BF_LOAD]] +// LE-NEXT: [[BF_CLEAR:%.*]] = and i8 [[BF_FREEZE]], -128 // LE-NEXT: [[BF_SET:%.*]] = or i8 [[BF_CLEAR]], 1 // LE-NEXT: store volatile i8 [[BF_SET]], i8* [[TMP0]], align 2 // LE-NEXT: ret void @@ -578,7 +603,8 @@ // BE-NEXT: entry: // BE-NEXT: [[TMP0:%.*]] = bitcast %struct.st3* [[M:%.*]] to i8* // BE-NEXT: [[BF_LOAD:%.*]] = load volatile i8, i8* [[TMP0]], align 2 -// BE-NEXT: [[BF_CLEAR:%.*]] = and i8 [[BF_LOAD]], 1 +// BE-NEXT: [[BF_FREEZE:%.*]] = freeze i8 [[BF_LOAD]] +// BE-NEXT: [[BF_CLEAR:%.*]] = and i8 [[BF_FREEZE]], 1 // BE-NEXT: [[BF_SET:%.*]] = or i8 [[BF_CLEAR]], 2 // BE-NEXT: store volatile i8 [[BF_SET]], i8* [[TMP0]], align 2 // BE-NEXT: ret void @@ -587,7 +613,8 @@ // LENUMLOADS-NEXT: entry: // LENUMLOADS-NEXT: [[TMP0:%.*]] = bitcast %struct.st3* [[M:%.*]] to i8* // LENUMLOADS-NEXT: [[BF_LOAD:%.*]] = load volatile i8, i8* [[TMP0]], align 2 -// LENUMLOADS-NEXT: [[BF_CLEAR:%.*]] = and i8 [[BF_LOAD]], -128 +// LENUMLOADS-NEXT: [[BF_FREEZE:%.*]] = freeze i8 [[BF_LOAD]] +// LENUMLOADS-NEXT: [[BF_CLEAR:%.*]] = and i8 [[BF_FREEZE]], -128 // LENUMLOADS-NEXT: [[BF_SET:%.*]] = or i8 [[BF_CLEAR]], 1 // LENUMLOADS-NEXT: store volatile i8 [[BF_SET]], i8* [[TMP0]], align 2 // LENUMLOADS-NEXT: ret void @@ -596,7 +623,8 @@ // BENUMLOADS-NEXT: entry: // BENUMLOADS-NEXT: [[TMP0:%.*]] = bitcast %struct.st3* [[M:%.*]] to i8* // BENUMLOADS-NEXT: [[BF_LOAD:%.*]] = load volatile i8, i8* [[TMP0]], align 2 -// BENUMLOADS-NEXT: [[BF_CLEAR:%.*]] = and i8 [[BF_LOAD]], 1 +// BENUMLOADS-NEXT: [[BF_FREEZE:%.*]] = freeze i8 [[BF_LOAD]] +// BENUMLOADS-NEXT: [[BF_CLEAR:%.*]] = and i8 [[BF_FREEZE]], 1 // BENUMLOADS-NEXT: [[BF_SET:%.*]] = or i8 [[BF_CLEAR]], 2 // BENUMLOADS-NEXT: store volatile i8 [[BF_SET]], i8* [[TMP0]], align 2 // BENUMLOADS-NEXT: ret void @@ -605,7 +633,8 @@ // LEWIDTH-NEXT: entry: // LEWIDTH-NEXT: [[TMP0:%.*]] = bitcast %struct.st3* [[M:%.*]] to i16* // LEWIDTH-NEXT: [[BF_LOAD:%.*]] = load volatile i16, i16* [[TMP0]], align 2 -// LEWIDTH-NEXT: [[BF_CLEAR:%.*]] = and i16 [[BF_LOAD]], -128 +// LEWIDTH-NEXT: [[BF_FREEZE:%.*]] = freeze i16 [[BF_LOAD]] +// LEWIDTH-NEXT: [[BF_CLEAR:%.*]] = and i16 [[BF_FREEZE]], -128 // LEWIDTH-NEXT: [[BF_SET:%.*]] = or i16 [[BF_CLEAR]], 1 // LEWIDTH-NEXT: store volatile i16 [[BF_SET]], i16* [[TMP0]], align 2 // LEWIDTH-NEXT: ret void @@ -614,7 +643,8 @@ // BEWIDTH-NEXT: entry: // BEWIDTH-NEXT: [[TMP0:%.*]] = bitcast %struct.st3* [[M:%.*]] to i16* // BEWIDTH-NEXT: [[BF_LOAD:%.*]] = load volatile i16, i16* [[TMP0]], align 2 -// BEWIDTH-NEXT: [[BF_CLEAR:%.*]] = and i16 [[BF_LOAD]], 511 +// BEWIDTH-NEXT: [[BF_FREEZE:%.*]] = freeze i16 [[BF_LOAD]] +// BEWIDTH-NEXT: [[BF_CLEAR:%.*]] = and i16 [[BF_FREEZE]], 511 // BEWIDTH-NEXT: [[BF_SET:%.*]] = or i16 [[BF_CLEAR]], 512 // BEWIDTH-NEXT: store volatile i16 [[BF_SET]], i16* [[TMP0]], align 2 // BEWIDTH-NEXT: ret void @@ -623,7 +653,8 @@ // LEWIDTHNUM-NEXT: entry: // LEWIDTHNUM-NEXT: [[TMP0:%.*]] = bitcast %struct.st3* [[M:%.*]] to i16* // LEWIDTHNUM-NEXT: [[BF_LOAD:%.*]] = load volatile i16, i16* [[TMP0]], align 2 -// LEWIDTHNUM-NEXT: [[BF_CLEAR:%.*]] = and i16 [[BF_LOAD]], -128 +// LEWIDTHNUM-NEXT: [[BF_FREEZE:%.*]] = freeze i16 [[BF_LOAD]] +// LEWIDTHNUM-NEXT: [[BF_CLEAR:%.*]] = and i16 [[BF_FREEZE]], -128 // LEWIDTHNUM-NEXT: [[BF_SET:%.*]] = or i16 [[BF_CLEAR]], 1 // LEWIDTHNUM-NEXT: store volatile i16 [[BF_SET]], i16* [[TMP0]], align 2 // LEWIDTHNUM-NEXT: ret void @@ -632,7 +663,8 @@ // BEWIDTHNUM-NEXT: entry: // BEWIDTHNUM-NEXT: [[TMP0:%.*]] = bitcast %struct.st3* [[M:%.*]] to i16* // BEWIDTHNUM-NEXT: [[BF_LOAD:%.*]] = load volatile i16, i16* [[TMP0]], align 2 -// BEWIDTHNUM-NEXT: [[BF_CLEAR:%.*]] = and i16 [[BF_LOAD]], 511 +// BEWIDTHNUM-NEXT: [[BF_FREEZE:%.*]] = freeze i16 [[BF_LOAD]] +// BEWIDTHNUM-NEXT: [[BF_CLEAR:%.*]] = and i16 [[BF_FREEZE]], 511 // BEWIDTHNUM-NEXT: [[BF_SET:%.*]] = or i16 [[BF_CLEAR]], 512 // BEWIDTHNUM-NEXT: store volatile i16 [[BF_SET]], i16* [[TMP0]], align 2 // BEWIDTHNUM-NEXT: ret void @@ -734,7 +766,8 @@ // LE-NEXT: entry: // LE-NEXT: [[TMP0:%.*]] = bitcast %struct.st4* [[M:%.*]] to i16* // LE-NEXT: [[BF_LOAD:%.*]] = load volatile i16, i16* [[TMP0]], align 4 -// LE-NEXT: [[BF_CLEAR:%.*]] = and i16 [[BF_LOAD]], -15873 +// LE-NEXT: [[BF_FREEZE:%.*]] = freeze i16 [[BF_LOAD]] +// LE-NEXT: [[BF_CLEAR:%.*]] = and i16 [[BF_FREEZE]], -15873 // LE-NEXT: [[BF_SET:%.*]] = or i16 [[BF_CLEAR]], 512 // LE-NEXT: store volatile i16 [[BF_SET]], i16* [[TMP0]], align 4 // LE-NEXT: ret void @@ -743,7 +776,8 @@ // BE-NEXT: entry: // BE-NEXT: [[TMP0:%.*]] = bitcast %struct.st4* [[M:%.*]] to i16* // BE-NEXT: [[BF_LOAD:%.*]] = load volatile i16, i16* [[TMP0]], align 4 -// BE-NEXT: [[BF_CLEAR:%.*]] = and i16 [[BF_LOAD]], -125 +// BE-NEXT: [[BF_FREEZE:%.*]] = freeze i16 [[BF_LOAD]] +// BE-NEXT: [[BF_CLEAR:%.*]] = and i16 [[BF_FREEZE]], -125 // BE-NEXT: [[BF_SET:%.*]] = or i16 [[BF_CLEAR]], 4 // BE-NEXT: store volatile i16 [[BF_SET]], i16* [[TMP0]], align 4 // BE-NEXT: ret void @@ -752,7 +786,8 @@ // LENUMLOADS-NEXT: entry: // LENUMLOADS-NEXT: [[TMP0:%.*]] = bitcast %struct.st4* [[M:%.*]] to i16* // LENUMLOADS-NEXT: [[BF_LOAD:%.*]] = load volatile i16, i16* [[TMP0]], align 4 -// LENUMLOADS-NEXT: [[BF_CLEAR:%.*]] = and i16 [[BF_LOAD]], -15873 +// LENUMLOADS-NEXT: [[BF_FREEZE:%.*]] = freeze i16 [[BF_LOAD]] +// LENUMLOADS-NEXT: [[BF_CLEAR:%.*]] = and i16 [[BF_FREEZE]], -15873 // LENUMLOADS-NEXT: [[BF_SET:%.*]] = or i16 [[BF_CLEAR]], 512 // LENUMLOADS-NEXT: store volatile i16 [[BF_SET]], i16* [[TMP0]], align 4 // LENUMLOADS-NEXT: ret void @@ -761,7 +796,8 @@ // BENUMLOADS-NEXT: entry: // BENUMLOADS-NEXT: [[TMP0:%.*]] = bitcast %struct.st4* [[M:%.*]] to i16* // BENUMLOADS-NEXT: [[BF_LOAD:%.*]] = load volatile i16, i16* [[TMP0]], align 4 -// BENUMLOADS-NEXT: [[BF_CLEAR:%.*]] = and i16 [[BF_LOAD]], -125 +// BENUMLOADS-NEXT: [[BF_FREEZE:%.*]] = freeze i16 [[BF_LOAD]] +// BENUMLOADS-NEXT: [[BF_CLEAR:%.*]] = and i16 [[BF_FREEZE]], -125 // BENUMLOADS-NEXT: [[BF_SET:%.*]] = or i16 [[BF_CLEAR]], 4 // BENUMLOADS-NEXT: store volatile i16 [[BF_SET]], i16* [[TMP0]], align 4 // BENUMLOADS-NEXT: ret void @@ -771,7 +807,8 @@ // LEWIDTH-NEXT: [[TMP0:%.*]] = bitcast %struct.st4* [[M:%.*]] to i8* // LEWIDTH-NEXT: [[TMP1:%.*]] = getelementptr inbounds i8, i8* [[TMP0]], i32 1 // LEWIDTH-NEXT: [[BF_LOAD:%.*]] = load volatile i8, i8* [[TMP1]], align 1 -// LEWIDTH-NEXT: [[BF_CLEAR:%.*]] = and i8 [[BF_LOAD]], -63 +// LEWIDTH-NEXT: [[BF_FREEZE:%.*]] = freeze i8 [[BF_LOAD]] +// LEWIDTH-NEXT: [[BF_CLEAR:%.*]] = and i8 [[BF_FREEZE]], -63 // LEWIDTH-NEXT: [[BF_SET:%.*]] = or i8 [[BF_CLEAR]], 2 // LEWIDTH-NEXT: store volatile i8 [[BF_SET]], i8* [[TMP1]], align 1 // LEWIDTH-NEXT: ret void @@ -781,7 +818,8 @@ // BEWIDTH-NEXT: [[TMP0:%.*]] = bitcast %struct.st4* [[M:%.*]] to i8* // BEWIDTH-NEXT: [[TMP1:%.*]] = getelementptr inbounds i8, i8* [[TMP0]], i32 1 // BEWIDTH-NEXT: [[BF_LOAD:%.*]] = load volatile i8, i8* [[TMP1]], align 1 -// BEWIDTH-NEXT: [[BF_CLEAR:%.*]] = and i8 [[BF_LOAD]], -125 +// BEWIDTH-NEXT: [[BF_FREEZE:%.*]] = freeze i8 [[BF_LOAD]] +// BEWIDTH-NEXT: [[BF_CLEAR:%.*]] = and i8 [[BF_FREEZE]], -125 // BEWIDTH-NEXT: [[BF_SET:%.*]] = or i8 [[BF_CLEAR]], 4 // BEWIDTH-NEXT: store volatile i8 [[BF_SET]], i8* [[TMP1]], align 1 // BEWIDTH-NEXT: ret void @@ -791,7 +829,8 @@ // LEWIDTHNUM-NEXT: [[TMP0:%.*]] = bitcast %struct.st4* [[M:%.*]] to i8* // LEWIDTHNUM-NEXT: [[TMP1:%.*]] = getelementptr inbounds i8, i8* [[TMP0]], i32 1 // LEWIDTHNUM-NEXT: [[BF_LOAD:%.*]] = load volatile i8, i8* [[TMP1]], align 1 -// LEWIDTHNUM-NEXT: [[BF_CLEAR:%.*]] = and i8 [[BF_LOAD]], -63 +// LEWIDTHNUM-NEXT: [[BF_FREEZE:%.*]] = freeze i8 [[BF_LOAD]] +// LEWIDTHNUM-NEXT: [[BF_CLEAR:%.*]] = and i8 [[BF_FREEZE]], -63 // LEWIDTHNUM-NEXT: [[BF_SET:%.*]] = or i8 [[BF_CLEAR]], 2 // LEWIDTHNUM-NEXT: store volatile i8 [[BF_SET]], i8* [[TMP1]], align 1 // LEWIDTHNUM-NEXT: ret void @@ -801,7 +840,8 @@ // BEWIDTHNUM-NEXT: [[TMP0:%.*]] = bitcast %struct.st4* [[M:%.*]] to i8* // BEWIDTHNUM-NEXT: [[TMP1:%.*]] = getelementptr inbounds i8, i8* [[TMP0]], i32 1 // BEWIDTHNUM-NEXT: [[BF_LOAD:%.*]] = load volatile i8, i8* [[TMP1]], align 1 -// BEWIDTHNUM-NEXT: [[BF_CLEAR:%.*]] = and i8 [[BF_LOAD]], -125 +// BEWIDTHNUM-NEXT: [[BF_FREEZE:%.*]] = freeze i8 [[BF_LOAD]] +// BEWIDTHNUM-NEXT: [[BF_CLEAR:%.*]] = and i8 [[BF_FREEZE]], -125 // BEWIDTHNUM-NEXT: [[BF_SET:%.*]] = or i8 [[BF_CLEAR]], 4 // BEWIDTHNUM-NEXT: store volatile i8 [[BF_SET]], i8* [[TMP1]], align 1 // BEWIDTHNUM-NEXT: ret void @@ -814,7 +854,8 @@ // LE-NEXT: entry: // LE-NEXT: [[TMP0:%.*]] = bitcast %struct.st4* [[M:%.*]] to i16* // LE-NEXT: [[BF_LOAD:%.*]] = load i16, i16* [[TMP0]], align 4 -// LE-NEXT: [[BF_CLEAR:%.*]] = and i16 [[BF_LOAD]], -512 +// LE-NEXT: [[BF_FREEZE:%.*]] = freeze i16 [[BF_LOAD]] +// LE-NEXT: [[BF_CLEAR:%.*]] = and i16 [[BF_FREEZE]], -512 // LE-NEXT: [[BF_SET:%.*]] = or i16 [[BF_CLEAR]], 1 // LE-NEXT: store i16 [[BF_SET]], i16* [[TMP0]], align 4 // LE-NEXT: ret void @@ -823,7 +864,8 @@ // BE-NEXT: entry: // BE-NEXT: [[TMP0:%.*]] = bitcast %struct.st4* [[M:%.*]] to i16* // BE-NEXT: [[BF_LOAD:%.*]] = load i16, i16* [[TMP0]], align 4 -// BE-NEXT: [[BF_CLEAR:%.*]] = and i16 [[BF_LOAD]], 127 +// BE-NEXT: [[BF_FREEZE:%.*]] = freeze i16 [[BF_LOAD]] +// BE-NEXT: [[BF_CLEAR:%.*]] = and i16 [[BF_FREEZE]], 127 // BE-NEXT: [[BF_SET:%.*]] = or i16 [[BF_CLEAR]], 128 // BE-NEXT: store i16 [[BF_SET]], i16* [[TMP0]], align 4 // BE-NEXT: ret void @@ -832,7 +874,8 @@ // LENUMLOADS-NEXT: entry: // LENUMLOADS-NEXT: [[TMP0:%.*]] = bitcast %struct.st4* [[M:%.*]] to i16* // LENUMLOADS-NEXT: [[BF_LOAD:%.*]] = load i16, i16* [[TMP0]], align 4 -// LENUMLOADS-NEXT: [[BF_CLEAR:%.*]] = and i16 [[BF_LOAD]], -512 +// LENUMLOADS-NEXT: [[BF_FREEZE:%.*]] = freeze i16 [[BF_LOAD]] +// LENUMLOADS-NEXT: [[BF_CLEAR:%.*]] = and i16 [[BF_FREEZE]], -512 // LENUMLOADS-NEXT: [[BF_SET:%.*]] = or i16 [[BF_CLEAR]], 1 // LENUMLOADS-NEXT: store i16 [[BF_SET]], i16* [[TMP0]], align 4 // LENUMLOADS-NEXT: ret void @@ -841,7 +884,8 @@ // BENUMLOADS-NEXT: entry: // BENUMLOADS-NEXT: [[TMP0:%.*]] = bitcast %struct.st4* [[M:%.*]] to i16* // BENUMLOADS-NEXT: [[BF_LOAD:%.*]] = load i16, i16* [[TMP0]], align 4 -// BENUMLOADS-NEXT: [[BF_CLEAR:%.*]] = and i16 [[BF_LOAD]], 127 +// BENUMLOADS-NEXT: [[BF_FREEZE:%.*]] = freeze i16 [[BF_LOAD]] +// BENUMLOADS-NEXT: [[BF_CLEAR:%.*]] = and i16 [[BF_FREEZE]], 127 // BENUMLOADS-NEXT: [[BF_SET:%.*]] = or i16 [[BF_CLEAR]], 128 // BENUMLOADS-NEXT: store i16 [[BF_SET]], i16* [[TMP0]], align 4 // BENUMLOADS-NEXT: ret void @@ -850,7 +894,8 @@ // LEWIDTH-NEXT: entry: // LEWIDTH-NEXT: [[TMP0:%.*]] = bitcast %struct.st4* [[M:%.*]] to i16* // LEWIDTH-NEXT: [[BF_LOAD:%.*]] = load i16, i16* [[TMP0]], align 4 -// LEWIDTH-NEXT: [[BF_CLEAR:%.*]] = and i16 [[BF_LOAD]], -512 +// LEWIDTH-NEXT: [[BF_FREEZE:%.*]] = freeze i16 [[BF_LOAD]] +// LEWIDTH-NEXT: [[BF_CLEAR:%.*]] = and i16 [[BF_FREEZE]], -512 // LEWIDTH-NEXT: [[BF_SET:%.*]] = or i16 [[BF_CLEAR]], 1 // LEWIDTH-NEXT: store i16 [[BF_SET]], i16* [[TMP0]], align 4 // LEWIDTH-NEXT: ret void @@ -859,7 +904,8 @@ // BEWIDTH-NEXT: entry: // BEWIDTH-NEXT: [[TMP0:%.*]] = bitcast %struct.st4* [[M:%.*]] to i16* // BEWIDTH-NEXT: [[BF_LOAD:%.*]] = load i16, i16* [[TMP0]], align 4 -// BEWIDTH-NEXT: [[BF_CLEAR:%.*]] = and i16 [[BF_LOAD]], 127 +// BEWIDTH-NEXT: [[BF_FREEZE:%.*]] = freeze i16 [[BF_LOAD]] +// BEWIDTH-NEXT: [[BF_CLEAR:%.*]] = and i16 [[BF_FREEZE]], 127 // BEWIDTH-NEXT: [[BF_SET:%.*]] = or i16 [[BF_CLEAR]], 128 // BEWIDTH-NEXT: store i16 [[BF_SET]], i16* [[TMP0]], align 4 // BEWIDTH-NEXT: ret void @@ -868,7 +914,8 @@ // LEWIDTHNUM-NEXT: entry: // LEWIDTHNUM-NEXT: [[TMP0:%.*]] = bitcast %struct.st4* [[M:%.*]] to i16* // LEWIDTHNUM-NEXT: [[BF_LOAD:%.*]] = load i16, i16* [[TMP0]], align 4 -// LEWIDTHNUM-NEXT: [[BF_CLEAR:%.*]] = and i16 [[BF_LOAD]], -512 +// LEWIDTHNUM-NEXT: [[BF_FREEZE:%.*]] = freeze i16 [[BF_LOAD]] +// LEWIDTHNUM-NEXT: [[BF_CLEAR:%.*]] = and i16 [[BF_FREEZE]], -512 // LEWIDTHNUM-NEXT: [[BF_SET:%.*]] = or i16 [[BF_CLEAR]], 1 // LEWIDTHNUM-NEXT: store i16 [[BF_SET]], i16* [[TMP0]], align 4 // LEWIDTHNUM-NEXT: ret void @@ -877,7 +924,8 @@ // BEWIDTHNUM-NEXT: entry: // BEWIDTHNUM-NEXT: [[TMP0:%.*]] = bitcast %struct.st4* [[M:%.*]] to i16* // BEWIDTHNUM-NEXT: [[BF_LOAD:%.*]] = load i16, i16* [[TMP0]], align 4 -// BEWIDTHNUM-NEXT: [[BF_CLEAR:%.*]] = and i16 [[BF_LOAD]], 127 +// BEWIDTHNUM-NEXT: [[BF_FREEZE:%.*]] = freeze i16 [[BF_LOAD]] +// BEWIDTHNUM-NEXT: [[BF_CLEAR:%.*]] = and i16 [[BF_FREEZE]], 127 // BEWIDTHNUM-NEXT: [[BF_SET:%.*]] = or i16 [[BF_CLEAR]], 128 // BEWIDTHNUM-NEXT: store i16 [[BF_SET]], i16* [[TMP0]], align 4 // BEWIDTHNUM-NEXT: ret void @@ -967,7 +1015,8 @@ // LE-NEXT: entry: // LE-NEXT: [[C:%.*]] = getelementptr inbounds [[STRUCT_ST5:%.*]], %struct.st5* [[M:%.*]], i32 0, i32 1 // LE-NEXT: [[BF_LOAD:%.*]] = load volatile i8, i8* [[C]], align 2 -// LE-NEXT: [[BF_CLEAR:%.*]] = and i8 [[BF_LOAD]], -32 +// LE-NEXT: [[BF_FREEZE:%.*]] = freeze i8 [[BF_LOAD]] +// LE-NEXT: [[BF_CLEAR:%.*]] = and i8 [[BF_FREEZE]], -32 // LE-NEXT: [[BF_SET:%.*]] = or i8 [[BF_CLEAR]], 1 // LE-NEXT: store volatile i8 [[BF_SET]], i8* [[C]], align 2 // LE-NEXT: ret void @@ -976,7 +1025,8 @@ // BE-NEXT: entry: // BE-NEXT: [[C:%.*]] = getelementptr inbounds [[STRUCT_ST5:%.*]], %struct.st5* [[M:%.*]], i32 0, i32 1 // BE-NEXT: [[BF_LOAD:%.*]] = load volatile i8, i8* [[C]], align 2 -// BE-NEXT: [[BF_CLEAR:%.*]] = and i8 [[BF_LOAD]], 7 +// BE-NEXT: [[BF_FREEZE:%.*]] = freeze i8 [[BF_LOAD]] +// BE-NEXT: [[BF_CLEAR:%.*]] = and i8 [[BF_FREEZE]], 7 // BE-NEXT: [[BF_SET:%.*]] = or i8 [[BF_CLEAR]], 8 // BE-NEXT: store volatile i8 [[BF_SET]], i8* [[C]], align 2 // BE-NEXT: ret void @@ -985,7 +1035,8 @@ // LENUMLOADS-NEXT: entry: // LENUMLOADS-NEXT: [[C:%.*]] = getelementptr inbounds [[STRUCT_ST5:%.*]], %struct.st5* [[M:%.*]], i32 0, i32 1 // LENUMLOADS-NEXT: [[BF_LOAD:%.*]] = load volatile i8, i8* [[C]], align 2 -// LENUMLOADS-NEXT: [[BF_CLEAR:%.*]] = and i8 [[BF_LOAD]], -32 +// LENUMLOADS-NEXT: [[BF_FREEZE:%.*]] = freeze i8 [[BF_LOAD]] +// LENUMLOADS-NEXT: [[BF_CLEAR:%.*]] = and i8 [[BF_FREEZE]], -32 // LENUMLOADS-NEXT: [[BF_SET:%.*]] = or i8 [[BF_CLEAR]], 1 // LENUMLOADS-NEXT: store volatile i8 [[BF_SET]], i8* [[C]], align 2 // LENUMLOADS-NEXT: ret void @@ -994,7 +1045,8 @@ // BENUMLOADS-NEXT: entry: // BENUMLOADS-NEXT: [[C:%.*]] = getelementptr inbounds [[STRUCT_ST5:%.*]], %struct.st5* [[M:%.*]], i32 0, i32 1 // BENUMLOADS-NEXT: [[BF_LOAD:%.*]] = load volatile i8, i8* [[C]], align 2 -// BENUMLOADS-NEXT: [[BF_CLEAR:%.*]] = and i8 [[BF_LOAD]], 7 +// BENUMLOADS-NEXT: [[BF_FREEZE:%.*]] = freeze i8 [[BF_LOAD]] +// BENUMLOADS-NEXT: [[BF_CLEAR:%.*]] = and i8 [[BF_FREEZE]], 7 // BENUMLOADS-NEXT: [[BF_SET:%.*]] = or i8 [[BF_CLEAR]], 8 // BENUMLOADS-NEXT: store volatile i8 [[BF_SET]], i8* [[C]], align 2 // BENUMLOADS-NEXT: ret void @@ -1003,7 +1055,8 @@ // LEWIDTH-NEXT: entry: // LEWIDTH-NEXT: [[C:%.*]] = getelementptr inbounds [[STRUCT_ST5:%.*]], %struct.st5* [[M:%.*]], i32 0, i32 1 // LEWIDTH-NEXT: [[BF_LOAD:%.*]] = load volatile i8, i8* [[C]], align 2 -// LEWIDTH-NEXT: [[BF_CLEAR:%.*]] = and i8 [[BF_LOAD]], -32 +// LEWIDTH-NEXT: [[BF_FREEZE:%.*]] = freeze i8 [[BF_LOAD]] +// LEWIDTH-NEXT: [[BF_CLEAR:%.*]] = and i8 [[BF_FREEZE]], -32 // LEWIDTH-NEXT: [[BF_SET:%.*]] = or i8 [[BF_CLEAR]], 1 // LEWIDTH-NEXT: store volatile i8 [[BF_SET]], i8* [[C]], align 2 // LEWIDTH-NEXT: ret void @@ -1012,7 +1065,8 @@ // BEWIDTH-NEXT: entry: // BEWIDTH-NEXT: [[C:%.*]] = getelementptr inbounds [[STRUCT_ST5:%.*]], %struct.st5* [[M:%.*]], i32 0, i32 1 // BEWIDTH-NEXT: [[BF_LOAD:%.*]] = load volatile i8, i8* [[C]], align 2 -// BEWIDTH-NEXT: [[BF_CLEAR:%.*]] = and i8 [[BF_LOAD]], 7 +// BEWIDTH-NEXT: [[BF_FREEZE:%.*]] = freeze i8 [[BF_LOAD]] +// BEWIDTH-NEXT: [[BF_CLEAR:%.*]] = and i8 [[BF_FREEZE]], 7 // BEWIDTH-NEXT: [[BF_SET:%.*]] = or i8 [[BF_CLEAR]], 8 // BEWIDTH-NEXT: store volatile i8 [[BF_SET]], i8* [[C]], align 2 // BEWIDTH-NEXT: ret void @@ -1021,7 +1075,8 @@ // LEWIDTHNUM-NEXT: entry: // LEWIDTHNUM-NEXT: [[C:%.*]] = getelementptr inbounds [[STRUCT_ST5:%.*]], %struct.st5* [[M:%.*]], i32 0, i32 1 // LEWIDTHNUM-NEXT: [[BF_LOAD:%.*]] = load volatile i8, i8* [[C]], align 2 -// LEWIDTHNUM-NEXT: [[BF_CLEAR:%.*]] = and i8 [[BF_LOAD]], -32 +// LEWIDTHNUM-NEXT: [[BF_FREEZE:%.*]] = freeze i8 [[BF_LOAD]] +// LEWIDTHNUM-NEXT: [[BF_CLEAR:%.*]] = and i8 [[BF_FREEZE]], -32 // LEWIDTHNUM-NEXT: [[BF_SET:%.*]] = or i8 [[BF_CLEAR]], 1 // LEWIDTHNUM-NEXT: store volatile i8 [[BF_SET]], i8* [[C]], align 2 // LEWIDTHNUM-NEXT: ret void @@ -1030,7 +1085,8 @@ // BEWIDTHNUM-NEXT: entry: // BEWIDTHNUM-NEXT: [[C:%.*]] = getelementptr inbounds [[STRUCT_ST5:%.*]], %struct.st5* [[M:%.*]], i32 0, i32 1 // BEWIDTHNUM-NEXT: [[BF_LOAD:%.*]] = load volatile i8, i8* [[C]], align 2 -// BEWIDTHNUM-NEXT: [[BF_CLEAR:%.*]] = and i8 [[BF_LOAD]], 7 +// BEWIDTHNUM-NEXT: [[BF_FREEZE:%.*]] = freeze i8 [[BF_LOAD]] +// BEWIDTHNUM-NEXT: [[BF_CLEAR:%.*]] = and i8 [[BF_FREEZE]], 7 // BEWIDTHNUM-NEXT: [[BF_SET:%.*]] = or i8 [[BF_CLEAR]], 8 // BEWIDTHNUM-NEXT: store volatile i8 [[BF_SET]], i8* [[C]], align 2 // BEWIDTHNUM-NEXT: ret void @@ -1200,128 +1256,144 @@ // LE-NEXT: entry: // LE-NEXT: [[TMP0:%.*]] = bitcast %struct.st6* [[M:%.*]] to i16* // LE-NEXT: [[BF_LOAD:%.*]] = load i16, i16* [[TMP0]], align 4 -// LE-NEXT: [[BF_CLEAR:%.*]] = and i16 [[BF_LOAD]], -4096 +// LE-NEXT: [[BF_FREEZE:%.*]] = freeze i16 [[BF_LOAD]] +// LE-NEXT: [[BF_CLEAR:%.*]] = and i16 [[BF_FREEZE]], -4096 // LE-NEXT: [[BF_SET:%.*]] = or i16 [[BF_CLEAR]], 1 // LE-NEXT: store i16 [[BF_SET]], i16* [[TMP0]], align 4 // LE-NEXT: [[B:%.*]] = getelementptr inbounds [[STRUCT_ST6:%.*]], %struct.st6* [[M]], i32 0, i32 1 // LE-NEXT: store i8 2, i8* [[B]], align 2 // LE-NEXT: [[C:%.*]] = getelementptr inbounds [[STRUCT_ST6]], %struct.st6* [[M]], i32 0, i32 2 // LE-NEXT: [[BF_LOAD1:%.*]] = load i8, i8* [[C]], align 1 -// LE-NEXT: [[BF_CLEAR2:%.*]] = and i8 [[BF_LOAD1]], -32 -// LE-NEXT: [[BF_SET3:%.*]] = or i8 [[BF_CLEAR2]], 3 -// LE-NEXT: store i8 [[BF_SET3]], i8* [[C]], align 1 +// LE-NEXT: [[BF_FREEZE2:%.*]] = freeze i8 [[BF_LOAD1]] +// LE-NEXT: [[BF_CLEAR3:%.*]] = and i8 [[BF_FREEZE2]], -32 +// LE-NEXT: [[BF_SET4:%.*]] = or i8 [[BF_CLEAR3]], 3 +// LE-NEXT: store i8 [[BF_SET4]], i8* [[C]], align 1 // LE-NEXT: ret void // // BE-LABEL: @st6_check_store( // BE-NEXT: entry: // BE-NEXT: [[TMP0:%.*]] = bitcast %struct.st6* [[M:%.*]] to i16* // BE-NEXT: [[BF_LOAD:%.*]] = load i16, i16* [[TMP0]], align 4 -// BE-NEXT: [[BF_CLEAR:%.*]] = and i16 [[BF_LOAD]], 15 +// BE-NEXT: [[BF_FREEZE:%.*]] = freeze i16 [[BF_LOAD]] +// BE-NEXT: [[BF_CLEAR:%.*]] = and i16 [[BF_FREEZE]], 15 // BE-NEXT: [[BF_SET:%.*]] = or i16 [[BF_CLEAR]], 16 // BE-NEXT: store i16 [[BF_SET]], i16* [[TMP0]], align 4 // BE-NEXT: [[B:%.*]] = getelementptr inbounds [[STRUCT_ST6:%.*]], %struct.st6* [[M]], i32 0, i32 1 // BE-NEXT: store i8 2, i8* [[B]], align 2 // BE-NEXT: [[C:%.*]] = getelementptr inbounds [[STRUCT_ST6]], %struct.st6* [[M]], i32 0, i32 2 // BE-NEXT: [[BF_LOAD1:%.*]] = load i8, i8* [[C]], align 1 -// BE-NEXT: [[BF_CLEAR2:%.*]] = and i8 [[BF_LOAD1]], 7 -// BE-NEXT: [[BF_SET3:%.*]] = or i8 [[BF_CLEAR2]], 24 -// BE-NEXT: store i8 [[BF_SET3]], i8* [[C]], align 1 +// BE-NEXT: [[BF_FREEZE2:%.*]] = freeze i8 [[BF_LOAD1]] +// BE-NEXT: [[BF_CLEAR3:%.*]] = and i8 [[BF_FREEZE2]], 7 +// BE-NEXT: [[BF_SET4:%.*]] = or i8 [[BF_CLEAR3]], 24 +// BE-NEXT: store i8 [[BF_SET4]], i8* [[C]], align 1 // BE-NEXT: ret void // // LENUMLOADS-LABEL: @st6_check_store( // LENUMLOADS-NEXT: entry: // LENUMLOADS-NEXT: [[TMP0:%.*]] = bitcast %struct.st6* [[M:%.*]] to i16* // LENUMLOADS-NEXT: [[BF_LOAD:%.*]] = load i16, i16* [[TMP0]], align 4 -// LENUMLOADS-NEXT: [[BF_CLEAR:%.*]] = and i16 [[BF_LOAD]], -4096 +// LENUMLOADS-NEXT: [[BF_FREEZE:%.*]] = freeze i16 [[BF_LOAD]] +// LENUMLOADS-NEXT: [[BF_CLEAR:%.*]] = and i16 [[BF_FREEZE]], -4096 // LENUMLOADS-NEXT: [[BF_SET:%.*]] = or i16 [[BF_CLEAR]], 1 // LENUMLOADS-NEXT: store i16 [[BF_SET]], i16* [[TMP0]], align 4 // LENUMLOADS-NEXT: [[B:%.*]] = getelementptr inbounds [[STRUCT_ST6:%.*]], %struct.st6* [[M]], i32 0, i32 1 // LENUMLOADS-NEXT: store i8 2, i8* [[B]], align 2 // LENUMLOADS-NEXT: [[C:%.*]] = getelementptr inbounds [[STRUCT_ST6]], %struct.st6* [[M]], i32 0, i32 2 // LENUMLOADS-NEXT: [[BF_LOAD1:%.*]] = load i8, i8* [[C]], align 1 -// LENUMLOADS-NEXT: [[BF_CLEAR2:%.*]] = and i8 [[BF_LOAD1]], -32 -// LENUMLOADS-NEXT: [[BF_SET3:%.*]] = or i8 [[BF_CLEAR2]], 3 -// LENUMLOADS-NEXT: store i8 [[BF_SET3]], i8* [[C]], align 1 +// LENUMLOADS-NEXT: [[BF_FREEZE2:%.*]] = freeze i8 [[BF_LOAD1]] +// LENUMLOADS-NEXT: [[BF_CLEAR3:%.*]] = and i8 [[BF_FREEZE2]], -32 +// LENUMLOADS-NEXT: [[BF_SET4:%.*]] = or i8 [[BF_CLEAR3]], 3 +// LENUMLOADS-NEXT: store i8 [[BF_SET4]], i8* [[C]], align 1 // LENUMLOADS-NEXT: ret void // // BENUMLOADS-LABEL: @st6_check_store( // BENUMLOADS-NEXT: entry: // BENUMLOADS-NEXT: [[TMP0:%.*]] = bitcast %struct.st6* [[M:%.*]] to i16* // BENUMLOADS-NEXT: [[BF_LOAD:%.*]] = load i16, i16* [[TMP0]], align 4 -// BENUMLOADS-NEXT: [[BF_CLEAR:%.*]] = and i16 [[BF_LOAD]], 15 +// BENUMLOADS-NEXT: [[BF_FREEZE:%.*]] = freeze i16 [[BF_LOAD]] +// BENUMLOADS-NEXT: [[BF_CLEAR:%.*]] = and i16 [[BF_FREEZE]], 15 // BENUMLOADS-NEXT: [[BF_SET:%.*]] = or i16 [[BF_CLEAR]], 16 // BENUMLOADS-NEXT: store i16 [[BF_SET]], i16* [[TMP0]], align 4 // BENUMLOADS-NEXT: [[B:%.*]] = getelementptr inbounds [[STRUCT_ST6:%.*]], %struct.st6* [[M]], i32 0, i32 1 // BENUMLOADS-NEXT: store i8 2, i8* [[B]], align 2 // BENUMLOADS-NEXT: [[C:%.*]] = getelementptr inbounds [[STRUCT_ST6]], %struct.st6* [[M]], i32 0, i32 2 // BENUMLOADS-NEXT: [[BF_LOAD1:%.*]] = load i8, i8* [[C]], align 1 -// BENUMLOADS-NEXT: [[BF_CLEAR2:%.*]] = and i8 [[BF_LOAD1]], 7 -// BENUMLOADS-NEXT: [[BF_SET3:%.*]] = or i8 [[BF_CLEAR2]], 24 -// BENUMLOADS-NEXT: store i8 [[BF_SET3]], i8* [[C]], align 1 +// BENUMLOADS-NEXT: [[BF_FREEZE2:%.*]] = freeze i8 [[BF_LOAD1]] +// BENUMLOADS-NEXT: [[BF_CLEAR3:%.*]] = and i8 [[BF_FREEZE2]], 7 +// BENUMLOADS-NEXT: [[BF_SET4:%.*]] = or i8 [[BF_CLEAR3]], 24 +// BENUMLOADS-NEXT: store i8 [[BF_SET4]], i8* [[C]], align 1 // BENUMLOADS-NEXT: ret void // // LEWIDTH-LABEL: @st6_check_store( // LEWIDTH-NEXT: entry: // LEWIDTH-NEXT: [[TMP0:%.*]] = bitcast %struct.st6* [[M:%.*]] to i16* // LEWIDTH-NEXT: [[BF_LOAD:%.*]] = load i16, i16* [[TMP0]], align 4 -// LEWIDTH-NEXT: [[BF_CLEAR:%.*]] = and i16 [[BF_LOAD]], -4096 +// LEWIDTH-NEXT: [[BF_FREEZE:%.*]] = freeze i16 [[BF_LOAD]] +// LEWIDTH-NEXT: [[BF_CLEAR:%.*]] = and i16 [[BF_FREEZE]], -4096 // LEWIDTH-NEXT: [[BF_SET:%.*]] = or i16 [[BF_CLEAR]], 1 // LEWIDTH-NEXT: store i16 [[BF_SET]], i16* [[TMP0]], align 4 // LEWIDTH-NEXT: [[B:%.*]] = getelementptr inbounds [[STRUCT_ST6:%.*]], %struct.st6* [[M]], i32 0, i32 1 // LEWIDTH-NEXT: store i8 2, i8* [[B]], align 2 // LEWIDTH-NEXT: [[C:%.*]] = getelementptr inbounds [[STRUCT_ST6]], %struct.st6* [[M]], i32 0, i32 2 // LEWIDTH-NEXT: [[BF_LOAD1:%.*]] = load i8, i8* [[C]], align 1 -// LEWIDTH-NEXT: [[BF_CLEAR2:%.*]] = and i8 [[BF_LOAD1]], -32 -// LEWIDTH-NEXT: [[BF_SET3:%.*]] = or i8 [[BF_CLEAR2]], 3 -// LEWIDTH-NEXT: store i8 [[BF_SET3]], i8* [[C]], align 1 +// LEWIDTH-NEXT: [[BF_FREEZE2:%.*]] = freeze i8 [[BF_LOAD1]] +// LEWIDTH-NEXT: [[BF_CLEAR3:%.*]] = and i8 [[BF_FREEZE2]], -32 +// LEWIDTH-NEXT: [[BF_SET4:%.*]] = or i8 [[BF_CLEAR3]], 3 +// LEWIDTH-NEXT: store i8 [[BF_SET4]], i8* [[C]], align 1 // LEWIDTH-NEXT: ret void // // BEWIDTH-LABEL: @st6_check_store( // BEWIDTH-NEXT: entry: // BEWIDTH-NEXT: [[TMP0:%.*]] = bitcast %struct.st6* [[M:%.*]] to i16* // BEWIDTH-NEXT: [[BF_LOAD:%.*]] = load i16, i16* [[TMP0]], align 4 -// BEWIDTH-NEXT: [[BF_CLEAR:%.*]] = and i16 [[BF_LOAD]], 15 +// BEWIDTH-NEXT: [[BF_FREEZE:%.*]] = freeze i16 [[BF_LOAD]] +// BEWIDTH-NEXT: [[BF_CLEAR:%.*]] = and i16 [[BF_FREEZE]], 15 // BEWIDTH-NEXT: [[BF_SET:%.*]] = or i16 [[BF_CLEAR]], 16 // BEWIDTH-NEXT: store i16 [[BF_SET]], i16* [[TMP0]], align 4 // BEWIDTH-NEXT: [[B:%.*]] = getelementptr inbounds [[STRUCT_ST6:%.*]], %struct.st6* [[M]], i32 0, i32 1 // BEWIDTH-NEXT: store i8 2, i8* [[B]], align 2 // BEWIDTH-NEXT: [[C:%.*]] = getelementptr inbounds [[STRUCT_ST6]], %struct.st6* [[M]], i32 0, i32 2 // BEWIDTH-NEXT: [[BF_LOAD1:%.*]] = load i8, i8* [[C]], align 1 -// BEWIDTH-NEXT: [[BF_CLEAR2:%.*]] = and i8 [[BF_LOAD1]], 7 -// BEWIDTH-NEXT: [[BF_SET3:%.*]] = or i8 [[BF_CLEAR2]], 24 -// BEWIDTH-NEXT: store i8 [[BF_SET3]], i8* [[C]], align 1 +// BEWIDTH-NEXT: [[BF_FREEZE2:%.*]] = freeze i8 [[BF_LOAD1]] +// BEWIDTH-NEXT: [[BF_CLEAR3:%.*]] = and i8 [[BF_FREEZE2]], 7 +// BEWIDTH-NEXT: [[BF_SET4:%.*]] = or i8 [[BF_CLEAR3]], 24 +// BEWIDTH-NEXT: store i8 [[BF_SET4]], i8* [[C]], align 1 // BEWIDTH-NEXT: ret void // // LEWIDTHNUM-LABEL: @st6_check_store( // LEWIDTHNUM-NEXT: entry: // LEWIDTHNUM-NEXT: [[TMP0:%.*]] = bitcast %struct.st6* [[M:%.*]] to i16* // LEWIDTHNUM-NEXT: [[BF_LOAD:%.*]] = load i16, i16* [[TMP0]], align 4 -// LEWIDTHNUM-NEXT: [[BF_CLEAR:%.*]] = and i16 [[BF_LOAD]], -4096 +// LEWIDTHNUM-NEXT: [[BF_FREEZE:%.*]] = freeze i16 [[BF_LOAD]] +// LEWIDTHNUM-NEXT: [[BF_CLEAR:%.*]] = and i16 [[BF_FREEZE]], -4096 // LEWIDTHNUM-NEXT: [[BF_SET:%.*]] = or i16 [[BF_CLEAR]], 1 // LEWIDTHNUM-NEXT: store i16 [[BF_SET]], i16* [[TMP0]], align 4 // LEWIDTHNUM-NEXT: [[B:%.*]] = getelementptr inbounds [[STRUCT_ST6:%.*]], %struct.st6* [[M]], i32 0, i32 1 // LEWIDTHNUM-NEXT: store i8 2, i8* [[B]], align 2 // LEWIDTHNUM-NEXT: [[C:%.*]] = getelementptr inbounds [[STRUCT_ST6]], %struct.st6* [[M]], i32 0, i32 2 // LEWIDTHNUM-NEXT: [[BF_LOAD1:%.*]] = load i8, i8* [[C]], align 1 -// LEWIDTHNUM-NEXT: [[BF_CLEAR2:%.*]] = and i8 [[BF_LOAD1]], -32 -// LEWIDTHNUM-NEXT: [[BF_SET3:%.*]] = or i8 [[BF_CLEAR2]], 3 -// LEWIDTHNUM-NEXT: store i8 [[BF_SET3]], i8* [[C]], align 1 +// LEWIDTHNUM-NEXT: [[BF_FREEZE2:%.*]] = freeze i8 [[BF_LOAD1]] +// LEWIDTHNUM-NEXT: [[BF_CLEAR3:%.*]] = and i8 [[BF_FREEZE2]], -32 +// LEWIDTHNUM-NEXT: [[BF_SET4:%.*]] = or i8 [[BF_CLEAR3]], 3 +// LEWIDTHNUM-NEXT: store i8 [[BF_SET4]], i8* [[C]], align 1 // LEWIDTHNUM-NEXT: ret void // // BEWIDTHNUM-LABEL: @st6_check_store( // BEWIDTHNUM-NEXT: entry: // BEWIDTHNUM-NEXT: [[TMP0:%.*]] = bitcast %struct.st6* [[M:%.*]] to i16* // BEWIDTHNUM-NEXT: [[BF_LOAD:%.*]] = load i16, i16* [[TMP0]], align 4 -// BEWIDTHNUM-NEXT: [[BF_CLEAR:%.*]] = and i16 [[BF_LOAD]], 15 +// BEWIDTHNUM-NEXT: [[BF_FREEZE:%.*]] = freeze i16 [[BF_LOAD]] +// BEWIDTHNUM-NEXT: [[BF_CLEAR:%.*]] = and i16 [[BF_FREEZE]], 15 // BEWIDTHNUM-NEXT: [[BF_SET:%.*]] = or i16 [[BF_CLEAR]], 16 // BEWIDTHNUM-NEXT: store i16 [[BF_SET]], i16* [[TMP0]], align 4 // BEWIDTHNUM-NEXT: [[B:%.*]] = getelementptr inbounds [[STRUCT_ST6:%.*]], %struct.st6* [[M]], i32 0, i32 1 // BEWIDTHNUM-NEXT: store i8 2, i8* [[B]], align 2 // BEWIDTHNUM-NEXT: [[C:%.*]] = getelementptr inbounds [[STRUCT_ST6]], %struct.st6* [[M]], i32 0, i32 2 // BEWIDTHNUM-NEXT: [[BF_LOAD1:%.*]] = load i8, i8* [[C]], align 1 -// BEWIDTHNUM-NEXT: [[BF_CLEAR2:%.*]] = and i8 [[BF_LOAD1]], 7 -// BEWIDTHNUM-NEXT: [[BF_SET3:%.*]] = or i8 [[BF_CLEAR2]], 24 -// BEWIDTHNUM-NEXT: store i8 [[BF_SET3]], i8* [[C]], align 1 +// BEWIDTHNUM-NEXT: [[BF_FREEZE2:%.*]] = freeze i8 [[BF_LOAD1]] +// BEWIDTHNUM-NEXT: [[BF_CLEAR3:%.*]] = and i8 [[BF_FREEZE2]], 7 +// BEWIDTHNUM-NEXT: [[BF_SET4:%.*]] = or i8 [[BF_CLEAR3]], 24 +// BEWIDTHNUM-NEXT: store i8 [[BF_SET4]], i8* [[C]], align 1 // BEWIDTHNUM-NEXT: ret void // void st6_check_store(struct st6 *m) { @@ -1506,7 +1578,8 @@ // LE-NEXT: [[Y1:%.*]] = getelementptr inbounds [[STRUCT_ST7B]], %struct.st7b* [[M]], i32 0, i32 2 // LE-NEXT: [[B:%.*]] = getelementptr inbounds [[STRUCT_ST7A]], %struct.st7a* [[Y1]], i32 0, i32 1 // LE-NEXT: [[BF_LOAD:%.*]] = load volatile i8, i8* [[B]], align 1 -// LE-NEXT: [[BF_CLEAR:%.*]] = and i8 [[BF_LOAD]], -32 +// LE-NEXT: [[BF_FREEZE:%.*]] = freeze i8 [[BF_LOAD]] +// LE-NEXT: [[BF_CLEAR:%.*]] = and i8 [[BF_FREEZE]], -32 // LE-NEXT: [[BF_SET:%.*]] = or i8 [[BF_CLEAR]], 3 // LE-NEXT: store volatile i8 [[BF_SET]], i8* [[B]], align 1 // LE-NEXT: ret void @@ -1521,7 +1594,8 @@ // BE-NEXT: [[Y1:%.*]] = getelementptr inbounds [[STRUCT_ST7B]], %struct.st7b* [[M]], i32 0, i32 2 // BE-NEXT: [[B:%.*]] = getelementptr inbounds [[STRUCT_ST7A]], %struct.st7a* [[Y1]], i32 0, i32 1 // BE-NEXT: [[BF_LOAD:%.*]] = load volatile i8, i8* [[B]], align 1 -// BE-NEXT: [[BF_CLEAR:%.*]] = and i8 [[BF_LOAD]], 7 +// BE-NEXT: [[BF_FREEZE:%.*]] = freeze i8 [[BF_LOAD]] +// BE-NEXT: [[BF_CLEAR:%.*]] = and i8 [[BF_FREEZE]], 7 // BE-NEXT: [[BF_SET:%.*]] = or i8 [[BF_CLEAR]], 24 // BE-NEXT: store volatile i8 [[BF_SET]], i8* [[B]], align 1 // BE-NEXT: ret void @@ -1536,7 +1610,8 @@ // LENUMLOADS-NEXT: [[Y1:%.*]] = getelementptr inbounds [[STRUCT_ST7B]], %struct.st7b* [[M]], i32 0, i32 2 // LENUMLOADS-NEXT: [[B:%.*]] = getelementptr inbounds [[STRUCT_ST7A]], %struct.st7a* [[Y1]], i32 0, i32 1 // LENUMLOADS-NEXT: [[BF_LOAD:%.*]] = load volatile i8, i8* [[B]], align 1 -// LENUMLOADS-NEXT: [[BF_CLEAR:%.*]] = and i8 [[BF_LOAD]], -32 +// LENUMLOADS-NEXT: [[BF_FREEZE:%.*]] = freeze i8 [[BF_LOAD]] +// LENUMLOADS-NEXT: [[BF_CLEAR:%.*]] = and i8 [[BF_FREEZE]], -32 // LENUMLOADS-NEXT: [[BF_SET:%.*]] = or i8 [[BF_CLEAR]], 3 // LENUMLOADS-NEXT: store volatile i8 [[BF_SET]], i8* [[B]], align 1 // LENUMLOADS-NEXT: ret void @@ -1551,7 +1626,8 @@ // BENUMLOADS-NEXT: [[Y1:%.*]] = getelementptr inbounds [[STRUCT_ST7B]], %struct.st7b* [[M]], i32 0, i32 2 // BENUMLOADS-NEXT: [[B:%.*]] = getelementptr inbounds [[STRUCT_ST7A]], %struct.st7a* [[Y1]], i32 0, i32 1 // BENUMLOADS-NEXT: [[BF_LOAD:%.*]] = load volatile i8, i8* [[B]], align 1 -// BENUMLOADS-NEXT: [[BF_CLEAR:%.*]] = and i8 [[BF_LOAD]], 7 +// BENUMLOADS-NEXT: [[BF_FREEZE:%.*]] = freeze i8 [[BF_LOAD]] +// BENUMLOADS-NEXT: [[BF_CLEAR:%.*]] = and i8 [[BF_FREEZE]], 7 // BENUMLOADS-NEXT: [[BF_SET:%.*]] = or i8 [[BF_CLEAR]], 24 // BENUMLOADS-NEXT: store volatile i8 [[BF_SET]], i8* [[B]], align 1 // BENUMLOADS-NEXT: ret void @@ -1566,7 +1642,8 @@ // LEWIDTH-NEXT: [[Y1:%.*]] = getelementptr inbounds [[STRUCT_ST7B]], %struct.st7b* [[M]], i32 0, i32 2 // LEWIDTH-NEXT: [[B:%.*]] = getelementptr inbounds [[STRUCT_ST7A]], %struct.st7a* [[Y1]], i32 0, i32 1 // LEWIDTH-NEXT: [[BF_LOAD:%.*]] = load volatile i8, i8* [[B]], align 1 -// LEWIDTH-NEXT: [[BF_CLEAR:%.*]] = and i8 [[BF_LOAD]], -32 +// LEWIDTH-NEXT: [[BF_FREEZE:%.*]] = freeze i8 [[BF_LOAD]] +// LEWIDTH-NEXT: [[BF_CLEAR:%.*]] = and i8 [[BF_FREEZE]], -32 // LEWIDTH-NEXT: [[BF_SET:%.*]] = or i8 [[BF_CLEAR]], 3 // LEWIDTH-NEXT: store volatile i8 [[BF_SET]], i8* [[B]], align 1 // LEWIDTH-NEXT: ret void @@ -1581,7 +1658,8 @@ // BEWIDTH-NEXT: [[Y1:%.*]] = getelementptr inbounds [[STRUCT_ST7B]], %struct.st7b* [[M]], i32 0, i32 2 // BEWIDTH-NEXT: [[B:%.*]] = getelementptr inbounds [[STRUCT_ST7A]], %struct.st7a* [[Y1]], i32 0, i32 1 // BEWIDTH-NEXT: [[BF_LOAD:%.*]] = load volatile i8, i8* [[B]], align 1 -// BEWIDTH-NEXT: [[BF_CLEAR:%.*]] = and i8 [[BF_LOAD]], 7 +// BEWIDTH-NEXT: [[BF_FREEZE:%.*]] = freeze i8 [[BF_LOAD]] +// BEWIDTH-NEXT: [[BF_CLEAR:%.*]] = and i8 [[BF_FREEZE]], 7 // BEWIDTH-NEXT: [[BF_SET:%.*]] = or i8 [[BF_CLEAR]], 24 // BEWIDTH-NEXT: store volatile i8 [[BF_SET]], i8* [[B]], align 1 // BEWIDTH-NEXT: ret void @@ -1596,7 +1674,8 @@ // LEWIDTHNUM-NEXT: [[Y1:%.*]] = getelementptr inbounds [[STRUCT_ST7B]], %struct.st7b* [[M]], i32 0, i32 2 // LEWIDTHNUM-NEXT: [[B:%.*]] = getelementptr inbounds [[STRUCT_ST7A]], %struct.st7a* [[Y1]], i32 0, i32 1 // LEWIDTHNUM-NEXT: [[BF_LOAD:%.*]] = load volatile i8, i8* [[B]], align 1 -// LEWIDTHNUM-NEXT: [[BF_CLEAR:%.*]] = and i8 [[BF_LOAD]], -32 +// LEWIDTHNUM-NEXT: [[BF_FREEZE:%.*]] = freeze i8 [[BF_LOAD]] +// LEWIDTHNUM-NEXT: [[BF_CLEAR:%.*]] = and i8 [[BF_FREEZE]], -32 // LEWIDTHNUM-NEXT: [[BF_SET:%.*]] = or i8 [[BF_CLEAR]], 3 // LEWIDTHNUM-NEXT: store volatile i8 [[BF_SET]], i8* [[B]], align 1 // LEWIDTHNUM-NEXT: ret void @@ -1611,7 +1690,8 @@ // BEWIDTHNUM-NEXT: [[Y1:%.*]] = getelementptr inbounds [[STRUCT_ST7B]], %struct.st7b* [[M]], i32 0, i32 2 // BEWIDTHNUM-NEXT: [[B:%.*]] = getelementptr inbounds [[STRUCT_ST7A]], %struct.st7a* [[Y1]], i32 0, i32 1 // BEWIDTHNUM-NEXT: [[BF_LOAD:%.*]] = load volatile i8, i8* [[B]], align 1 -// BEWIDTHNUM-NEXT: [[BF_CLEAR:%.*]] = and i8 [[BF_LOAD]], 7 +// BEWIDTHNUM-NEXT: [[BF_FREEZE:%.*]] = freeze i8 [[BF_LOAD]] +// BEWIDTHNUM-NEXT: [[BF_CLEAR:%.*]] = and i8 [[BF_FREEZE]], 7 // BEWIDTHNUM-NEXT: [[BF_SET:%.*]] = or i8 [[BF_CLEAR]], 24 // BEWIDTHNUM-NEXT: store volatile i8 [[BF_SET]], i8* [[B]], align 1 // BEWIDTHNUM-NEXT: ret void @@ -1775,7 +1855,8 @@ // LEWIDTH-NEXT: entry: // LEWIDTH-NEXT: [[TMP0:%.*]] = bitcast %struct.st9* [[M:%.*]] to i32* // LEWIDTH-NEXT: [[BF_LOAD:%.*]] = load volatile i32, i32* [[TMP0]], align 4 -// LEWIDTH-NEXT: [[BF_CLEAR:%.*]] = and i32 [[BF_LOAD]], -256 +// LEWIDTH-NEXT: [[BF_FREEZE:%.*]] = freeze i32 [[BF_LOAD]] +// LEWIDTH-NEXT: [[BF_CLEAR:%.*]] = and i32 [[BF_FREEZE]], -256 // LEWIDTH-NEXT: [[BF_SET:%.*]] = or i32 [[BF_CLEAR]], 1 // LEWIDTH-NEXT: store volatile i32 [[BF_SET]], i32* [[TMP0]], align 4 // LEWIDTH-NEXT: ret void @@ -1784,7 +1865,8 @@ // BEWIDTH-NEXT: entry: // BEWIDTH-NEXT: [[TMP0:%.*]] = bitcast %struct.st9* [[M:%.*]] to i32* // BEWIDTH-NEXT: [[BF_LOAD:%.*]] = load volatile i32, i32* [[TMP0]], align 4 -// BEWIDTH-NEXT: [[BF_CLEAR:%.*]] = and i32 [[BF_LOAD]], 16777215 +// BEWIDTH-NEXT: [[BF_FREEZE:%.*]] = freeze i32 [[BF_LOAD]] +// BEWIDTH-NEXT: [[BF_CLEAR:%.*]] = and i32 [[BF_FREEZE]], 16777215 // BEWIDTH-NEXT: [[BF_SET:%.*]] = or i32 [[BF_CLEAR]], 16777216 // BEWIDTH-NEXT: store volatile i32 [[BF_SET]], i32* [[TMP0]], align 4 // BEWIDTH-NEXT: ret void @@ -1793,7 +1875,8 @@ // LEWIDTHNUM-NEXT: entry: // LEWIDTHNUM-NEXT: [[TMP0:%.*]] = bitcast %struct.st9* [[M:%.*]] to i32* // LEWIDTHNUM-NEXT: [[BF_LOAD:%.*]] = load volatile i32, i32* [[TMP0]], align 4 -// LEWIDTHNUM-NEXT: [[BF_CLEAR:%.*]] = and i32 [[BF_LOAD]], -256 +// LEWIDTHNUM-NEXT: [[BF_FREEZE:%.*]] = freeze i32 [[BF_LOAD]] +// LEWIDTHNUM-NEXT: [[BF_CLEAR:%.*]] = and i32 [[BF_FREEZE]], -256 // LEWIDTHNUM-NEXT: [[BF_SET:%.*]] = or i32 [[BF_CLEAR]], 1 // LEWIDTHNUM-NEXT: store volatile i32 [[BF_SET]], i32* [[TMP0]], align 4 // LEWIDTHNUM-NEXT: ret void @@ -1802,7 +1885,8 @@ // BEWIDTHNUM-NEXT: entry: // BEWIDTHNUM-NEXT: [[TMP0:%.*]] = bitcast %struct.st9* [[M:%.*]] to i32* // BEWIDTHNUM-NEXT: [[BF_LOAD:%.*]] = load volatile i32, i32* [[TMP0]], align 4 -// BEWIDTHNUM-NEXT: [[BF_CLEAR:%.*]] = and i32 [[BF_LOAD]], 16777215 +// BEWIDTHNUM-NEXT: [[BF_FREEZE:%.*]] = freeze i32 [[BF_LOAD]] +// BEWIDTHNUM-NEXT: [[BF_CLEAR:%.*]] = and i32 [[BF_FREEZE]], 16777215 // BEWIDTHNUM-NEXT: [[BF_SET:%.*]] = or i32 [[BF_CLEAR]], 16777216 // BEWIDTHNUM-NEXT: store volatile i32 [[BF_SET]], i32* [[TMP0]], align 4 // BEWIDTHNUM-NEXT: ret void @@ -1865,8 +1949,9 @@ // LEWIDTH-NEXT: [[BF_ASHR:%.*]] = ashr i32 [[BF_SHL]], 24 // LEWIDTH-NEXT: [[INC:%.*]] = add nsw i32 [[BF_ASHR]], 1 // LEWIDTH-NEXT: [[BF_LOAD1:%.*]] = load volatile i32, i32* [[TMP0]], align 4 +// LEWIDTH-NEXT: [[BF_FREEZE:%.*]] = freeze i32 [[BF_LOAD1]] // LEWIDTH-NEXT: [[BF_VALUE:%.*]] = and i32 [[INC]], 255 -// LEWIDTH-NEXT: [[BF_CLEAR:%.*]] = and i32 [[BF_LOAD1]], -256 +// LEWIDTH-NEXT: [[BF_CLEAR:%.*]] = and i32 [[BF_FREEZE]], -256 // LEWIDTH-NEXT: [[BF_SET:%.*]] = or i32 [[BF_CLEAR]], [[BF_VALUE]] // LEWIDTH-NEXT: store volatile i32 [[BF_SET]], i32* [[TMP0]], align 4 // LEWIDTH-NEXT: [[BF_RESULT_SHL:%.*]] = shl i32 [[BF_VALUE]], 24 @@ -1880,9 +1965,10 @@ // BEWIDTH-NEXT: [[BF_ASHR:%.*]] = ashr i32 [[BF_LOAD]], 24 // BEWIDTH-NEXT: [[INC:%.*]] = add nsw i32 [[BF_ASHR]], 1 // BEWIDTH-NEXT: [[BF_LOAD1:%.*]] = load volatile i32, i32* [[TMP0]], align 4 +// BEWIDTH-NEXT: [[BF_FREEZE:%.*]] = freeze i32 [[BF_LOAD1]] // BEWIDTH-NEXT: [[BF_VALUE:%.*]] = and i32 [[INC]], 255 // BEWIDTH-NEXT: [[BF_SHL:%.*]] = shl i32 [[BF_VALUE]], 24 -// BEWIDTH-NEXT: [[BF_CLEAR:%.*]] = and i32 [[BF_LOAD1]], 16777215 +// BEWIDTH-NEXT: [[BF_CLEAR:%.*]] = and i32 [[BF_FREEZE]], 16777215 // BEWIDTH-NEXT: [[BF_SET:%.*]] = or i32 [[BF_CLEAR]], [[BF_SHL]] // BEWIDTH-NEXT: store volatile i32 [[BF_SET]], i32* [[TMP0]], align 4 // BEWIDTH-NEXT: [[BF_RESULT_SHL:%.*]] = shl i32 [[BF_VALUE]], 24 @@ -1897,8 +1983,9 @@ // LEWIDTHNUM-NEXT: [[BF_ASHR:%.*]] = ashr i32 [[BF_SHL]], 24 // LEWIDTHNUM-NEXT: [[INC:%.*]] = add nsw i32 [[BF_ASHR]], 1 // LEWIDTHNUM-NEXT: [[BF_LOAD1:%.*]] = load volatile i32, i32* [[TMP0]], align 4 +// LEWIDTHNUM-NEXT: [[BF_FREEZE:%.*]] = freeze i32 [[BF_LOAD1]] // LEWIDTHNUM-NEXT: [[BF_VALUE:%.*]] = and i32 [[INC]], 255 -// LEWIDTHNUM-NEXT: [[BF_CLEAR:%.*]] = and i32 [[BF_LOAD1]], -256 +// LEWIDTHNUM-NEXT: [[BF_CLEAR:%.*]] = and i32 [[BF_FREEZE]], -256 // LEWIDTHNUM-NEXT: [[BF_SET:%.*]] = or i32 [[BF_CLEAR]], [[BF_VALUE]] // LEWIDTHNUM-NEXT: store volatile i32 [[BF_SET]], i32* [[TMP0]], align 4 // LEWIDTHNUM-NEXT: [[BF_RESULT_SHL:%.*]] = shl i32 [[BF_VALUE]], 24 @@ -1912,9 +1999,10 @@ // BEWIDTHNUM-NEXT: [[BF_ASHR:%.*]] = ashr i32 [[BF_LOAD]], 24 // BEWIDTHNUM-NEXT: [[INC:%.*]] = add nsw i32 [[BF_ASHR]], 1 // BEWIDTHNUM-NEXT: [[BF_LOAD1:%.*]] = load volatile i32, i32* [[TMP0]], align 4 +// BEWIDTHNUM-NEXT: [[BF_FREEZE:%.*]] = freeze i32 [[BF_LOAD1]] // BEWIDTHNUM-NEXT: [[BF_VALUE:%.*]] = and i32 [[INC]], 255 // BEWIDTHNUM-NEXT: [[BF_SHL:%.*]] = shl i32 [[BF_VALUE]], 24 -// BEWIDTHNUM-NEXT: [[BF_CLEAR:%.*]] = and i32 [[BF_LOAD1]], 16777215 +// BEWIDTHNUM-NEXT: [[BF_CLEAR:%.*]] = and i32 [[BF_FREEZE]], 16777215 // BEWIDTHNUM-NEXT: [[BF_SET:%.*]] = or i32 [[BF_CLEAR]], [[BF_SHL]] // BEWIDTHNUM-NEXT: store volatile i32 [[BF_SET]], i32* [[TMP0]], align 4 // BEWIDTHNUM-NEXT: [[BF_RESULT_SHL:%.*]] = shl i32 [[BF_VALUE]], 24 @@ -2006,7 +2094,8 @@ // LE-NEXT: entry: // LE-NEXT: [[TMP0:%.*]] = bitcast %struct.st10* [[M:%.*]] to i16* // LE-NEXT: [[BF_LOAD:%.*]] = load volatile i16, i16* [[TMP0]], align 4 -// LE-NEXT: [[BF_CLEAR:%.*]] = and i16 [[BF_LOAD]], -511 +// LE-NEXT: [[BF_FREEZE:%.*]] = freeze i16 [[BF_LOAD]] +// LE-NEXT: [[BF_CLEAR:%.*]] = and i16 [[BF_FREEZE]], -511 // LE-NEXT: [[BF_SET:%.*]] = or i16 [[BF_CLEAR]], 2 // LE-NEXT: store volatile i16 [[BF_SET]], i16* [[TMP0]], align 4 // LE-NEXT: ret void @@ -2015,7 +2104,8 @@ // BE-NEXT: entry: // BE-NEXT: [[TMP0:%.*]] = bitcast %struct.st10* [[M:%.*]] to i16* // BE-NEXT: [[BF_LOAD:%.*]] = load volatile i16, i16* [[TMP0]], align 4 -// BE-NEXT: [[BF_CLEAR:%.*]] = and i16 [[BF_LOAD]], -32641 +// BE-NEXT: [[BF_FREEZE:%.*]] = freeze i16 [[BF_LOAD]] +// BE-NEXT: [[BF_CLEAR:%.*]] = and i16 [[BF_FREEZE]], -32641 // BE-NEXT: [[BF_SET:%.*]] = or i16 [[BF_CLEAR]], 128 // BE-NEXT: store volatile i16 [[BF_SET]], i16* [[TMP0]], align 4 // BE-NEXT: ret void @@ -2024,7 +2114,8 @@ // LENUMLOADS-NEXT: entry: // LENUMLOADS-NEXT: [[TMP0:%.*]] = bitcast %struct.st10* [[M:%.*]] to i16* // LENUMLOADS-NEXT: [[BF_LOAD:%.*]] = load volatile i16, i16* [[TMP0]], align 4 -// LENUMLOADS-NEXT: [[BF_CLEAR:%.*]] = and i16 [[BF_LOAD]], -511 +// LENUMLOADS-NEXT: [[BF_FREEZE:%.*]] = freeze i16 [[BF_LOAD]] +// LENUMLOADS-NEXT: [[BF_CLEAR:%.*]] = and i16 [[BF_FREEZE]], -511 // LENUMLOADS-NEXT: [[BF_SET:%.*]] = or i16 [[BF_CLEAR]], 2 // LENUMLOADS-NEXT: store volatile i16 [[BF_SET]], i16* [[TMP0]], align 4 // LENUMLOADS-NEXT: ret void @@ -2033,7 +2124,8 @@ // BENUMLOADS-NEXT: entry: // BENUMLOADS-NEXT: [[TMP0:%.*]] = bitcast %struct.st10* [[M:%.*]] to i16* // BENUMLOADS-NEXT: [[BF_LOAD:%.*]] = load volatile i16, i16* [[TMP0]], align 4 -// BENUMLOADS-NEXT: [[BF_CLEAR:%.*]] = and i16 [[BF_LOAD]], -32641 +// BENUMLOADS-NEXT: [[BF_FREEZE:%.*]] = freeze i16 [[BF_LOAD]] +// BENUMLOADS-NEXT: [[BF_CLEAR:%.*]] = and i16 [[BF_FREEZE]], -32641 // BENUMLOADS-NEXT: [[BF_SET:%.*]] = or i16 [[BF_CLEAR]], 128 // BENUMLOADS-NEXT: store volatile i16 [[BF_SET]], i16* [[TMP0]], align 4 // BENUMLOADS-NEXT: ret void @@ -2042,7 +2134,8 @@ // LEWIDTH-NEXT: entry: // LEWIDTH-NEXT: [[TMP0:%.*]] = bitcast %struct.st10* [[M:%.*]] to i32* // LEWIDTH-NEXT: [[BF_LOAD:%.*]] = load volatile i32, i32* [[TMP0]], align 4 -// LEWIDTH-NEXT: [[BF_CLEAR:%.*]] = and i32 [[BF_LOAD]], -511 +// LEWIDTH-NEXT: [[BF_FREEZE:%.*]] = freeze i32 [[BF_LOAD]] +// LEWIDTH-NEXT: [[BF_CLEAR:%.*]] = and i32 [[BF_FREEZE]], -511 // LEWIDTH-NEXT: [[BF_SET:%.*]] = or i32 [[BF_CLEAR]], 2 // LEWIDTH-NEXT: store volatile i32 [[BF_SET]], i32* [[TMP0]], align 4 // LEWIDTH-NEXT: ret void @@ -2051,7 +2144,8 @@ // BEWIDTH-NEXT: entry: // BEWIDTH-NEXT: [[TMP0:%.*]] = bitcast %struct.st10* [[M:%.*]] to i32* // BEWIDTH-NEXT: [[BF_LOAD:%.*]] = load volatile i32, i32* [[TMP0]], align 4 -// BEWIDTH-NEXT: [[BF_CLEAR:%.*]] = and i32 [[BF_LOAD]], -2139095041 +// BEWIDTH-NEXT: [[BF_FREEZE:%.*]] = freeze i32 [[BF_LOAD]] +// BEWIDTH-NEXT: [[BF_CLEAR:%.*]] = and i32 [[BF_FREEZE]], -2139095041 // BEWIDTH-NEXT: [[BF_SET:%.*]] = or i32 [[BF_CLEAR]], 8388608 // BEWIDTH-NEXT: store volatile i32 [[BF_SET]], i32* [[TMP0]], align 4 // BEWIDTH-NEXT: ret void @@ -2060,7 +2154,8 @@ // LEWIDTHNUM-NEXT: entry: // LEWIDTHNUM-NEXT: [[TMP0:%.*]] = bitcast %struct.st10* [[M:%.*]] to i32* // LEWIDTHNUM-NEXT: [[BF_LOAD:%.*]] = load volatile i32, i32* [[TMP0]], align 4 -// LEWIDTHNUM-NEXT: [[BF_CLEAR:%.*]] = and i32 [[BF_LOAD]], -511 +// LEWIDTHNUM-NEXT: [[BF_FREEZE:%.*]] = freeze i32 [[BF_LOAD]] +// LEWIDTHNUM-NEXT: [[BF_CLEAR:%.*]] = and i32 [[BF_FREEZE]], -511 // LEWIDTHNUM-NEXT: [[BF_SET:%.*]] = or i32 [[BF_CLEAR]], 2 // LEWIDTHNUM-NEXT: store volatile i32 [[BF_SET]], i32* [[TMP0]], align 4 // LEWIDTHNUM-NEXT: ret void @@ -2069,7 +2164,8 @@ // BEWIDTHNUM-NEXT: entry: // BEWIDTHNUM-NEXT: [[TMP0:%.*]] = bitcast %struct.st10* [[M:%.*]] to i32* // BEWIDTHNUM-NEXT: [[BF_LOAD:%.*]] = load volatile i32, i32* [[TMP0]], align 4 -// BEWIDTHNUM-NEXT: [[BF_CLEAR:%.*]] = and i32 [[BF_LOAD]], -2139095041 +// BEWIDTHNUM-NEXT: [[BF_FREEZE:%.*]] = freeze i32 [[BF_LOAD]] +// BEWIDTHNUM-NEXT: [[BF_CLEAR:%.*]] = and i32 [[BF_FREEZE]], -2139095041 // BEWIDTHNUM-NEXT: [[BF_SET:%.*]] = or i32 [[BF_CLEAR]], 8388608 // BEWIDTHNUM-NEXT: store volatile i32 [[BF_SET]], i32* [[TMP0]], align 4 // BEWIDTHNUM-NEXT: ret void @@ -2088,9 +2184,10 @@ // LE-NEXT: [[INC:%.*]] = add nsw i32 [[BF_CAST]], 1 // LE-NEXT: [[TMP1:%.*]] = trunc i32 [[INC]] to i16 // LE-NEXT: [[BF_LOAD1:%.*]] = load volatile i16, i16* [[TMP0]], align 4 +// LE-NEXT: [[BF_FREEZE:%.*]] = freeze i16 [[BF_LOAD1]] // LE-NEXT: [[BF_VALUE:%.*]] = and i16 [[TMP1]], 255 // LE-NEXT: [[BF_SHL2:%.*]] = shl i16 [[BF_VALUE]], 1 -// LE-NEXT: [[BF_CLEAR:%.*]] = and i16 [[BF_LOAD1]], -511 +// LE-NEXT: [[BF_CLEAR:%.*]] = and i16 [[BF_FREEZE]], -511 // LE-NEXT: [[BF_SET:%.*]] = or i16 [[BF_CLEAR]], [[BF_SHL2]] // LE-NEXT: store volatile i16 [[BF_SET]], i16* [[TMP0]], align 4 // LE-NEXT: [[BF_RESULT_SHL:%.*]] = shl i16 [[BF_VALUE]], 8 @@ -2108,9 +2205,10 @@ // BE-NEXT: [[INC:%.*]] = add nsw i32 [[BF_CAST]], 1 // BE-NEXT: [[TMP1:%.*]] = trunc i32 [[INC]] to i16 // BE-NEXT: [[BF_LOAD1:%.*]] = load volatile i16, i16* [[TMP0]], align 4 +// BE-NEXT: [[BF_FREEZE:%.*]] = freeze i16 [[BF_LOAD1]] // BE-NEXT: [[BF_VALUE:%.*]] = and i16 [[TMP1]], 255 // BE-NEXT: [[BF_SHL2:%.*]] = shl i16 [[BF_VALUE]], 7 -// BE-NEXT: [[BF_CLEAR:%.*]] = and i16 [[BF_LOAD1]], -32641 +// BE-NEXT: [[BF_CLEAR:%.*]] = and i16 [[BF_FREEZE]], -32641 // BE-NEXT: [[BF_SET:%.*]] = or i16 [[BF_CLEAR]], [[BF_SHL2]] // BE-NEXT: store volatile i16 [[BF_SET]], i16* [[TMP0]], align 4 // BE-NEXT: [[BF_RESULT_SHL:%.*]] = shl i16 [[BF_VALUE]], 8 @@ -2128,9 +2226,10 @@ // LENUMLOADS-NEXT: [[INC:%.*]] = add nsw i32 [[BF_CAST]], 1 // LENUMLOADS-NEXT: [[TMP1:%.*]] = trunc i32 [[INC]] to i16 // LENUMLOADS-NEXT: [[BF_LOAD1:%.*]] = load volatile i16, i16* [[TMP0]], align 4 +// LENUMLOADS-NEXT: [[BF_FREEZE:%.*]] = freeze i16 [[BF_LOAD1]] // LENUMLOADS-NEXT: [[BF_VALUE:%.*]] = and i16 [[TMP1]], 255 // LENUMLOADS-NEXT: [[BF_SHL2:%.*]] = shl i16 [[BF_VALUE]], 1 -// LENUMLOADS-NEXT: [[BF_CLEAR:%.*]] = and i16 [[BF_LOAD1]], -511 +// LENUMLOADS-NEXT: [[BF_CLEAR:%.*]] = and i16 [[BF_FREEZE]], -511 // LENUMLOADS-NEXT: [[BF_SET:%.*]] = or i16 [[BF_CLEAR]], [[BF_SHL2]] // LENUMLOADS-NEXT: store volatile i16 [[BF_SET]], i16* [[TMP0]], align 4 // LENUMLOADS-NEXT: [[BF_RESULT_SHL:%.*]] = shl i16 [[BF_VALUE]], 8 @@ -2148,9 +2247,10 @@ // BENUMLOADS-NEXT: [[INC:%.*]] = add nsw i32 [[BF_CAST]], 1 // BENUMLOADS-NEXT: [[TMP1:%.*]] = trunc i32 [[INC]] to i16 // BENUMLOADS-NEXT: [[BF_LOAD1:%.*]] = load volatile i16, i16* [[TMP0]], align 4 +// BENUMLOADS-NEXT: [[BF_FREEZE:%.*]] = freeze i16 [[BF_LOAD1]] // BENUMLOADS-NEXT: [[BF_VALUE:%.*]] = and i16 [[TMP1]], 255 // BENUMLOADS-NEXT: [[BF_SHL2:%.*]] = shl i16 [[BF_VALUE]], 7 -// BENUMLOADS-NEXT: [[BF_CLEAR:%.*]] = and i16 [[BF_LOAD1]], -32641 +// BENUMLOADS-NEXT: [[BF_CLEAR:%.*]] = and i16 [[BF_FREEZE]], -32641 // BENUMLOADS-NEXT: [[BF_SET:%.*]] = or i16 [[BF_CLEAR]], [[BF_SHL2]] // BENUMLOADS-NEXT: store volatile i16 [[BF_SET]], i16* [[TMP0]], align 4 // BENUMLOADS-NEXT: [[BF_RESULT_SHL:%.*]] = shl i16 [[BF_VALUE]], 8 @@ -2166,9 +2266,10 @@ // LEWIDTH-NEXT: [[BF_ASHR:%.*]] = ashr i32 [[BF_SHL]], 24 // LEWIDTH-NEXT: [[INC:%.*]] = add nsw i32 [[BF_ASHR]], 1 // LEWIDTH-NEXT: [[BF_LOAD1:%.*]] = load volatile i32, i32* [[TMP0]], align 4 +// LEWIDTH-NEXT: [[BF_FREEZE:%.*]] = freeze i32 [[BF_LOAD1]] // LEWIDTH-NEXT: [[BF_VALUE:%.*]] = and i32 [[INC]], 255 // LEWIDTH-NEXT: [[BF_SHL2:%.*]] = shl i32 [[BF_VALUE]], 1 -// LEWIDTH-NEXT: [[BF_CLEAR:%.*]] = and i32 [[BF_LOAD1]], -511 +// LEWIDTH-NEXT: [[BF_CLEAR:%.*]] = and i32 [[BF_FREEZE]], -511 // LEWIDTH-NEXT: [[BF_SET:%.*]] = or i32 [[BF_CLEAR]], [[BF_SHL2]] // LEWIDTH-NEXT: store volatile i32 [[BF_SET]], i32* [[TMP0]], align 4 // LEWIDTH-NEXT: [[BF_RESULT_SHL:%.*]] = shl i32 [[BF_VALUE]], 24 @@ -2183,9 +2284,10 @@ // BEWIDTH-NEXT: [[BF_ASHR:%.*]] = ashr i32 [[BF_SHL]], 24 // BEWIDTH-NEXT: [[INC:%.*]] = add nsw i32 [[BF_ASHR]], 1 // BEWIDTH-NEXT: [[BF_LOAD1:%.*]] = load volatile i32, i32* [[TMP0]], align 4 +// BEWIDTH-NEXT: [[BF_FREEZE:%.*]] = freeze i32 [[BF_LOAD1]] // BEWIDTH-NEXT: [[BF_VALUE:%.*]] = and i32 [[INC]], 255 // BEWIDTH-NEXT: [[BF_SHL2:%.*]] = shl i32 [[BF_VALUE]], 23 -// BEWIDTH-NEXT: [[BF_CLEAR:%.*]] = and i32 [[BF_LOAD1]], -2139095041 +// BEWIDTH-NEXT: [[BF_CLEAR:%.*]] = and i32 [[BF_FREEZE]], -2139095041 // BEWIDTH-NEXT: [[BF_SET:%.*]] = or i32 [[BF_CLEAR]], [[BF_SHL2]] // BEWIDTH-NEXT: store volatile i32 [[BF_SET]], i32* [[TMP0]], align 4 // BEWIDTH-NEXT: [[BF_RESULT_SHL:%.*]] = shl i32 [[BF_VALUE]], 24 @@ -2200,9 +2302,10 @@ // LEWIDTHNUM-NEXT: [[BF_ASHR:%.*]] = ashr i32 [[BF_SHL]], 24 // LEWIDTHNUM-NEXT: [[INC:%.*]] = add nsw i32 [[BF_ASHR]], 1 // LEWIDTHNUM-NEXT: [[BF_LOAD1:%.*]] = load volatile i32, i32* [[TMP0]], align 4 +// LEWIDTHNUM-NEXT: [[BF_FREEZE:%.*]] = freeze i32 [[BF_LOAD1]] // LEWIDTHNUM-NEXT: [[BF_VALUE:%.*]] = and i32 [[INC]], 255 // LEWIDTHNUM-NEXT: [[BF_SHL2:%.*]] = shl i32 [[BF_VALUE]], 1 -// LEWIDTHNUM-NEXT: [[BF_CLEAR:%.*]] = and i32 [[BF_LOAD1]], -511 +// LEWIDTHNUM-NEXT: [[BF_CLEAR:%.*]] = and i32 [[BF_FREEZE]], -511 // LEWIDTHNUM-NEXT: [[BF_SET:%.*]] = or i32 [[BF_CLEAR]], [[BF_SHL2]] // LEWIDTHNUM-NEXT: store volatile i32 [[BF_SET]], i32* [[TMP0]], align 4 // LEWIDTHNUM-NEXT: [[BF_RESULT_SHL:%.*]] = shl i32 [[BF_VALUE]], 24 @@ -2217,9 +2320,10 @@ // BEWIDTHNUM-NEXT: [[BF_ASHR:%.*]] = ashr i32 [[BF_SHL]], 24 // BEWIDTHNUM-NEXT: [[INC:%.*]] = add nsw i32 [[BF_ASHR]], 1 // BEWIDTHNUM-NEXT: [[BF_LOAD1:%.*]] = load volatile i32, i32* [[TMP0]], align 4 +// BEWIDTHNUM-NEXT: [[BF_FREEZE:%.*]] = freeze i32 [[BF_LOAD1]] // BEWIDTHNUM-NEXT: [[BF_VALUE:%.*]] = and i32 [[INC]], 255 // BEWIDTHNUM-NEXT: [[BF_SHL2:%.*]] = shl i32 [[BF_VALUE]], 23 -// BEWIDTHNUM-NEXT: [[BF_CLEAR:%.*]] = and i32 [[BF_LOAD1]], -2139095041 +// BEWIDTHNUM-NEXT: [[BF_CLEAR:%.*]] = and i32 [[BF_FREEZE]], -2139095041 // BEWIDTHNUM-NEXT: [[BF_SET:%.*]] = or i32 [[BF_CLEAR]], [[BF_SHL2]] // BEWIDTHNUM-NEXT: store volatile i32 [[BF_SET]], i32* [[TMP0]], align 4 // BEWIDTHNUM-NEXT: [[BF_RESULT_SHL:%.*]] = shl i32 [[BF_VALUE]], 24 @@ -2592,7 +2696,8 @@ // LE-NEXT: entry: // LE-NEXT: [[TMP0:%.*]] = bitcast %struct.st12* [[M:%.*]] to i32* // LE-NEXT: [[BF_LOAD:%.*]] = load volatile i32, i32* [[TMP0]], align 4 -// LE-NEXT: [[BF_CLEAR:%.*]] = and i32 [[BF_LOAD]], -16776961 +// LE-NEXT: [[BF_FREEZE:%.*]] = freeze i32 [[BF_LOAD]] +// LE-NEXT: [[BF_CLEAR:%.*]] = and i32 [[BF_FREEZE]], -16776961 // LE-NEXT: [[BF_SET:%.*]] = or i32 [[BF_CLEAR]], 256 // LE-NEXT: store volatile i32 [[BF_SET]], i32* [[TMP0]], align 4 // LE-NEXT: ret void @@ -2601,7 +2706,8 @@ // BE-NEXT: entry: // BE-NEXT: [[TMP0:%.*]] = bitcast %struct.st12* [[M:%.*]] to i32* // BE-NEXT: [[BF_LOAD:%.*]] = load volatile i32, i32* [[TMP0]], align 4 -// BE-NEXT: [[BF_CLEAR:%.*]] = and i32 [[BF_LOAD]], -16776961 +// BE-NEXT: [[BF_FREEZE:%.*]] = freeze i32 [[BF_LOAD]] +// BE-NEXT: [[BF_CLEAR:%.*]] = and i32 [[BF_FREEZE]], -16776961 // BE-NEXT: [[BF_SET:%.*]] = or i32 [[BF_CLEAR]], 256 // BE-NEXT: store volatile i32 [[BF_SET]], i32* [[TMP0]], align 4 // BE-NEXT: ret void @@ -2610,7 +2716,8 @@ // LENUMLOADS-NEXT: entry: // LENUMLOADS-NEXT: [[TMP0:%.*]] = bitcast %struct.st12* [[M:%.*]] to i32* // LENUMLOADS-NEXT: [[BF_LOAD:%.*]] = load volatile i32, i32* [[TMP0]], align 4 -// LENUMLOADS-NEXT: [[BF_CLEAR:%.*]] = and i32 [[BF_LOAD]], -16776961 +// LENUMLOADS-NEXT: [[BF_FREEZE:%.*]] = freeze i32 [[BF_LOAD]] +// LENUMLOADS-NEXT: [[BF_CLEAR:%.*]] = and i32 [[BF_FREEZE]], -16776961 // LENUMLOADS-NEXT: [[BF_SET:%.*]] = or i32 [[BF_CLEAR]], 256 // LENUMLOADS-NEXT: store volatile i32 [[BF_SET]], i32* [[TMP0]], align 4 // LENUMLOADS-NEXT: ret void @@ -2619,7 +2726,8 @@ // BENUMLOADS-NEXT: entry: // BENUMLOADS-NEXT: [[TMP0:%.*]] = bitcast %struct.st12* [[M:%.*]] to i32* // BENUMLOADS-NEXT: [[BF_LOAD:%.*]] = load volatile i32, i32* [[TMP0]], align 4 -// BENUMLOADS-NEXT: [[BF_CLEAR:%.*]] = and i32 [[BF_LOAD]], -16776961 +// BENUMLOADS-NEXT: [[BF_FREEZE:%.*]] = freeze i32 [[BF_LOAD]] +// BENUMLOADS-NEXT: [[BF_CLEAR:%.*]] = and i32 [[BF_FREEZE]], -16776961 // BENUMLOADS-NEXT: [[BF_SET:%.*]] = or i32 [[BF_CLEAR]], 256 // BENUMLOADS-NEXT: store volatile i32 [[BF_SET]], i32* [[TMP0]], align 4 // BENUMLOADS-NEXT: ret void @@ -2628,7 +2736,8 @@ // LEWIDTH-NEXT: entry: // LEWIDTH-NEXT: [[TMP0:%.*]] = bitcast %struct.st12* [[M:%.*]] to i32* // LEWIDTH-NEXT: [[BF_LOAD:%.*]] = load volatile i32, i32* [[TMP0]], align 4 -// LEWIDTH-NEXT: [[BF_CLEAR:%.*]] = and i32 [[BF_LOAD]], -16776961 +// LEWIDTH-NEXT: [[BF_FREEZE:%.*]] = freeze i32 [[BF_LOAD]] +// LEWIDTH-NEXT: [[BF_CLEAR:%.*]] = and i32 [[BF_FREEZE]], -16776961 // LEWIDTH-NEXT: [[BF_SET:%.*]] = or i32 [[BF_CLEAR]], 256 // LEWIDTH-NEXT: store volatile i32 [[BF_SET]], i32* [[TMP0]], align 4 // LEWIDTH-NEXT: ret void @@ -2637,7 +2746,8 @@ // BEWIDTH-NEXT: entry: // BEWIDTH-NEXT: [[TMP0:%.*]] = bitcast %struct.st12* [[M:%.*]] to i32* // BEWIDTH-NEXT: [[BF_LOAD:%.*]] = load volatile i32, i32* [[TMP0]], align 4 -// BEWIDTH-NEXT: [[BF_CLEAR:%.*]] = and i32 [[BF_LOAD]], -16776961 +// BEWIDTH-NEXT: [[BF_FREEZE:%.*]] = freeze i32 [[BF_LOAD]] +// BEWIDTH-NEXT: [[BF_CLEAR:%.*]] = and i32 [[BF_FREEZE]], -16776961 // BEWIDTH-NEXT: [[BF_SET:%.*]] = or i32 [[BF_CLEAR]], 256 // BEWIDTH-NEXT: store volatile i32 [[BF_SET]], i32* [[TMP0]], align 4 // BEWIDTH-NEXT: ret void @@ -2646,7 +2756,8 @@ // LEWIDTHNUM-NEXT: entry: // LEWIDTHNUM-NEXT: [[TMP0:%.*]] = bitcast %struct.st12* [[M:%.*]] to i32* // LEWIDTHNUM-NEXT: [[BF_LOAD:%.*]] = load volatile i32, i32* [[TMP0]], align 4 -// LEWIDTHNUM-NEXT: [[BF_CLEAR:%.*]] = and i32 [[BF_LOAD]], -16776961 +// LEWIDTHNUM-NEXT: [[BF_FREEZE:%.*]] = freeze i32 [[BF_LOAD]] +// LEWIDTHNUM-NEXT: [[BF_CLEAR:%.*]] = and i32 [[BF_FREEZE]], -16776961 // LEWIDTHNUM-NEXT: [[BF_SET:%.*]] = or i32 [[BF_CLEAR]], 256 // LEWIDTHNUM-NEXT: store volatile i32 [[BF_SET]], i32* [[TMP0]], align 4 // LEWIDTHNUM-NEXT: ret void @@ -2655,7 +2766,8 @@ // BEWIDTHNUM-NEXT: entry: // BEWIDTHNUM-NEXT: [[TMP0:%.*]] = bitcast %struct.st12* [[M:%.*]] to i32* // BEWIDTHNUM-NEXT: [[BF_LOAD:%.*]] = load volatile i32, i32* [[TMP0]], align 4 -// BEWIDTHNUM-NEXT: [[BF_CLEAR:%.*]] = and i32 [[BF_LOAD]], -16776961 +// BEWIDTHNUM-NEXT: [[BF_FREEZE:%.*]] = freeze i32 [[BF_LOAD]] +// BEWIDTHNUM-NEXT: [[BF_CLEAR:%.*]] = and i32 [[BF_FREEZE]], -16776961 // BEWIDTHNUM-NEXT: [[BF_SET:%.*]] = or i32 [[BF_CLEAR]], 256 // BEWIDTHNUM-NEXT: store volatile i32 [[BF_SET]], i32* [[TMP0]], align 4 // BEWIDTHNUM-NEXT: ret void @@ -2672,9 +2784,10 @@ // LE-NEXT: [[BF_ASHR:%.*]] = ashr i32 [[BF_SHL]], 16 // LE-NEXT: [[INC:%.*]] = add nsw i32 [[BF_ASHR]], 1 // LE-NEXT: [[BF_LOAD1:%.*]] = load volatile i32, i32* [[TMP0]], align 4 +// LE-NEXT: [[BF_FREEZE:%.*]] = freeze i32 [[BF_LOAD1]] // LE-NEXT: [[BF_VALUE:%.*]] = and i32 [[INC]], 65535 // LE-NEXT: [[BF_SHL2:%.*]] = shl i32 [[BF_VALUE]], 8 -// LE-NEXT: [[BF_CLEAR:%.*]] = and i32 [[BF_LOAD1]], -16776961 +// LE-NEXT: [[BF_CLEAR:%.*]] = and i32 [[BF_FREEZE]], -16776961 // LE-NEXT: [[BF_SET:%.*]] = or i32 [[BF_CLEAR]], [[BF_SHL2]] // LE-NEXT: store volatile i32 [[BF_SET]], i32* [[TMP0]], align 4 // LE-NEXT: [[BF_RESULT_SHL:%.*]] = shl i32 [[BF_VALUE]], 16 @@ -2689,9 +2802,10 @@ // BE-NEXT: [[BF_ASHR:%.*]] = ashr i32 [[BF_SHL]], 16 // BE-NEXT: [[INC:%.*]] = add nsw i32 [[BF_ASHR]], 1 // BE-NEXT: [[BF_LOAD1:%.*]] = load volatile i32, i32* [[TMP0]], align 4 +// BE-NEXT: [[BF_FREEZE:%.*]] = freeze i32 [[BF_LOAD1]] // BE-NEXT: [[BF_VALUE:%.*]] = and i32 [[INC]], 65535 // BE-NEXT: [[BF_SHL2:%.*]] = shl i32 [[BF_VALUE]], 8 -// BE-NEXT: [[BF_CLEAR:%.*]] = and i32 [[BF_LOAD1]], -16776961 +// BE-NEXT: [[BF_CLEAR:%.*]] = and i32 [[BF_FREEZE]], -16776961 // BE-NEXT: [[BF_SET:%.*]] = or i32 [[BF_CLEAR]], [[BF_SHL2]] // BE-NEXT: store volatile i32 [[BF_SET]], i32* [[TMP0]], align 4 // BE-NEXT: [[BF_RESULT_SHL:%.*]] = shl i32 [[BF_VALUE]], 16 @@ -2706,9 +2820,10 @@ // LENUMLOADS-NEXT: [[BF_ASHR:%.*]] = ashr i32 [[BF_SHL]], 16 // LENUMLOADS-NEXT: [[INC:%.*]] = add nsw i32 [[BF_ASHR]], 1 // LENUMLOADS-NEXT: [[BF_LOAD1:%.*]] = load volatile i32, i32* [[TMP0]], align 4 +// LENUMLOADS-NEXT: [[BF_FREEZE:%.*]] = freeze i32 [[BF_LOAD1]] // LENUMLOADS-NEXT: [[BF_VALUE:%.*]] = and i32 [[INC]], 65535 // LENUMLOADS-NEXT: [[BF_SHL2:%.*]] = shl i32 [[BF_VALUE]], 8 -// LENUMLOADS-NEXT: [[BF_CLEAR:%.*]] = and i32 [[BF_LOAD1]], -16776961 +// LENUMLOADS-NEXT: [[BF_CLEAR:%.*]] = and i32 [[BF_FREEZE]], -16776961 // LENUMLOADS-NEXT: [[BF_SET:%.*]] = or i32 [[BF_CLEAR]], [[BF_SHL2]] // LENUMLOADS-NEXT: store volatile i32 [[BF_SET]], i32* [[TMP0]], align 4 // LENUMLOADS-NEXT: [[BF_RESULT_SHL:%.*]] = shl i32 [[BF_VALUE]], 16 @@ -2723,9 +2838,10 @@ // BENUMLOADS-NEXT: [[BF_ASHR:%.*]] = ashr i32 [[BF_SHL]], 16 // BENUMLOADS-NEXT: [[INC:%.*]] = add nsw i32 [[BF_ASHR]], 1 // BENUMLOADS-NEXT: [[BF_LOAD1:%.*]] = load volatile i32, i32* [[TMP0]], align 4 +// BENUMLOADS-NEXT: [[BF_FREEZE:%.*]] = freeze i32 [[BF_LOAD1]] // BENUMLOADS-NEXT: [[BF_VALUE:%.*]] = and i32 [[INC]], 65535 // BENUMLOADS-NEXT: [[BF_SHL2:%.*]] = shl i32 [[BF_VALUE]], 8 -// BENUMLOADS-NEXT: [[BF_CLEAR:%.*]] = and i32 [[BF_LOAD1]], -16776961 +// BENUMLOADS-NEXT: [[BF_CLEAR:%.*]] = and i32 [[BF_FREEZE]], -16776961 // BENUMLOADS-NEXT: [[BF_SET:%.*]] = or i32 [[BF_CLEAR]], [[BF_SHL2]] // BENUMLOADS-NEXT: store volatile i32 [[BF_SET]], i32* [[TMP0]], align 4 // BENUMLOADS-NEXT: [[BF_RESULT_SHL:%.*]] = shl i32 [[BF_VALUE]], 16 @@ -2740,9 +2856,10 @@ // LEWIDTH-NEXT: [[BF_ASHR:%.*]] = ashr i32 [[BF_SHL]], 16 // LEWIDTH-NEXT: [[INC:%.*]] = add nsw i32 [[BF_ASHR]], 1 // LEWIDTH-NEXT: [[BF_LOAD1:%.*]] = load volatile i32, i32* [[TMP0]], align 4 +// LEWIDTH-NEXT: [[BF_FREEZE:%.*]] = freeze i32 [[BF_LOAD1]] // LEWIDTH-NEXT: [[BF_VALUE:%.*]] = and i32 [[INC]], 65535 // LEWIDTH-NEXT: [[BF_SHL2:%.*]] = shl i32 [[BF_VALUE]], 8 -// LEWIDTH-NEXT: [[BF_CLEAR:%.*]] = and i32 [[BF_LOAD1]], -16776961 +// LEWIDTH-NEXT: [[BF_CLEAR:%.*]] = and i32 [[BF_FREEZE]], -16776961 // LEWIDTH-NEXT: [[BF_SET:%.*]] = or i32 [[BF_CLEAR]], [[BF_SHL2]] // LEWIDTH-NEXT: store volatile i32 [[BF_SET]], i32* [[TMP0]], align 4 // LEWIDTH-NEXT: [[BF_RESULT_SHL:%.*]] = shl i32 [[BF_VALUE]], 16 @@ -2757,9 +2874,10 @@ // BEWIDTH-NEXT: [[BF_ASHR:%.*]] = ashr i32 [[BF_SHL]], 16 // BEWIDTH-NEXT: [[INC:%.*]] = add nsw i32 [[BF_ASHR]], 1 // BEWIDTH-NEXT: [[BF_LOAD1:%.*]] = load volatile i32, i32* [[TMP0]], align 4 +// BEWIDTH-NEXT: [[BF_FREEZE:%.*]] = freeze i32 [[BF_LOAD1]] // BEWIDTH-NEXT: [[BF_VALUE:%.*]] = and i32 [[INC]], 65535 // BEWIDTH-NEXT: [[BF_SHL2:%.*]] = shl i32 [[BF_VALUE]], 8 -// BEWIDTH-NEXT: [[BF_CLEAR:%.*]] = and i32 [[BF_LOAD1]], -16776961 +// BEWIDTH-NEXT: [[BF_CLEAR:%.*]] = and i32 [[BF_FREEZE]], -16776961 // BEWIDTH-NEXT: [[BF_SET:%.*]] = or i32 [[BF_CLEAR]], [[BF_SHL2]] // BEWIDTH-NEXT: store volatile i32 [[BF_SET]], i32* [[TMP0]], align 4 // BEWIDTH-NEXT: [[BF_RESULT_SHL:%.*]] = shl i32 [[BF_VALUE]], 16 @@ -2774,9 +2892,10 @@ // LEWIDTHNUM-NEXT: [[BF_ASHR:%.*]] = ashr i32 [[BF_SHL]], 16 // LEWIDTHNUM-NEXT: [[INC:%.*]] = add nsw i32 [[BF_ASHR]], 1 // LEWIDTHNUM-NEXT: [[BF_LOAD1:%.*]] = load volatile i32, i32* [[TMP0]], align 4 +// LEWIDTHNUM-NEXT: [[BF_FREEZE:%.*]] = freeze i32 [[BF_LOAD1]] // LEWIDTHNUM-NEXT: [[BF_VALUE:%.*]] = and i32 [[INC]], 65535 // LEWIDTHNUM-NEXT: [[BF_SHL2:%.*]] = shl i32 [[BF_VALUE]], 8 -// LEWIDTHNUM-NEXT: [[BF_CLEAR:%.*]] = and i32 [[BF_LOAD1]], -16776961 +// LEWIDTHNUM-NEXT: [[BF_CLEAR:%.*]] = and i32 [[BF_FREEZE]], -16776961 // LEWIDTHNUM-NEXT: [[BF_SET:%.*]] = or i32 [[BF_CLEAR]], [[BF_SHL2]] // LEWIDTHNUM-NEXT: store volatile i32 [[BF_SET]], i32* [[TMP0]], align 4 // LEWIDTHNUM-NEXT: [[BF_RESULT_SHL:%.*]] = shl i32 [[BF_VALUE]], 16 @@ -2791,9 +2910,10 @@ // BEWIDTHNUM-NEXT: [[BF_ASHR:%.*]] = ashr i32 [[BF_SHL]], 16 // BEWIDTHNUM-NEXT: [[INC:%.*]] = add nsw i32 [[BF_ASHR]], 1 // BEWIDTHNUM-NEXT: [[BF_LOAD1:%.*]] = load volatile i32, i32* [[TMP0]], align 4 +// BEWIDTHNUM-NEXT: [[BF_FREEZE:%.*]] = freeze i32 [[BF_LOAD1]] // BEWIDTHNUM-NEXT: [[BF_VALUE:%.*]] = and i32 [[INC]], 65535 // BEWIDTHNUM-NEXT: [[BF_SHL2:%.*]] = shl i32 [[BF_VALUE]], 8 -// BEWIDTHNUM-NEXT: [[BF_CLEAR:%.*]] = and i32 [[BF_LOAD1]], -16776961 +// BEWIDTHNUM-NEXT: [[BF_CLEAR:%.*]] = and i32 [[BF_FREEZE]], -16776961 // BEWIDTHNUM-NEXT: [[BF_SET:%.*]] = or i32 [[BF_CLEAR]], [[BF_SHL2]] // BEWIDTHNUM-NEXT: store volatile i32 [[BF_SET]], i32* [[TMP0]], align 4 // BEWIDTHNUM-NEXT: [[BF_RESULT_SHL:%.*]] = shl i32 [[BF_VALUE]], 16 @@ -2812,8 +2932,9 @@ // LE-NEXT: [[BF_ASHR:%.*]] = ashr i32 [[BF_SHL]], 24 // LE-NEXT: [[INC:%.*]] = add nsw i32 [[BF_ASHR]], 1 // LE-NEXT: [[BF_LOAD1:%.*]] = load volatile i32, i32* [[TMP0]], align 4 +// LE-NEXT: [[BF_FREEZE:%.*]] = freeze i32 [[BF_LOAD1]] // LE-NEXT: [[BF_VALUE:%.*]] = and i32 [[INC]], 255 -// LE-NEXT: [[BF_CLEAR:%.*]] = and i32 [[BF_LOAD1]], -256 +// LE-NEXT: [[BF_CLEAR:%.*]] = and i32 [[BF_FREEZE]], -256 // LE-NEXT: [[BF_SET:%.*]] = or i32 [[BF_CLEAR]], [[BF_VALUE]] // LE-NEXT: store volatile i32 [[BF_SET]], i32* [[TMP0]], align 4 // LE-NEXT: [[BF_RESULT_SHL:%.*]] = shl i32 [[BF_VALUE]], 24 @@ -2827,9 +2948,10 @@ // BE-NEXT: [[BF_ASHR:%.*]] = ashr i32 [[BF_LOAD]], 24 // BE-NEXT: [[INC:%.*]] = add nsw i32 [[BF_ASHR]], 1 // BE-NEXT: [[BF_LOAD1:%.*]] = load volatile i32, i32* [[TMP0]], align 4 +// BE-NEXT: [[BF_FREEZE:%.*]] = freeze i32 [[BF_LOAD1]] // BE-NEXT: [[BF_VALUE:%.*]] = and i32 [[INC]], 255 // BE-NEXT: [[BF_SHL:%.*]] = shl i32 [[BF_VALUE]], 24 -// BE-NEXT: [[BF_CLEAR:%.*]] = and i32 [[BF_LOAD1]], 16777215 +// BE-NEXT: [[BF_CLEAR:%.*]] = and i32 [[BF_FREEZE]], 16777215 // BE-NEXT: [[BF_SET:%.*]] = or i32 [[BF_CLEAR]], [[BF_SHL]] // BE-NEXT: store volatile i32 [[BF_SET]], i32* [[TMP0]], align 4 // BE-NEXT: [[BF_RESULT_SHL:%.*]] = shl i32 [[BF_VALUE]], 24 @@ -2844,8 +2966,9 @@ // LENUMLOADS-NEXT: [[BF_ASHR:%.*]] = ashr i32 [[BF_SHL]], 24 // LENUMLOADS-NEXT: [[INC:%.*]] = add nsw i32 [[BF_ASHR]], 1 // LENUMLOADS-NEXT: [[BF_LOAD1:%.*]] = load volatile i32, i32* [[TMP0]], align 4 +// LENUMLOADS-NEXT: [[BF_FREEZE:%.*]] = freeze i32 [[BF_LOAD1]] // LENUMLOADS-NEXT: [[BF_VALUE:%.*]] = and i32 [[INC]], 255 -// LENUMLOADS-NEXT: [[BF_CLEAR:%.*]] = and i32 [[BF_LOAD1]], -256 +// LENUMLOADS-NEXT: [[BF_CLEAR:%.*]] = and i32 [[BF_FREEZE]], -256 // LENUMLOADS-NEXT: [[BF_SET:%.*]] = or i32 [[BF_CLEAR]], [[BF_VALUE]] // LENUMLOADS-NEXT: store volatile i32 [[BF_SET]], i32* [[TMP0]], align 4 // LENUMLOADS-NEXT: [[BF_RESULT_SHL:%.*]] = shl i32 [[BF_VALUE]], 24 @@ -2859,9 +2982,10 @@ // BENUMLOADS-NEXT: [[BF_ASHR:%.*]] = ashr i32 [[BF_LOAD]], 24 // BENUMLOADS-NEXT: [[INC:%.*]] = add nsw i32 [[BF_ASHR]], 1 // BENUMLOADS-NEXT: [[BF_LOAD1:%.*]] = load volatile i32, i32* [[TMP0]], align 4 +// BENUMLOADS-NEXT: [[BF_FREEZE:%.*]] = freeze i32 [[BF_LOAD1]] // BENUMLOADS-NEXT: [[BF_VALUE:%.*]] = and i32 [[INC]], 255 // BENUMLOADS-NEXT: [[BF_SHL:%.*]] = shl i32 [[BF_VALUE]], 24 -// BENUMLOADS-NEXT: [[BF_CLEAR:%.*]] = and i32 [[BF_LOAD1]], 16777215 +// BENUMLOADS-NEXT: [[BF_CLEAR:%.*]] = and i32 [[BF_FREEZE]], 16777215 // BENUMLOADS-NEXT: [[BF_SET:%.*]] = or i32 [[BF_CLEAR]], [[BF_SHL]] // BENUMLOADS-NEXT: store volatile i32 [[BF_SET]], i32* [[TMP0]], align 4 // BENUMLOADS-NEXT: [[BF_RESULT_SHL:%.*]] = shl i32 [[BF_VALUE]], 24 @@ -2876,8 +3000,9 @@ // LEWIDTH-NEXT: [[BF_ASHR:%.*]] = ashr i32 [[BF_SHL]], 24 // LEWIDTH-NEXT: [[INC:%.*]] = add nsw i32 [[BF_ASHR]], 1 // LEWIDTH-NEXT: [[BF_LOAD1:%.*]] = load volatile i32, i32* [[TMP0]], align 4 +// LEWIDTH-NEXT: [[BF_FREEZE:%.*]] = freeze i32 [[BF_LOAD1]] // LEWIDTH-NEXT: [[BF_VALUE:%.*]] = and i32 [[INC]], 255 -// LEWIDTH-NEXT: [[BF_CLEAR:%.*]] = and i32 [[BF_LOAD1]], -256 +// LEWIDTH-NEXT: [[BF_CLEAR:%.*]] = and i32 [[BF_FREEZE]], -256 // LEWIDTH-NEXT: [[BF_SET:%.*]] = or i32 [[BF_CLEAR]], [[BF_VALUE]] // LEWIDTH-NEXT: store volatile i32 [[BF_SET]], i32* [[TMP0]], align 4 // LEWIDTH-NEXT: [[BF_RESULT_SHL:%.*]] = shl i32 [[BF_VALUE]], 24 @@ -2891,9 +3016,10 @@ // BEWIDTH-NEXT: [[BF_ASHR:%.*]] = ashr i32 [[BF_LOAD]], 24 // BEWIDTH-NEXT: [[INC:%.*]] = add nsw i32 [[BF_ASHR]], 1 // BEWIDTH-NEXT: [[BF_LOAD1:%.*]] = load volatile i32, i32* [[TMP0]], align 4 +// BEWIDTH-NEXT: [[BF_FREEZE:%.*]] = freeze i32 [[BF_LOAD1]] // BEWIDTH-NEXT: [[BF_VALUE:%.*]] = and i32 [[INC]], 255 // BEWIDTH-NEXT: [[BF_SHL:%.*]] = shl i32 [[BF_VALUE]], 24 -// BEWIDTH-NEXT: [[BF_CLEAR:%.*]] = and i32 [[BF_LOAD1]], 16777215 +// BEWIDTH-NEXT: [[BF_CLEAR:%.*]] = and i32 [[BF_FREEZE]], 16777215 // BEWIDTH-NEXT: [[BF_SET:%.*]] = or i32 [[BF_CLEAR]], [[BF_SHL]] // BEWIDTH-NEXT: store volatile i32 [[BF_SET]], i32* [[TMP0]], align 4 // BEWIDTH-NEXT: [[BF_RESULT_SHL:%.*]] = shl i32 [[BF_VALUE]], 24 @@ -2908,8 +3034,9 @@ // LEWIDTHNUM-NEXT: [[BF_ASHR:%.*]] = ashr i32 [[BF_SHL]], 24 // LEWIDTHNUM-NEXT: [[INC:%.*]] = add nsw i32 [[BF_ASHR]], 1 // LEWIDTHNUM-NEXT: [[BF_LOAD1:%.*]] = load volatile i32, i32* [[TMP0]], align 4 +// LEWIDTHNUM-NEXT: [[BF_FREEZE:%.*]] = freeze i32 [[BF_LOAD1]] // LEWIDTHNUM-NEXT: [[BF_VALUE:%.*]] = and i32 [[INC]], 255 -// LEWIDTHNUM-NEXT: [[BF_CLEAR:%.*]] = and i32 [[BF_LOAD1]], -256 +// LEWIDTHNUM-NEXT: [[BF_CLEAR:%.*]] = and i32 [[BF_FREEZE]], -256 // LEWIDTHNUM-NEXT: [[BF_SET:%.*]] = or i32 [[BF_CLEAR]], [[BF_VALUE]] // LEWIDTHNUM-NEXT: store volatile i32 [[BF_SET]], i32* [[TMP0]], align 4 // LEWIDTHNUM-NEXT: [[BF_RESULT_SHL:%.*]] = shl i32 [[BF_VALUE]], 24 @@ -2923,9 +3050,10 @@ // BEWIDTHNUM-NEXT: [[BF_ASHR:%.*]] = ashr i32 [[BF_LOAD]], 24 // BEWIDTHNUM-NEXT: [[INC:%.*]] = add nsw i32 [[BF_ASHR]], 1 // BEWIDTHNUM-NEXT: [[BF_LOAD1:%.*]] = load volatile i32, i32* [[TMP0]], align 4 +// BEWIDTHNUM-NEXT: [[BF_FREEZE:%.*]] = freeze i32 [[BF_LOAD1]] // BEWIDTHNUM-NEXT: [[BF_VALUE:%.*]] = and i32 [[INC]], 255 // BEWIDTHNUM-NEXT: [[BF_SHL:%.*]] = shl i32 [[BF_VALUE]], 24 -// BEWIDTHNUM-NEXT: [[BF_CLEAR:%.*]] = and i32 [[BF_LOAD1]], 16777215 +// BEWIDTHNUM-NEXT: [[BF_CLEAR:%.*]] = and i32 [[BF_FREEZE]], 16777215 // BEWIDTHNUM-NEXT: [[BF_SET:%.*]] = or i32 [[BF_CLEAR]], [[BF_SHL]] // BEWIDTHNUM-NEXT: store volatile i32 [[BF_SET]], i32* [[TMP0]], align 4 // BEWIDTHNUM-NEXT: [[BF_RESULT_SHL:%.*]] = shl i32 [[BF_VALUE]], 24 @@ -2950,9 +3078,10 @@ // LE-NEXT: [[INC:%.*]] = add nsw i32 [[BF_CAST]], 1 // LE-NEXT: [[TMP1:%.*]] = zext i32 [[INC]] to i40 // LE-NEXT: [[BF_LOAD1:%.*]] = load volatile i40, i40* [[TMP0]], align 1 +// LE-NEXT: [[BF_FREEZE:%.*]] = freeze i40 [[BF_LOAD1]] // LE-NEXT: [[BF_VALUE:%.*]] = and i40 [[TMP1]], 4294967295 // LE-NEXT: [[BF_SHL:%.*]] = shl i40 [[BF_VALUE]], 8 -// LE-NEXT: [[BF_CLEAR:%.*]] = and i40 [[BF_LOAD1]], 255 +// LE-NEXT: [[BF_CLEAR:%.*]] = and i40 [[BF_FREEZE]], 255 // LE-NEXT: [[BF_SET:%.*]] = or i40 [[BF_CLEAR]], [[BF_SHL]] // LE-NEXT: store volatile i40 [[BF_SET]], i40* [[TMP0]], align 1 // LE-NEXT: [[BF_RESULT_SHL:%.*]] = shl i40 [[BF_VALUE]], 8 @@ -2970,8 +3099,9 @@ // BE-NEXT: [[INC:%.*]] = add nsw i32 [[BF_CAST]], 1 // BE-NEXT: [[TMP1:%.*]] = zext i32 [[INC]] to i40 // BE-NEXT: [[BF_LOAD1:%.*]] = load volatile i40, i40* [[TMP0]], align 1 +// BE-NEXT: [[BF_FREEZE:%.*]] = freeze i40 [[BF_LOAD1]] // BE-NEXT: [[BF_VALUE:%.*]] = and i40 [[TMP1]], 4294967295 -// BE-NEXT: [[BF_CLEAR:%.*]] = and i40 [[BF_LOAD1]], -4294967296 +// BE-NEXT: [[BF_CLEAR:%.*]] = and i40 [[BF_FREEZE]], -4294967296 // BE-NEXT: [[BF_SET:%.*]] = or i40 [[BF_CLEAR]], [[BF_VALUE]] // BE-NEXT: store volatile i40 [[BF_SET]], i40* [[TMP0]], align 1 // BE-NEXT: [[BF_RESULT_SHL:%.*]] = shl i40 [[BF_VALUE]], 8 @@ -2988,9 +3118,10 @@ // LENUMLOADS-NEXT: [[INC:%.*]] = add nsw i32 [[BF_CAST]], 1 // LENUMLOADS-NEXT: [[TMP1:%.*]] = zext i32 [[INC]] to i40 // LENUMLOADS-NEXT: [[BF_LOAD1:%.*]] = load volatile i40, i40* [[TMP0]], align 1 +// LENUMLOADS-NEXT: [[BF_FREEZE:%.*]] = freeze i40 [[BF_LOAD1]] // LENUMLOADS-NEXT: [[BF_VALUE:%.*]] = and i40 [[TMP1]], 4294967295 // LENUMLOADS-NEXT: [[BF_SHL:%.*]] = shl i40 [[BF_VALUE]], 8 -// LENUMLOADS-NEXT: [[BF_CLEAR:%.*]] = and i40 [[BF_LOAD1]], 255 +// LENUMLOADS-NEXT: [[BF_CLEAR:%.*]] = and i40 [[BF_FREEZE]], 255 // LENUMLOADS-NEXT: [[BF_SET:%.*]] = or i40 [[BF_CLEAR]], [[BF_SHL]] // LENUMLOADS-NEXT: store volatile i40 [[BF_SET]], i40* [[TMP0]], align 1 // LENUMLOADS-NEXT: [[BF_RESULT_SHL:%.*]] = shl i40 [[BF_VALUE]], 8 @@ -3008,8 +3139,9 @@ // BENUMLOADS-NEXT: [[INC:%.*]] = add nsw i32 [[BF_CAST]], 1 // BENUMLOADS-NEXT: [[TMP1:%.*]] = zext i32 [[INC]] to i40 // BENUMLOADS-NEXT: [[BF_LOAD1:%.*]] = load volatile i40, i40* [[TMP0]], align 1 +// BENUMLOADS-NEXT: [[BF_FREEZE:%.*]] = freeze i40 [[BF_LOAD1]] // BENUMLOADS-NEXT: [[BF_VALUE:%.*]] = and i40 [[TMP1]], 4294967295 -// BENUMLOADS-NEXT: [[BF_CLEAR:%.*]] = and i40 [[BF_LOAD1]], -4294967296 +// BENUMLOADS-NEXT: [[BF_CLEAR:%.*]] = and i40 [[BF_FREEZE]], -4294967296 // BENUMLOADS-NEXT: [[BF_SET:%.*]] = or i40 [[BF_CLEAR]], [[BF_VALUE]] // BENUMLOADS-NEXT: store volatile i40 [[BF_SET]], i40* [[TMP0]], align 1 // BENUMLOADS-NEXT: [[BF_RESULT_SHL:%.*]] = shl i40 [[BF_VALUE]], 8 @@ -3026,9 +3158,10 @@ // LEWIDTH-NEXT: [[INC:%.*]] = add nsw i32 [[BF_CAST]], 1 // LEWIDTH-NEXT: [[TMP1:%.*]] = zext i32 [[INC]] to i40 // LEWIDTH-NEXT: [[BF_LOAD1:%.*]] = load volatile i40, i40* [[TMP0]], align 1 +// LEWIDTH-NEXT: [[BF_FREEZE:%.*]] = freeze i40 [[BF_LOAD1]] // LEWIDTH-NEXT: [[BF_VALUE:%.*]] = and i40 [[TMP1]], 4294967295 // LEWIDTH-NEXT: [[BF_SHL:%.*]] = shl i40 [[BF_VALUE]], 8 -// LEWIDTH-NEXT: [[BF_CLEAR:%.*]] = and i40 [[BF_LOAD1]], 255 +// LEWIDTH-NEXT: [[BF_CLEAR:%.*]] = and i40 [[BF_FREEZE]], 255 // LEWIDTH-NEXT: [[BF_SET:%.*]] = or i40 [[BF_CLEAR]], [[BF_SHL]] // LEWIDTH-NEXT: store volatile i40 [[BF_SET]], i40* [[TMP0]], align 1 // LEWIDTH-NEXT: [[BF_RESULT_SHL:%.*]] = shl i40 [[BF_VALUE]], 8 @@ -3046,8 +3179,9 @@ // BEWIDTH-NEXT: [[INC:%.*]] = add nsw i32 [[BF_CAST]], 1 // BEWIDTH-NEXT: [[TMP1:%.*]] = zext i32 [[INC]] to i40 // BEWIDTH-NEXT: [[BF_LOAD1:%.*]] = load volatile i40, i40* [[TMP0]], align 1 +// BEWIDTH-NEXT: [[BF_FREEZE:%.*]] = freeze i40 [[BF_LOAD1]] // BEWIDTH-NEXT: [[BF_VALUE:%.*]] = and i40 [[TMP1]], 4294967295 -// BEWIDTH-NEXT: [[BF_CLEAR:%.*]] = and i40 [[BF_LOAD1]], -4294967296 +// BEWIDTH-NEXT: [[BF_CLEAR:%.*]] = and i40 [[BF_FREEZE]], -4294967296 // BEWIDTH-NEXT: [[BF_SET:%.*]] = or i40 [[BF_CLEAR]], [[BF_VALUE]] // BEWIDTH-NEXT: store volatile i40 [[BF_SET]], i40* [[TMP0]], align 1 // BEWIDTH-NEXT: [[BF_RESULT_SHL:%.*]] = shl i40 [[BF_VALUE]], 8 @@ -3064,9 +3198,10 @@ // LEWIDTHNUM-NEXT: [[INC:%.*]] = add nsw i32 [[BF_CAST]], 1 // LEWIDTHNUM-NEXT: [[TMP1:%.*]] = zext i32 [[INC]] to i40 // LEWIDTHNUM-NEXT: [[BF_LOAD1:%.*]] = load volatile i40, i40* [[TMP0]], align 1 +// LEWIDTHNUM-NEXT: [[BF_FREEZE:%.*]] = freeze i40 [[BF_LOAD1]] // LEWIDTHNUM-NEXT: [[BF_VALUE:%.*]] = and i40 [[TMP1]], 4294967295 // LEWIDTHNUM-NEXT: [[BF_SHL:%.*]] = shl i40 [[BF_VALUE]], 8 -// LEWIDTHNUM-NEXT: [[BF_CLEAR:%.*]] = and i40 [[BF_LOAD1]], 255 +// LEWIDTHNUM-NEXT: [[BF_CLEAR:%.*]] = and i40 [[BF_FREEZE]], 255 // LEWIDTHNUM-NEXT: [[BF_SET:%.*]] = or i40 [[BF_CLEAR]], [[BF_SHL]] // LEWIDTHNUM-NEXT: store volatile i40 [[BF_SET]], i40* [[TMP0]], align 1 // LEWIDTHNUM-NEXT: [[BF_RESULT_SHL:%.*]] = shl i40 [[BF_VALUE]], 8 @@ -3084,8 +3219,9 @@ // BEWIDTHNUM-NEXT: [[INC:%.*]] = add nsw i32 [[BF_CAST]], 1 // BEWIDTHNUM-NEXT: [[TMP1:%.*]] = zext i32 [[INC]] to i40 // BEWIDTHNUM-NEXT: [[BF_LOAD1:%.*]] = load volatile i40, i40* [[TMP0]], align 1 +// BEWIDTHNUM-NEXT: [[BF_FREEZE:%.*]] = freeze i40 [[BF_LOAD1]] // BEWIDTHNUM-NEXT: [[BF_VALUE:%.*]] = and i40 [[TMP1]], 4294967295 -// BEWIDTHNUM-NEXT: [[BF_CLEAR:%.*]] = and i40 [[BF_LOAD1]], -4294967296 +// BEWIDTHNUM-NEXT: [[BF_CLEAR:%.*]] = and i40 [[BF_FREEZE]], -4294967296 // BEWIDTHNUM-NEXT: [[BF_SET:%.*]] = or i40 [[BF_CLEAR]], [[BF_VALUE]] // BEWIDTHNUM-NEXT: store volatile i40 [[BF_SET]], i40* [[TMP0]], align 1 // BEWIDTHNUM-NEXT: [[BF_RESULT_SHL:%.*]] = shl i40 [[BF_VALUE]], 8 @@ -3290,8 +3426,9 @@ // LE-NEXT: [[INC:%.*]] = add nsw i32 [[BF_CAST]], 1 // LE-NEXT: [[TMP1:%.*]] = zext i32 [[INC]] to i64 // LE-NEXT: [[BF_LOAD1:%.*]] = load i64, i64* [[TMP0]], align 4 +// LE-NEXT: [[BF_FREEZE:%.*]] = freeze i64 [[BF_LOAD1]] // LE-NEXT: [[BF_VALUE:%.*]] = and i64 [[TMP1]], 4294967295 -// LE-NEXT: [[BF_CLEAR:%.*]] = and i64 [[BF_LOAD1]], -4294967296 +// LE-NEXT: [[BF_CLEAR:%.*]] = and i64 [[BF_FREEZE]], -4294967296 // LE-NEXT: [[BF_SET:%.*]] = or i64 [[BF_CLEAR]], [[BF_VALUE]] // LE-NEXT: store i64 [[BF_SET]], i64* [[TMP0]], align 4 // LE-NEXT: [[BF_RESULT_SHL:%.*]] = shl i64 [[BF_VALUE]], 32 @@ -3308,9 +3445,10 @@ // BE-NEXT: [[INC:%.*]] = add nsw i32 [[BF_CAST]], 1 // BE-NEXT: [[TMP1:%.*]] = zext i32 [[INC]] to i64 // BE-NEXT: [[BF_LOAD1:%.*]] = load i64, i64* [[TMP0]], align 4 +// BE-NEXT: [[BF_FREEZE:%.*]] = freeze i64 [[BF_LOAD1]] // BE-NEXT: [[BF_VALUE:%.*]] = and i64 [[TMP1]], 4294967295 // BE-NEXT: [[BF_SHL:%.*]] = shl i64 [[BF_VALUE]], 32 -// BE-NEXT: [[BF_CLEAR:%.*]] = and i64 [[BF_LOAD1]], 4294967295 +// BE-NEXT: [[BF_CLEAR:%.*]] = and i64 [[BF_FREEZE]], 4294967295 // BE-NEXT: [[BF_SET:%.*]] = or i64 [[BF_CLEAR]], [[BF_SHL]] // BE-NEXT: store i64 [[BF_SET]], i64* [[TMP0]], align 4 // BE-NEXT: [[BF_RESULT_SHL:%.*]] = shl i64 [[BF_VALUE]], 32 @@ -3328,8 +3466,9 @@ // LENUMLOADS-NEXT: [[INC:%.*]] = add nsw i32 [[BF_CAST]], 1 // LENUMLOADS-NEXT: [[TMP1:%.*]] = zext i32 [[INC]] to i64 // LENUMLOADS-NEXT: [[BF_LOAD1:%.*]] = load i64, i64* [[TMP0]], align 4 +// LENUMLOADS-NEXT: [[BF_FREEZE:%.*]] = freeze i64 [[BF_LOAD1]] // LENUMLOADS-NEXT: [[BF_VALUE:%.*]] = and i64 [[TMP1]], 4294967295 -// LENUMLOADS-NEXT: [[BF_CLEAR:%.*]] = and i64 [[BF_LOAD1]], -4294967296 +// LENUMLOADS-NEXT: [[BF_CLEAR:%.*]] = and i64 [[BF_FREEZE]], -4294967296 // LENUMLOADS-NEXT: [[BF_SET:%.*]] = or i64 [[BF_CLEAR]], [[BF_VALUE]] // LENUMLOADS-NEXT: store i64 [[BF_SET]], i64* [[TMP0]], align 4 // LENUMLOADS-NEXT: [[BF_RESULT_SHL:%.*]] = shl i64 [[BF_VALUE]], 32 @@ -3346,9 +3485,10 @@ // BENUMLOADS-NEXT: [[INC:%.*]] = add nsw i32 [[BF_CAST]], 1 // BENUMLOADS-NEXT: [[TMP1:%.*]] = zext i32 [[INC]] to i64 // BENUMLOADS-NEXT: [[BF_LOAD1:%.*]] = load i64, i64* [[TMP0]], align 4 +// BENUMLOADS-NEXT: [[BF_FREEZE:%.*]] = freeze i64 [[BF_LOAD1]] // BENUMLOADS-NEXT: [[BF_VALUE:%.*]] = and i64 [[TMP1]], 4294967295 // BENUMLOADS-NEXT: [[BF_SHL:%.*]] = shl i64 [[BF_VALUE]], 32 -// BENUMLOADS-NEXT: [[BF_CLEAR:%.*]] = and i64 [[BF_LOAD1]], 4294967295 +// BENUMLOADS-NEXT: [[BF_CLEAR:%.*]] = and i64 [[BF_FREEZE]], 4294967295 // BENUMLOADS-NEXT: [[BF_SET:%.*]] = or i64 [[BF_CLEAR]], [[BF_SHL]] // BENUMLOADS-NEXT: store i64 [[BF_SET]], i64* [[TMP0]], align 4 // BENUMLOADS-NEXT: [[BF_RESULT_SHL:%.*]] = shl i64 [[BF_VALUE]], 32 @@ -3366,8 +3506,9 @@ // LEWIDTH-NEXT: [[INC:%.*]] = add nsw i32 [[BF_CAST]], 1 // LEWIDTH-NEXT: [[TMP1:%.*]] = zext i32 [[INC]] to i64 // LEWIDTH-NEXT: [[BF_LOAD1:%.*]] = load i64, i64* [[TMP0]], align 4 +// LEWIDTH-NEXT: [[BF_FREEZE:%.*]] = freeze i64 [[BF_LOAD1]] // LEWIDTH-NEXT: [[BF_VALUE:%.*]] = and i64 [[TMP1]], 4294967295 -// LEWIDTH-NEXT: [[BF_CLEAR:%.*]] = and i64 [[BF_LOAD1]], -4294967296 +// LEWIDTH-NEXT: [[BF_CLEAR:%.*]] = and i64 [[BF_FREEZE]], -4294967296 // LEWIDTH-NEXT: [[BF_SET:%.*]] = or i64 [[BF_CLEAR]], [[BF_VALUE]] // LEWIDTH-NEXT: store i64 [[BF_SET]], i64* [[TMP0]], align 4 // LEWIDTH-NEXT: [[BF_RESULT_SHL:%.*]] = shl i64 [[BF_VALUE]], 32 @@ -3384,9 +3525,10 @@ // BEWIDTH-NEXT: [[INC:%.*]] = add nsw i32 [[BF_CAST]], 1 // BEWIDTH-NEXT: [[TMP1:%.*]] = zext i32 [[INC]] to i64 // BEWIDTH-NEXT: [[BF_LOAD1:%.*]] = load i64, i64* [[TMP0]], align 4 +// BEWIDTH-NEXT: [[BF_FREEZE:%.*]] = freeze i64 [[BF_LOAD1]] // BEWIDTH-NEXT: [[BF_VALUE:%.*]] = and i64 [[TMP1]], 4294967295 // BEWIDTH-NEXT: [[BF_SHL:%.*]] = shl i64 [[BF_VALUE]], 32 -// BEWIDTH-NEXT: [[BF_CLEAR:%.*]] = and i64 [[BF_LOAD1]], 4294967295 +// BEWIDTH-NEXT: [[BF_CLEAR:%.*]] = and i64 [[BF_FREEZE]], 4294967295 // BEWIDTH-NEXT: [[BF_SET:%.*]] = or i64 [[BF_CLEAR]], [[BF_SHL]] // BEWIDTH-NEXT: store i64 [[BF_SET]], i64* [[TMP0]], align 4 // BEWIDTH-NEXT: [[BF_RESULT_SHL:%.*]] = shl i64 [[BF_VALUE]], 32 @@ -3404,8 +3546,9 @@ // LEWIDTHNUM-NEXT: [[INC:%.*]] = add nsw i32 [[BF_CAST]], 1 // LEWIDTHNUM-NEXT: [[TMP1:%.*]] = zext i32 [[INC]] to i64 // LEWIDTHNUM-NEXT: [[BF_LOAD1:%.*]] = load i64, i64* [[TMP0]], align 4 +// LEWIDTHNUM-NEXT: [[BF_FREEZE:%.*]] = freeze i64 [[BF_LOAD1]] // LEWIDTHNUM-NEXT: [[BF_VALUE:%.*]] = and i64 [[TMP1]], 4294967295 -// LEWIDTHNUM-NEXT: [[BF_CLEAR:%.*]] = and i64 [[BF_LOAD1]], -4294967296 +// LEWIDTHNUM-NEXT: [[BF_CLEAR:%.*]] = and i64 [[BF_FREEZE]], -4294967296 // LEWIDTHNUM-NEXT: [[BF_SET:%.*]] = or i64 [[BF_CLEAR]], [[BF_VALUE]] // LEWIDTHNUM-NEXT: store i64 [[BF_SET]], i64* [[TMP0]], align 4 // LEWIDTHNUM-NEXT: [[BF_RESULT_SHL:%.*]] = shl i64 [[BF_VALUE]], 32 @@ -3422,9 +3565,10 @@ // BEWIDTHNUM-NEXT: [[INC:%.*]] = add nsw i32 [[BF_CAST]], 1 // BEWIDTHNUM-NEXT: [[TMP1:%.*]] = zext i32 [[INC]] to i64 // BEWIDTHNUM-NEXT: [[BF_LOAD1:%.*]] = load i64, i64* [[TMP0]], align 4 +// BEWIDTHNUM-NEXT: [[BF_FREEZE:%.*]] = freeze i64 [[BF_LOAD1]] // BEWIDTHNUM-NEXT: [[BF_VALUE:%.*]] = and i64 [[TMP1]], 4294967295 // BEWIDTHNUM-NEXT: [[BF_SHL:%.*]] = shl i64 [[BF_VALUE]], 32 -// BEWIDTHNUM-NEXT: [[BF_CLEAR:%.*]] = and i64 [[BF_LOAD1]], 4294967295 +// BEWIDTHNUM-NEXT: [[BF_CLEAR:%.*]] = and i64 [[BF_FREEZE]], 4294967295 // BEWIDTHNUM-NEXT: [[BF_SET:%.*]] = or i64 [[BF_CLEAR]], [[BF_SHL]] // BEWIDTHNUM-NEXT: store i64 [[BF_SET]], i64* [[TMP0]], align 4 // BEWIDTHNUM-NEXT: [[BF_RESULT_SHL:%.*]] = shl i64 [[BF_VALUE]], 32 @@ -3446,9 +3590,10 @@ // LE-NEXT: [[INC:%.*]] = add nsw i32 [[BF_CAST]], 1 // LE-NEXT: [[TMP1:%.*]] = zext i32 [[INC]] to i64 // LE-NEXT: [[BF_LOAD1:%.*]] = load i64, i64* [[TMP0]], align 4 +// LE-NEXT: [[BF_FREEZE:%.*]] = freeze i64 [[BF_LOAD1]] // LE-NEXT: [[BF_VALUE:%.*]] = and i64 [[TMP1]], 65535 // LE-NEXT: [[BF_SHL2:%.*]] = shl i64 [[BF_VALUE]], 32 -// LE-NEXT: [[BF_CLEAR:%.*]] = and i64 [[BF_LOAD1]], -281470681743361 +// LE-NEXT: [[BF_CLEAR:%.*]] = and i64 [[BF_FREEZE]], -281470681743361 // LE-NEXT: [[BF_SET:%.*]] = or i64 [[BF_CLEAR]], [[BF_SHL2]] // LE-NEXT: store i64 [[BF_SET]], i64* [[TMP0]], align 4 // LE-NEXT: [[BF_RESULT_SHL:%.*]] = shl i64 [[BF_VALUE]], 48 @@ -3466,9 +3611,10 @@ // BE-NEXT: [[INC:%.*]] = add nsw i32 [[BF_CAST]], 1 // BE-NEXT: [[TMP1:%.*]] = zext i32 [[INC]] to i64 // BE-NEXT: [[BF_LOAD1:%.*]] = load i64, i64* [[TMP0]], align 4 +// BE-NEXT: [[BF_FREEZE:%.*]] = freeze i64 [[BF_LOAD1]] // BE-NEXT: [[BF_VALUE:%.*]] = and i64 [[TMP1]], 65535 // BE-NEXT: [[BF_SHL2:%.*]] = shl i64 [[BF_VALUE]], 16 -// BE-NEXT: [[BF_CLEAR:%.*]] = and i64 [[BF_LOAD1]], -4294901761 +// BE-NEXT: [[BF_CLEAR:%.*]] = and i64 [[BF_FREEZE]], -4294901761 // BE-NEXT: [[BF_SET:%.*]] = or i64 [[BF_CLEAR]], [[BF_SHL2]] // BE-NEXT: store i64 [[BF_SET]], i64* [[TMP0]], align 4 // BE-NEXT: [[BF_RESULT_SHL:%.*]] = shl i64 [[BF_VALUE]], 48 @@ -3486,9 +3632,10 @@ // LENUMLOADS-NEXT: [[INC:%.*]] = add nsw i32 [[BF_CAST]], 1 // LENUMLOADS-NEXT: [[TMP1:%.*]] = zext i32 [[INC]] to i64 // LENUMLOADS-NEXT: [[BF_LOAD1:%.*]] = load i64, i64* [[TMP0]], align 4 +// LENUMLOADS-NEXT: [[BF_FREEZE:%.*]] = freeze i64 [[BF_LOAD1]] // LENUMLOADS-NEXT: [[BF_VALUE:%.*]] = and i64 [[TMP1]], 65535 // LENUMLOADS-NEXT: [[BF_SHL2:%.*]] = shl i64 [[BF_VALUE]], 32 -// LENUMLOADS-NEXT: [[BF_CLEAR:%.*]] = and i64 [[BF_LOAD1]], -281470681743361 +// LENUMLOADS-NEXT: [[BF_CLEAR:%.*]] = and i64 [[BF_FREEZE]], -281470681743361 // LENUMLOADS-NEXT: [[BF_SET:%.*]] = or i64 [[BF_CLEAR]], [[BF_SHL2]] // LENUMLOADS-NEXT: store i64 [[BF_SET]], i64* [[TMP0]], align 4 // LENUMLOADS-NEXT: [[BF_RESULT_SHL:%.*]] = shl i64 [[BF_VALUE]], 48 @@ -3506,9 +3653,10 @@ // BENUMLOADS-NEXT: [[INC:%.*]] = add nsw i32 [[BF_CAST]], 1 // BENUMLOADS-NEXT: [[TMP1:%.*]] = zext i32 [[INC]] to i64 // BENUMLOADS-NEXT: [[BF_LOAD1:%.*]] = load i64, i64* [[TMP0]], align 4 +// BENUMLOADS-NEXT: [[BF_FREEZE:%.*]] = freeze i64 [[BF_LOAD1]] // BENUMLOADS-NEXT: [[BF_VALUE:%.*]] = and i64 [[TMP1]], 65535 // BENUMLOADS-NEXT: [[BF_SHL2:%.*]] = shl i64 [[BF_VALUE]], 16 -// BENUMLOADS-NEXT: [[BF_CLEAR:%.*]] = and i64 [[BF_LOAD1]], -4294901761 +// BENUMLOADS-NEXT: [[BF_CLEAR:%.*]] = and i64 [[BF_FREEZE]], -4294901761 // BENUMLOADS-NEXT: [[BF_SET:%.*]] = or i64 [[BF_CLEAR]], [[BF_SHL2]] // BENUMLOADS-NEXT: store i64 [[BF_SET]], i64* [[TMP0]], align 4 // BENUMLOADS-NEXT: [[BF_RESULT_SHL:%.*]] = shl i64 [[BF_VALUE]], 48 @@ -3526,9 +3674,10 @@ // LEWIDTH-NEXT: [[INC:%.*]] = add nsw i32 [[BF_CAST]], 1 // LEWIDTH-NEXT: [[TMP1:%.*]] = zext i32 [[INC]] to i64 // LEWIDTH-NEXT: [[BF_LOAD1:%.*]] = load i64, i64* [[TMP0]], align 4 +// LEWIDTH-NEXT: [[BF_FREEZE:%.*]] = freeze i64 [[BF_LOAD1]] // LEWIDTH-NEXT: [[BF_VALUE:%.*]] = and i64 [[TMP1]], 65535 // LEWIDTH-NEXT: [[BF_SHL2:%.*]] = shl i64 [[BF_VALUE]], 32 -// LEWIDTH-NEXT: [[BF_CLEAR:%.*]] = and i64 [[BF_LOAD1]], -281470681743361 +// LEWIDTH-NEXT: [[BF_CLEAR:%.*]] = and i64 [[BF_FREEZE]], -281470681743361 // LEWIDTH-NEXT: [[BF_SET:%.*]] = or i64 [[BF_CLEAR]], [[BF_SHL2]] // LEWIDTH-NEXT: store i64 [[BF_SET]], i64* [[TMP0]], align 4 // LEWIDTH-NEXT: [[BF_RESULT_SHL:%.*]] = shl i64 [[BF_VALUE]], 48 @@ -3546,9 +3695,10 @@ // BEWIDTH-NEXT: [[INC:%.*]] = add nsw i32 [[BF_CAST]], 1 // BEWIDTH-NEXT: [[TMP1:%.*]] = zext i32 [[INC]] to i64 // BEWIDTH-NEXT: [[BF_LOAD1:%.*]] = load i64, i64* [[TMP0]], align 4 +// BEWIDTH-NEXT: [[BF_FREEZE:%.*]] = freeze i64 [[BF_LOAD1]] // BEWIDTH-NEXT: [[BF_VALUE:%.*]] = and i64 [[TMP1]], 65535 // BEWIDTH-NEXT: [[BF_SHL2:%.*]] = shl i64 [[BF_VALUE]], 16 -// BEWIDTH-NEXT: [[BF_CLEAR:%.*]] = and i64 [[BF_LOAD1]], -4294901761 +// BEWIDTH-NEXT: [[BF_CLEAR:%.*]] = and i64 [[BF_FREEZE]], -4294901761 // BEWIDTH-NEXT: [[BF_SET:%.*]] = or i64 [[BF_CLEAR]], [[BF_SHL2]] // BEWIDTH-NEXT: store i64 [[BF_SET]], i64* [[TMP0]], align 4 // BEWIDTH-NEXT: [[BF_RESULT_SHL:%.*]] = shl i64 [[BF_VALUE]], 48 @@ -3566,9 +3716,10 @@ // LEWIDTHNUM-NEXT: [[INC:%.*]] = add nsw i32 [[BF_CAST]], 1 // LEWIDTHNUM-NEXT: [[TMP1:%.*]] = zext i32 [[INC]] to i64 // LEWIDTHNUM-NEXT: [[BF_LOAD1:%.*]] = load i64, i64* [[TMP0]], align 4 +// LEWIDTHNUM-NEXT: [[BF_FREEZE:%.*]] = freeze i64 [[BF_LOAD1]] // LEWIDTHNUM-NEXT: [[BF_VALUE:%.*]] = and i64 [[TMP1]], 65535 // LEWIDTHNUM-NEXT: [[BF_SHL2:%.*]] = shl i64 [[BF_VALUE]], 32 -// LEWIDTHNUM-NEXT: [[BF_CLEAR:%.*]] = and i64 [[BF_LOAD1]], -281470681743361 +// LEWIDTHNUM-NEXT: [[BF_CLEAR:%.*]] = and i64 [[BF_FREEZE]], -281470681743361 // LEWIDTHNUM-NEXT: [[BF_SET:%.*]] = or i64 [[BF_CLEAR]], [[BF_SHL2]] // LEWIDTHNUM-NEXT: store i64 [[BF_SET]], i64* [[TMP0]], align 4 // LEWIDTHNUM-NEXT: [[BF_RESULT_SHL:%.*]] = shl i64 [[BF_VALUE]], 48 @@ -3586,9 +3737,10 @@ // BEWIDTHNUM-NEXT: [[INC:%.*]] = add nsw i32 [[BF_CAST]], 1 // BEWIDTHNUM-NEXT: [[TMP1:%.*]] = zext i32 [[INC]] to i64 // BEWIDTHNUM-NEXT: [[BF_LOAD1:%.*]] = load i64, i64* [[TMP0]], align 4 +// BEWIDTHNUM-NEXT: [[BF_FREEZE:%.*]] = freeze i64 [[BF_LOAD1]] // BEWIDTHNUM-NEXT: [[BF_VALUE:%.*]] = and i64 [[TMP1]], 65535 // BEWIDTHNUM-NEXT: [[BF_SHL2:%.*]] = shl i64 [[BF_VALUE]], 16 -// BEWIDTHNUM-NEXT: [[BF_CLEAR:%.*]] = and i64 [[BF_LOAD1]], -4294901761 +// BEWIDTHNUM-NEXT: [[BF_CLEAR:%.*]] = and i64 [[BF_FREEZE]], -4294901761 // BEWIDTHNUM-NEXT: [[BF_SET:%.*]] = or i64 [[BF_CLEAR]], [[BF_SHL2]] // BEWIDTHNUM-NEXT: store i64 [[BF_SET]], i64* [[TMP0]], align 4 // BEWIDTHNUM-NEXT: [[BF_RESULT_SHL:%.*]] = shl i64 [[BF_VALUE]], 48 @@ -3611,8 +3763,9 @@ // LE-NEXT: [[INC:%.*]] = add nsw i32 [[BF_CAST]], 1 // LE-NEXT: [[TMP1:%.*]] = zext i32 [[INC]] to i64 // LE-NEXT: [[BF_LOAD1:%.*]] = load i64, i64* [[TMP0]], align 4 +// LE-NEXT: [[BF_FREEZE:%.*]] = freeze i64 [[BF_LOAD1]] // LE-NEXT: [[BF_VALUE:%.*]] = and i64 [[TMP1]], 4294967295 -// LE-NEXT: [[BF_CLEAR:%.*]] = and i64 [[BF_LOAD1]], -4294967296 +// LE-NEXT: [[BF_CLEAR:%.*]] = and i64 [[BF_FREEZE]], -4294967296 // LE-NEXT: [[BF_SET:%.*]] = or i64 [[BF_CLEAR]], [[BF_VALUE]] // LE-NEXT: store i64 [[BF_SET]], i64* [[TMP0]], align 4 // LE-NEXT: [[BF_RESULT_SHL:%.*]] = shl i64 [[BF_VALUE]], 32 @@ -3630,9 +3783,10 @@ // BE-NEXT: [[INC:%.*]] = add nsw i32 [[BF_CAST]], 1 // BE-NEXT: [[TMP1:%.*]] = zext i32 [[INC]] to i64 // BE-NEXT: [[BF_LOAD1:%.*]] = load i64, i64* [[TMP0]], align 4 +// BE-NEXT: [[BF_FREEZE:%.*]] = freeze i64 [[BF_LOAD1]] // BE-NEXT: [[BF_VALUE:%.*]] = and i64 [[TMP1]], 4294967295 // BE-NEXT: [[BF_SHL:%.*]] = shl i64 [[BF_VALUE]], 32 -// BE-NEXT: [[BF_CLEAR:%.*]] = and i64 [[BF_LOAD1]], 4294967295 +// BE-NEXT: [[BF_CLEAR:%.*]] = and i64 [[BF_FREEZE]], 4294967295 // BE-NEXT: [[BF_SET:%.*]] = or i64 [[BF_CLEAR]], [[BF_SHL]] // BE-NEXT: store i64 [[BF_SET]], i64* [[TMP0]], align 4 // BE-NEXT: [[BF_RESULT_SHL:%.*]] = shl i64 [[BF_VALUE]], 32 @@ -3651,8 +3805,9 @@ // LENUMLOADS-NEXT: [[INC:%.*]] = add nsw i32 [[BF_CAST]], 1 // LENUMLOADS-NEXT: [[TMP1:%.*]] = zext i32 [[INC]] to i64 // LENUMLOADS-NEXT: [[BF_LOAD1:%.*]] = load i64, i64* [[TMP0]], align 4 +// LENUMLOADS-NEXT: [[BF_FREEZE:%.*]] = freeze i64 [[BF_LOAD1]] // LENUMLOADS-NEXT: [[BF_VALUE:%.*]] = and i64 [[TMP1]], 4294967295 -// LENUMLOADS-NEXT: [[BF_CLEAR:%.*]] = and i64 [[BF_LOAD1]], -4294967296 +// LENUMLOADS-NEXT: [[BF_CLEAR:%.*]] = and i64 [[BF_FREEZE]], -4294967296 // LENUMLOADS-NEXT: [[BF_SET:%.*]] = or i64 [[BF_CLEAR]], [[BF_VALUE]] // LENUMLOADS-NEXT: store i64 [[BF_SET]], i64* [[TMP0]], align 4 // LENUMLOADS-NEXT: [[BF_RESULT_SHL:%.*]] = shl i64 [[BF_VALUE]], 32 @@ -3670,9 +3825,10 @@ // BENUMLOADS-NEXT: [[INC:%.*]] = add nsw i32 [[BF_CAST]], 1 // BENUMLOADS-NEXT: [[TMP1:%.*]] = zext i32 [[INC]] to i64 // BENUMLOADS-NEXT: [[BF_LOAD1:%.*]] = load i64, i64* [[TMP0]], align 4 +// BENUMLOADS-NEXT: [[BF_FREEZE:%.*]] = freeze i64 [[BF_LOAD1]] // BENUMLOADS-NEXT: [[BF_VALUE:%.*]] = and i64 [[TMP1]], 4294967295 // BENUMLOADS-NEXT: [[BF_SHL:%.*]] = shl i64 [[BF_VALUE]], 32 -// BENUMLOADS-NEXT: [[BF_CLEAR:%.*]] = and i64 [[BF_LOAD1]], 4294967295 +// BENUMLOADS-NEXT: [[BF_CLEAR:%.*]] = and i64 [[BF_FREEZE]], 4294967295 // BENUMLOADS-NEXT: [[BF_SET:%.*]] = or i64 [[BF_CLEAR]], [[BF_SHL]] // BENUMLOADS-NEXT: store i64 [[BF_SET]], i64* [[TMP0]], align 4 // BENUMLOADS-NEXT: [[BF_RESULT_SHL:%.*]] = shl i64 [[BF_VALUE]], 32 @@ -3691,8 +3847,9 @@ // LEWIDTH-NEXT: [[INC:%.*]] = add nsw i32 [[BF_CAST]], 1 // LEWIDTH-NEXT: [[TMP1:%.*]] = zext i32 [[INC]] to i64 // LEWIDTH-NEXT: [[BF_LOAD1:%.*]] = load i64, i64* [[TMP0]], align 4 +// LEWIDTH-NEXT: [[BF_FREEZE:%.*]] = freeze i64 [[BF_LOAD1]] // LEWIDTH-NEXT: [[BF_VALUE:%.*]] = and i64 [[TMP1]], 4294967295 -// LEWIDTH-NEXT: [[BF_CLEAR:%.*]] = and i64 [[BF_LOAD1]], -4294967296 +// LEWIDTH-NEXT: [[BF_CLEAR:%.*]] = and i64 [[BF_FREEZE]], -4294967296 // LEWIDTH-NEXT: [[BF_SET:%.*]] = or i64 [[BF_CLEAR]], [[BF_VALUE]] // LEWIDTH-NEXT: store i64 [[BF_SET]], i64* [[TMP0]], align 4 // LEWIDTH-NEXT: [[BF_RESULT_SHL:%.*]] = shl i64 [[BF_VALUE]], 32 @@ -3710,9 +3867,10 @@ // BEWIDTH-NEXT: [[INC:%.*]] = add nsw i32 [[BF_CAST]], 1 // BEWIDTH-NEXT: [[TMP1:%.*]] = zext i32 [[INC]] to i64 // BEWIDTH-NEXT: [[BF_LOAD1:%.*]] = load i64, i64* [[TMP0]], align 4 +// BEWIDTH-NEXT: [[BF_FREEZE:%.*]] = freeze i64 [[BF_LOAD1]] // BEWIDTH-NEXT: [[BF_VALUE:%.*]] = and i64 [[TMP1]], 4294967295 // BEWIDTH-NEXT: [[BF_SHL:%.*]] = shl i64 [[BF_VALUE]], 32 -// BEWIDTH-NEXT: [[BF_CLEAR:%.*]] = and i64 [[BF_LOAD1]], 4294967295 +// BEWIDTH-NEXT: [[BF_CLEAR:%.*]] = and i64 [[BF_FREEZE]], 4294967295 // BEWIDTH-NEXT: [[BF_SET:%.*]] = or i64 [[BF_CLEAR]], [[BF_SHL]] // BEWIDTH-NEXT: store i64 [[BF_SET]], i64* [[TMP0]], align 4 // BEWIDTH-NEXT: [[BF_RESULT_SHL:%.*]] = shl i64 [[BF_VALUE]], 32 @@ -3731,8 +3889,9 @@ // LEWIDTHNUM-NEXT: [[INC:%.*]] = add nsw i32 [[BF_CAST]], 1 // LEWIDTHNUM-NEXT: [[TMP1:%.*]] = zext i32 [[INC]] to i64 // LEWIDTHNUM-NEXT: [[BF_LOAD1:%.*]] = load i64, i64* [[TMP0]], align 4 +// LEWIDTHNUM-NEXT: [[BF_FREEZE:%.*]] = freeze i64 [[BF_LOAD1]] // LEWIDTHNUM-NEXT: [[BF_VALUE:%.*]] = and i64 [[TMP1]], 4294967295 -// LEWIDTHNUM-NEXT: [[BF_CLEAR:%.*]] = and i64 [[BF_LOAD1]], -4294967296 +// LEWIDTHNUM-NEXT: [[BF_CLEAR:%.*]] = and i64 [[BF_FREEZE]], -4294967296 // LEWIDTHNUM-NEXT: [[BF_SET:%.*]] = or i64 [[BF_CLEAR]], [[BF_VALUE]] // LEWIDTHNUM-NEXT: store i64 [[BF_SET]], i64* [[TMP0]], align 4 // LEWIDTHNUM-NEXT: [[BF_RESULT_SHL:%.*]] = shl i64 [[BF_VALUE]], 32 @@ -3750,9 +3909,10 @@ // BEWIDTHNUM-NEXT: [[INC:%.*]] = add nsw i32 [[BF_CAST]], 1 // BEWIDTHNUM-NEXT: [[TMP1:%.*]] = zext i32 [[INC]] to i64 // BEWIDTHNUM-NEXT: [[BF_LOAD1:%.*]] = load i64, i64* [[TMP0]], align 4 +// BEWIDTHNUM-NEXT: [[BF_FREEZE:%.*]] = freeze i64 [[BF_LOAD1]] // BEWIDTHNUM-NEXT: [[BF_VALUE:%.*]] = and i64 [[TMP1]], 4294967295 // BEWIDTHNUM-NEXT: [[BF_SHL:%.*]] = shl i64 [[BF_VALUE]], 32 -// BEWIDTHNUM-NEXT: [[BF_CLEAR:%.*]] = and i64 [[BF_LOAD1]], 4294967295 +// BEWIDTHNUM-NEXT: [[BF_CLEAR:%.*]] = and i64 [[BF_FREEZE]], 4294967295 // BEWIDTHNUM-NEXT: [[BF_SET:%.*]] = or i64 [[BF_CLEAR]], [[BF_SHL]] // BEWIDTHNUM-NEXT: store i64 [[BF_SET]], i64* [[TMP0]], align 4 // BEWIDTHNUM-NEXT: [[BF_RESULT_SHL:%.*]] = shl i64 [[BF_VALUE]], 32 @@ -3775,9 +3935,10 @@ // LE-NEXT: [[INC:%.*]] = add nsw i32 [[BF_CAST]], 1 // LE-NEXT: [[TMP1:%.*]] = zext i32 [[INC]] to i64 // LE-NEXT: [[BF_LOAD1:%.*]] = load i64, i64* [[TMP0]], align 4 +// LE-NEXT: [[BF_FREEZE:%.*]] = freeze i64 [[BF_LOAD1]] // LE-NEXT: [[BF_VALUE:%.*]] = and i64 [[TMP1]], 65535 // LE-NEXT: [[BF_SHL2:%.*]] = shl i64 [[BF_VALUE]], 32 -// LE-NEXT: [[BF_CLEAR:%.*]] = and i64 [[BF_LOAD1]], -281470681743361 +// LE-NEXT: [[BF_CLEAR:%.*]] = and i64 [[BF_FREEZE]], -281470681743361 // LE-NEXT: [[BF_SET:%.*]] = or i64 [[BF_CLEAR]], [[BF_SHL2]] // LE-NEXT: store i64 [[BF_SET]], i64* [[TMP0]], align 4 // LE-NEXT: [[BF_RESULT_SHL:%.*]] = shl i64 [[BF_VALUE]], 48 @@ -3796,9 +3957,10 @@ // BE-NEXT: [[INC:%.*]] = add nsw i32 [[BF_CAST]], 1 // BE-NEXT: [[TMP1:%.*]] = zext i32 [[INC]] to i64 // BE-NEXT: [[BF_LOAD1:%.*]] = load i64, i64* [[TMP0]], align 4 +// BE-NEXT: [[BF_FREEZE:%.*]] = freeze i64 [[BF_LOAD1]] // BE-NEXT: [[BF_VALUE:%.*]] = and i64 [[TMP1]], 65535 // BE-NEXT: [[BF_SHL2:%.*]] = shl i64 [[BF_VALUE]], 16 -// BE-NEXT: [[BF_CLEAR:%.*]] = and i64 [[BF_LOAD1]], -4294901761 +// BE-NEXT: [[BF_CLEAR:%.*]] = and i64 [[BF_FREEZE]], -4294901761 // BE-NEXT: [[BF_SET:%.*]] = or i64 [[BF_CLEAR]], [[BF_SHL2]] // BE-NEXT: store i64 [[BF_SET]], i64* [[TMP0]], align 4 // BE-NEXT: [[BF_RESULT_SHL:%.*]] = shl i64 [[BF_VALUE]], 48 @@ -3817,9 +3979,10 @@ // LENUMLOADS-NEXT: [[INC:%.*]] = add nsw i32 [[BF_CAST]], 1 // LENUMLOADS-NEXT: [[TMP1:%.*]] = zext i32 [[INC]] to i64 // LENUMLOADS-NEXT: [[BF_LOAD1:%.*]] = load i64, i64* [[TMP0]], align 4 +// LENUMLOADS-NEXT: [[BF_FREEZE:%.*]] = freeze i64 [[BF_LOAD1]] // LENUMLOADS-NEXT: [[BF_VALUE:%.*]] = and i64 [[TMP1]], 65535 // LENUMLOADS-NEXT: [[BF_SHL2:%.*]] = shl i64 [[BF_VALUE]], 32 -// LENUMLOADS-NEXT: [[BF_CLEAR:%.*]] = and i64 [[BF_LOAD1]], -281470681743361 +// LENUMLOADS-NEXT: [[BF_CLEAR:%.*]] = and i64 [[BF_FREEZE]], -281470681743361 // LENUMLOADS-NEXT: [[BF_SET:%.*]] = or i64 [[BF_CLEAR]], [[BF_SHL2]] // LENUMLOADS-NEXT: store i64 [[BF_SET]], i64* [[TMP0]], align 4 // LENUMLOADS-NEXT: [[BF_RESULT_SHL:%.*]] = shl i64 [[BF_VALUE]], 48 @@ -3838,9 +4001,10 @@ // BENUMLOADS-NEXT: [[INC:%.*]] = add nsw i32 [[BF_CAST]], 1 // BENUMLOADS-NEXT: [[TMP1:%.*]] = zext i32 [[INC]] to i64 // BENUMLOADS-NEXT: [[BF_LOAD1:%.*]] = load i64, i64* [[TMP0]], align 4 +// BENUMLOADS-NEXT: [[BF_FREEZE:%.*]] = freeze i64 [[BF_LOAD1]] // BENUMLOADS-NEXT: [[BF_VALUE:%.*]] = and i64 [[TMP1]], 65535 // BENUMLOADS-NEXT: [[BF_SHL2:%.*]] = shl i64 [[BF_VALUE]], 16 -// BENUMLOADS-NEXT: [[BF_CLEAR:%.*]] = and i64 [[BF_LOAD1]], -4294901761 +// BENUMLOADS-NEXT: [[BF_CLEAR:%.*]] = and i64 [[BF_FREEZE]], -4294901761 // BENUMLOADS-NEXT: [[BF_SET:%.*]] = or i64 [[BF_CLEAR]], [[BF_SHL2]] // BENUMLOADS-NEXT: store i64 [[BF_SET]], i64* [[TMP0]], align 4 // BENUMLOADS-NEXT: [[BF_RESULT_SHL:%.*]] = shl i64 [[BF_VALUE]], 48 @@ -3859,9 +4023,10 @@ // LEWIDTH-NEXT: [[INC:%.*]] = add nsw i32 [[BF_CAST]], 1 // LEWIDTH-NEXT: [[TMP1:%.*]] = zext i32 [[INC]] to i64 // LEWIDTH-NEXT: [[BF_LOAD1:%.*]] = load i64, i64* [[TMP0]], align 4 +// LEWIDTH-NEXT: [[BF_FREEZE:%.*]] = freeze i64 [[BF_LOAD1]] // LEWIDTH-NEXT: [[BF_VALUE:%.*]] = and i64 [[TMP1]], 65535 // LEWIDTH-NEXT: [[BF_SHL2:%.*]] = shl i64 [[BF_VALUE]], 32 -// LEWIDTH-NEXT: [[BF_CLEAR:%.*]] = and i64 [[BF_LOAD1]], -281470681743361 +// LEWIDTH-NEXT: [[BF_CLEAR:%.*]] = and i64 [[BF_FREEZE]], -281470681743361 // LEWIDTH-NEXT: [[BF_SET:%.*]] = or i64 [[BF_CLEAR]], [[BF_SHL2]] // LEWIDTH-NEXT: store i64 [[BF_SET]], i64* [[TMP0]], align 4 // LEWIDTH-NEXT: [[BF_RESULT_SHL:%.*]] = shl i64 [[BF_VALUE]], 48 @@ -3880,9 +4045,10 @@ // BEWIDTH-NEXT: [[INC:%.*]] = add nsw i32 [[BF_CAST]], 1 // BEWIDTH-NEXT: [[TMP1:%.*]] = zext i32 [[INC]] to i64 // BEWIDTH-NEXT: [[BF_LOAD1:%.*]] = load i64, i64* [[TMP0]], align 4 +// BEWIDTH-NEXT: [[BF_FREEZE:%.*]] = freeze i64 [[BF_LOAD1]] // BEWIDTH-NEXT: [[BF_VALUE:%.*]] = and i64 [[TMP1]], 65535 // BEWIDTH-NEXT: [[BF_SHL2:%.*]] = shl i64 [[BF_VALUE]], 16 -// BEWIDTH-NEXT: [[BF_CLEAR:%.*]] = and i64 [[BF_LOAD1]], -4294901761 +// BEWIDTH-NEXT: [[BF_CLEAR:%.*]] = and i64 [[BF_FREEZE]], -4294901761 // BEWIDTH-NEXT: [[BF_SET:%.*]] = or i64 [[BF_CLEAR]], [[BF_SHL2]] // BEWIDTH-NEXT: store i64 [[BF_SET]], i64* [[TMP0]], align 4 // BEWIDTH-NEXT: [[BF_RESULT_SHL:%.*]] = shl i64 [[BF_VALUE]], 48 @@ -3901,9 +4067,10 @@ // LEWIDTHNUM-NEXT: [[INC:%.*]] = add nsw i32 [[BF_CAST]], 1 // LEWIDTHNUM-NEXT: [[TMP1:%.*]] = zext i32 [[INC]] to i64 // LEWIDTHNUM-NEXT: [[BF_LOAD1:%.*]] = load i64, i64* [[TMP0]], align 4 +// LEWIDTHNUM-NEXT: [[BF_FREEZE:%.*]] = freeze i64 [[BF_LOAD1]] // LEWIDTHNUM-NEXT: [[BF_VALUE:%.*]] = and i64 [[TMP1]], 65535 // LEWIDTHNUM-NEXT: [[BF_SHL2:%.*]] = shl i64 [[BF_VALUE]], 32 -// LEWIDTHNUM-NEXT: [[BF_CLEAR:%.*]] = and i64 [[BF_LOAD1]], -281470681743361 +// LEWIDTHNUM-NEXT: [[BF_CLEAR:%.*]] = and i64 [[BF_FREEZE]], -281470681743361 // LEWIDTHNUM-NEXT: [[BF_SET:%.*]] = or i64 [[BF_CLEAR]], [[BF_SHL2]] // LEWIDTHNUM-NEXT: store i64 [[BF_SET]], i64* [[TMP0]], align 4 // LEWIDTHNUM-NEXT: [[BF_RESULT_SHL:%.*]] = shl i64 [[BF_VALUE]], 48 @@ -3922,9 +4089,10 @@ // BEWIDTHNUM-NEXT: [[INC:%.*]] = add nsw i32 [[BF_CAST]], 1 // BEWIDTHNUM-NEXT: [[TMP1:%.*]] = zext i32 [[INC]] to i64 // BEWIDTHNUM-NEXT: [[BF_LOAD1:%.*]] = load i64, i64* [[TMP0]], align 4 +// BEWIDTHNUM-NEXT: [[BF_FREEZE:%.*]] = freeze i64 [[BF_LOAD1]] // BEWIDTHNUM-NEXT: [[BF_VALUE:%.*]] = and i64 [[TMP1]], 65535 // BEWIDTHNUM-NEXT: [[BF_SHL2:%.*]] = shl i64 [[BF_VALUE]], 16 -// BEWIDTHNUM-NEXT: [[BF_CLEAR:%.*]] = and i64 [[BF_LOAD1]], -4294901761 +// BEWIDTHNUM-NEXT: [[BF_CLEAR:%.*]] = and i64 [[BF_FREEZE]], -4294901761 // BEWIDTHNUM-NEXT: [[BF_SET:%.*]] = or i64 [[BF_CLEAR]], [[BF_SHL2]] // BEWIDTHNUM-NEXT: store i64 [[BF_SET]], i64* [[TMP0]], align 4 // BEWIDTHNUM-NEXT: [[BF_RESULT_SHL:%.*]] = shl i64 [[BF_VALUE]], 48 @@ -3946,8 +4114,9 @@ // LE-NEXT: [[INC:%.*]] = add nsw i32 [[BF_CAST]], 1 // LE-NEXT: [[TMP1:%.*]] = zext i32 [[INC]] to i64 // LE-NEXT: [[BF_LOAD1:%.*]] = load volatile i64, i64* [[TMP0]], align 4 +// LE-NEXT: [[BF_FREEZE:%.*]] = freeze i64 [[BF_LOAD1]] // LE-NEXT: [[BF_VALUE:%.*]] = and i64 [[TMP1]], 4294967295 -// LE-NEXT: [[BF_CLEAR:%.*]] = and i64 [[BF_LOAD1]], -4294967296 +// LE-NEXT: [[BF_CLEAR:%.*]] = and i64 [[BF_FREEZE]], -4294967296 // LE-NEXT: [[BF_SET:%.*]] = or i64 [[BF_CLEAR]], [[BF_VALUE]] // LE-NEXT: store volatile i64 [[BF_SET]], i64* [[TMP0]], align 4 // LE-NEXT: [[BF_RESULT_SHL:%.*]] = shl i64 [[BF_VALUE]], 32 @@ -3964,9 +4133,10 @@ // BE-NEXT: [[INC:%.*]] = add nsw i32 [[BF_CAST]], 1 // BE-NEXT: [[TMP1:%.*]] = zext i32 [[INC]] to i64 // BE-NEXT: [[BF_LOAD1:%.*]] = load volatile i64, i64* [[TMP0]], align 4 +// BE-NEXT: [[BF_FREEZE:%.*]] = freeze i64 [[BF_LOAD1]] // BE-NEXT: [[BF_VALUE:%.*]] = and i64 [[TMP1]], 4294967295 // BE-NEXT: [[BF_SHL:%.*]] = shl i64 [[BF_VALUE]], 32 -// BE-NEXT: [[BF_CLEAR:%.*]] = and i64 [[BF_LOAD1]], 4294967295 +// BE-NEXT: [[BF_CLEAR:%.*]] = and i64 [[BF_FREEZE]], 4294967295 // BE-NEXT: [[BF_SET:%.*]] = or i64 [[BF_CLEAR]], [[BF_SHL]] // BE-NEXT: store volatile i64 [[BF_SET]], i64* [[TMP0]], align 4 // BE-NEXT: [[BF_RESULT_SHL:%.*]] = shl i64 [[BF_VALUE]], 32 @@ -3984,8 +4154,9 @@ // LENUMLOADS-NEXT: [[INC:%.*]] = add nsw i32 [[BF_CAST]], 1 // LENUMLOADS-NEXT: [[TMP1:%.*]] = zext i32 [[INC]] to i64 // LENUMLOADS-NEXT: [[BF_LOAD1:%.*]] = load volatile i64, i64* [[TMP0]], align 4 +// LENUMLOADS-NEXT: [[BF_FREEZE:%.*]] = freeze i64 [[BF_LOAD1]] // LENUMLOADS-NEXT: [[BF_VALUE:%.*]] = and i64 [[TMP1]], 4294967295 -// LENUMLOADS-NEXT: [[BF_CLEAR:%.*]] = and i64 [[BF_LOAD1]], -4294967296 +// LENUMLOADS-NEXT: [[BF_CLEAR:%.*]] = and i64 [[BF_FREEZE]], -4294967296 // LENUMLOADS-NEXT: [[BF_SET:%.*]] = or i64 [[BF_CLEAR]], [[BF_VALUE]] // LENUMLOADS-NEXT: store volatile i64 [[BF_SET]], i64* [[TMP0]], align 4 // LENUMLOADS-NEXT: [[BF_RESULT_SHL:%.*]] = shl i64 [[BF_VALUE]], 32 @@ -4002,9 +4173,10 @@ // BENUMLOADS-NEXT: [[INC:%.*]] = add nsw i32 [[BF_CAST]], 1 // BENUMLOADS-NEXT: [[TMP1:%.*]] = zext i32 [[INC]] to i64 // BENUMLOADS-NEXT: [[BF_LOAD1:%.*]] = load volatile i64, i64* [[TMP0]], align 4 +// BENUMLOADS-NEXT: [[BF_FREEZE:%.*]] = freeze i64 [[BF_LOAD1]] // BENUMLOADS-NEXT: [[BF_VALUE:%.*]] = and i64 [[TMP1]], 4294967295 // BENUMLOADS-NEXT: [[BF_SHL:%.*]] = shl i64 [[BF_VALUE]], 32 -// BENUMLOADS-NEXT: [[BF_CLEAR:%.*]] = and i64 [[BF_LOAD1]], 4294967295 +// BENUMLOADS-NEXT: [[BF_CLEAR:%.*]] = and i64 [[BF_FREEZE]], 4294967295 // BENUMLOADS-NEXT: [[BF_SET:%.*]] = or i64 [[BF_CLEAR]], [[BF_SHL]] // BENUMLOADS-NEXT: store volatile i64 [[BF_SET]], i64* [[TMP0]], align 4 // BENUMLOADS-NEXT: [[BF_RESULT_SHL:%.*]] = shl i64 [[BF_VALUE]], 32 @@ -4060,9 +4232,10 @@ // LE-NEXT: [[INC:%.*]] = add nsw i32 [[BF_CAST]], 1 // LE-NEXT: [[TMP1:%.*]] = zext i32 [[INC]] to i64 // LE-NEXT: [[BF_LOAD1:%.*]] = load volatile i64, i64* [[TMP0]], align 4 +// LE-NEXT: [[BF_FREEZE:%.*]] = freeze i64 [[BF_LOAD1]] // LE-NEXT: [[BF_VALUE:%.*]] = and i64 [[TMP1]], 65535 // LE-NEXT: [[BF_SHL2:%.*]] = shl i64 [[BF_VALUE]], 32 -// LE-NEXT: [[BF_CLEAR:%.*]] = and i64 [[BF_LOAD1]], -281470681743361 +// LE-NEXT: [[BF_CLEAR:%.*]] = and i64 [[BF_FREEZE]], -281470681743361 // LE-NEXT: [[BF_SET:%.*]] = or i64 [[BF_CLEAR]], [[BF_SHL2]] // LE-NEXT: store volatile i64 [[BF_SET]], i64* [[TMP0]], align 4 // LE-NEXT: [[BF_RESULT_SHL:%.*]] = shl i64 [[BF_VALUE]], 48 @@ -4080,9 +4253,10 @@ // BE-NEXT: [[INC:%.*]] = add nsw i32 [[BF_CAST]], 1 // BE-NEXT: [[TMP1:%.*]] = zext i32 [[INC]] to i64 // BE-NEXT: [[BF_LOAD1:%.*]] = load volatile i64, i64* [[TMP0]], align 4 +// BE-NEXT: [[BF_FREEZE:%.*]] = freeze i64 [[BF_LOAD1]] // BE-NEXT: [[BF_VALUE:%.*]] = and i64 [[TMP1]], 65535 // BE-NEXT: [[BF_SHL2:%.*]] = shl i64 [[BF_VALUE]], 16 -// BE-NEXT: [[BF_CLEAR:%.*]] = and i64 [[BF_LOAD1]], -4294901761 +// BE-NEXT: [[BF_CLEAR:%.*]] = and i64 [[BF_FREEZE]], -4294901761 // BE-NEXT: [[BF_SET:%.*]] = or i64 [[BF_CLEAR]], [[BF_SHL2]] // BE-NEXT: store volatile i64 [[BF_SET]], i64* [[TMP0]], align 4 // BE-NEXT: [[BF_RESULT_SHL:%.*]] = shl i64 [[BF_VALUE]], 48 @@ -4100,9 +4274,10 @@ // LENUMLOADS-NEXT: [[INC:%.*]] = add nsw i32 [[BF_CAST]], 1 // LENUMLOADS-NEXT: [[TMP1:%.*]] = zext i32 [[INC]] to i64 // LENUMLOADS-NEXT: [[BF_LOAD1:%.*]] = load volatile i64, i64* [[TMP0]], align 4 +// LENUMLOADS-NEXT: [[BF_FREEZE:%.*]] = freeze i64 [[BF_LOAD1]] // LENUMLOADS-NEXT: [[BF_VALUE:%.*]] = and i64 [[TMP1]], 65535 // LENUMLOADS-NEXT: [[BF_SHL2:%.*]] = shl i64 [[BF_VALUE]], 32 -// LENUMLOADS-NEXT: [[BF_CLEAR:%.*]] = and i64 [[BF_LOAD1]], -281470681743361 +// LENUMLOADS-NEXT: [[BF_CLEAR:%.*]] = and i64 [[BF_FREEZE]], -281470681743361 // LENUMLOADS-NEXT: [[BF_SET:%.*]] = or i64 [[BF_CLEAR]], [[BF_SHL2]] // LENUMLOADS-NEXT: store volatile i64 [[BF_SET]], i64* [[TMP0]], align 4 // LENUMLOADS-NEXT: [[BF_RESULT_SHL:%.*]] = shl i64 [[BF_VALUE]], 48 @@ -4120,9 +4295,10 @@ // BENUMLOADS-NEXT: [[INC:%.*]] = add nsw i32 [[BF_CAST]], 1 // BENUMLOADS-NEXT: [[TMP1:%.*]] = zext i32 [[INC]] to i64 // BENUMLOADS-NEXT: [[BF_LOAD1:%.*]] = load volatile i64, i64* [[TMP0]], align 4 +// BENUMLOADS-NEXT: [[BF_FREEZE:%.*]] = freeze i64 [[BF_LOAD1]] // BENUMLOADS-NEXT: [[BF_VALUE:%.*]] = and i64 [[TMP1]], 65535 // BENUMLOADS-NEXT: [[BF_SHL2:%.*]] = shl i64 [[BF_VALUE]], 16 -// BENUMLOADS-NEXT: [[BF_CLEAR:%.*]] = and i64 [[BF_LOAD1]], -4294901761 +// BENUMLOADS-NEXT: [[BF_CLEAR:%.*]] = and i64 [[BF_FREEZE]], -4294901761 // BENUMLOADS-NEXT: [[BF_SET:%.*]] = or i64 [[BF_CLEAR]], [[BF_SHL2]] // BENUMLOADS-NEXT: store volatile i64 [[BF_SET]], i64* [[TMP0]], align 4 // BENUMLOADS-NEXT: [[BF_RESULT_SHL:%.*]] = shl i64 [[BF_VALUE]], 48 @@ -4139,8 +4315,9 @@ // LEWIDTH-NEXT: [[BF_ASHR:%.*]] = ashr i32 [[BF_SHL]], 16 // LEWIDTH-NEXT: [[INC:%.*]] = add nsw i32 [[BF_ASHR]], 1 // LEWIDTH-NEXT: [[BF_LOAD1:%.*]] = load volatile i32, i32* [[TMP1]], align 4 +// LEWIDTH-NEXT: [[BF_FREEZE:%.*]] = freeze i32 [[BF_LOAD1]] // LEWIDTH-NEXT: [[BF_VALUE:%.*]] = and i32 [[INC]], 65535 -// LEWIDTH-NEXT: [[BF_CLEAR:%.*]] = and i32 [[BF_LOAD1]], -65536 +// LEWIDTH-NEXT: [[BF_CLEAR:%.*]] = and i32 [[BF_FREEZE]], -65536 // LEWIDTH-NEXT: [[BF_SET:%.*]] = or i32 [[BF_CLEAR]], [[BF_VALUE]] // LEWIDTH-NEXT: store volatile i32 [[BF_SET]], i32* [[TMP1]], align 4 // LEWIDTH-NEXT: [[BF_RESULT_SHL:%.*]] = shl i32 [[BF_VALUE]], 16 @@ -4155,9 +4332,10 @@ // BEWIDTH-NEXT: [[BF_ASHR:%.*]] = ashr i32 [[BF_LOAD]], 16 // BEWIDTH-NEXT: [[INC:%.*]] = add nsw i32 [[BF_ASHR]], 1 // BEWIDTH-NEXT: [[BF_LOAD1:%.*]] = load volatile i32, i32* [[TMP1]], align 4 +// BEWIDTH-NEXT: [[BF_FREEZE:%.*]] = freeze i32 [[BF_LOAD1]] // BEWIDTH-NEXT: [[BF_VALUE:%.*]] = and i32 [[INC]], 65535 // BEWIDTH-NEXT: [[BF_SHL:%.*]] = shl i32 [[BF_VALUE]], 16 -// BEWIDTH-NEXT: [[BF_CLEAR:%.*]] = and i32 [[BF_LOAD1]], 65535 +// BEWIDTH-NEXT: [[BF_CLEAR:%.*]] = and i32 [[BF_FREEZE]], 65535 // BEWIDTH-NEXT: [[BF_SET:%.*]] = or i32 [[BF_CLEAR]], [[BF_SHL]] // BEWIDTH-NEXT: store volatile i32 [[BF_SET]], i32* [[TMP1]], align 4 // BEWIDTH-NEXT: [[BF_RESULT_SHL:%.*]] = shl i32 [[BF_VALUE]], 16 @@ -4173,8 +4351,9 @@ // LEWIDTHNUM-NEXT: [[BF_ASHR:%.*]] = ashr i32 [[BF_SHL]], 16 // LEWIDTHNUM-NEXT: [[INC:%.*]] = add nsw i32 [[BF_ASHR]], 1 // LEWIDTHNUM-NEXT: [[BF_LOAD1:%.*]] = load volatile i32, i32* [[TMP1]], align 4 +// LEWIDTHNUM-NEXT: [[BF_FREEZE:%.*]] = freeze i32 [[BF_LOAD1]] // LEWIDTHNUM-NEXT: [[BF_VALUE:%.*]] = and i32 [[INC]], 65535 -// LEWIDTHNUM-NEXT: [[BF_CLEAR:%.*]] = and i32 [[BF_LOAD1]], -65536 +// LEWIDTHNUM-NEXT: [[BF_CLEAR:%.*]] = and i32 [[BF_FREEZE]], -65536 // LEWIDTHNUM-NEXT: [[BF_SET:%.*]] = or i32 [[BF_CLEAR]], [[BF_VALUE]] // LEWIDTHNUM-NEXT: store volatile i32 [[BF_SET]], i32* [[TMP1]], align 4 // LEWIDTHNUM-NEXT: [[BF_RESULT_SHL:%.*]] = shl i32 [[BF_VALUE]], 16 @@ -4189,9 +4368,10 @@ // BEWIDTHNUM-NEXT: [[BF_ASHR:%.*]] = ashr i32 [[BF_LOAD]], 16 // BEWIDTHNUM-NEXT: [[INC:%.*]] = add nsw i32 [[BF_ASHR]], 1 // BEWIDTHNUM-NEXT: [[BF_LOAD1:%.*]] = load volatile i32, i32* [[TMP1]], align 4 +// BEWIDTHNUM-NEXT: [[BF_FREEZE:%.*]] = freeze i32 [[BF_LOAD1]] // BEWIDTHNUM-NEXT: [[BF_VALUE:%.*]] = and i32 [[INC]], 65535 // BEWIDTHNUM-NEXT: [[BF_SHL:%.*]] = shl i32 [[BF_VALUE]], 16 -// BEWIDTHNUM-NEXT: [[BF_CLEAR:%.*]] = and i32 [[BF_LOAD1]], 65535 +// BEWIDTHNUM-NEXT: [[BF_CLEAR:%.*]] = and i32 [[BF_FREEZE]], 65535 // BEWIDTHNUM-NEXT: [[BF_SET:%.*]] = or i32 [[BF_CLEAR]], [[BF_SHL]] // BEWIDTHNUM-NEXT: store volatile i32 [[BF_SET]], i32* [[TMP1]], align 4 // BEWIDTHNUM-NEXT: [[BF_RESULT_SHL:%.*]] = shl i32 [[BF_VALUE]], 16 @@ -4213,8 +4393,9 @@ // LE-NEXT: [[INC:%.*]] = add nsw i32 [[BF_CAST]], 1 // LE-NEXT: [[TMP1:%.*]] = zext i32 [[INC]] to i64 // LE-NEXT: [[BF_LOAD1:%.*]] = load volatile i64, i64* [[TMP0]], align 4 +// LE-NEXT: [[BF_FREEZE:%.*]] = freeze i64 [[BF_LOAD1]] // LE-NEXT: [[BF_VALUE:%.*]] = and i64 [[TMP1]], 4294967295 -// LE-NEXT: [[BF_CLEAR:%.*]] = and i64 [[BF_LOAD1]], -4294967296 +// LE-NEXT: [[BF_CLEAR:%.*]] = and i64 [[BF_FREEZE]], -4294967296 // LE-NEXT: [[BF_SET:%.*]] = or i64 [[BF_CLEAR]], [[BF_VALUE]] // LE-NEXT: store volatile i64 [[BF_SET]], i64* [[TMP0]], align 4 // LE-NEXT: [[BF_RESULT_SHL:%.*]] = shl i64 [[BF_VALUE]], 32 @@ -4232,9 +4413,10 @@ // BE-NEXT: [[INC:%.*]] = add nsw i32 [[BF_CAST]], 1 // BE-NEXT: [[TMP1:%.*]] = zext i32 [[INC]] to i64 // BE-NEXT: [[BF_LOAD1:%.*]] = load volatile i64, i64* [[TMP0]], align 4 +// BE-NEXT: [[BF_FREEZE:%.*]] = freeze i64 [[BF_LOAD1]] // BE-NEXT: [[BF_VALUE:%.*]] = and i64 [[TMP1]], 4294967295 // BE-NEXT: [[BF_SHL:%.*]] = shl i64 [[BF_VALUE]], 32 -// BE-NEXT: [[BF_CLEAR:%.*]] = and i64 [[BF_LOAD1]], 4294967295 +// BE-NEXT: [[BF_CLEAR:%.*]] = and i64 [[BF_FREEZE]], 4294967295 // BE-NEXT: [[BF_SET:%.*]] = or i64 [[BF_CLEAR]], [[BF_SHL]] // BE-NEXT: store volatile i64 [[BF_SET]], i64* [[TMP0]], align 4 // BE-NEXT: [[BF_RESULT_SHL:%.*]] = shl i64 [[BF_VALUE]], 32 @@ -4253,8 +4435,9 @@ // LENUMLOADS-NEXT: [[INC:%.*]] = add nsw i32 [[BF_CAST]], 1 // LENUMLOADS-NEXT: [[TMP1:%.*]] = zext i32 [[INC]] to i64 // LENUMLOADS-NEXT: [[BF_LOAD1:%.*]] = load volatile i64, i64* [[TMP0]], align 4 +// LENUMLOADS-NEXT: [[BF_FREEZE:%.*]] = freeze i64 [[BF_LOAD1]] // LENUMLOADS-NEXT: [[BF_VALUE:%.*]] = and i64 [[TMP1]], 4294967295 -// LENUMLOADS-NEXT: [[BF_CLEAR:%.*]] = and i64 [[BF_LOAD1]], -4294967296 +// LENUMLOADS-NEXT: [[BF_CLEAR:%.*]] = and i64 [[BF_FREEZE]], -4294967296 // LENUMLOADS-NEXT: [[BF_SET:%.*]] = or i64 [[BF_CLEAR]], [[BF_VALUE]] // LENUMLOADS-NEXT: store volatile i64 [[BF_SET]], i64* [[TMP0]], align 4 // LENUMLOADS-NEXT: [[BF_RESULT_SHL:%.*]] = shl i64 [[BF_VALUE]], 32 @@ -4272,9 +4455,10 @@ // BENUMLOADS-NEXT: [[INC:%.*]] = add nsw i32 [[BF_CAST]], 1 // BENUMLOADS-NEXT: [[TMP1:%.*]] = zext i32 [[INC]] to i64 // BENUMLOADS-NEXT: [[BF_LOAD1:%.*]] = load volatile i64, i64* [[TMP0]], align 4 +// BENUMLOADS-NEXT: [[BF_FREEZE:%.*]] = freeze i64 [[BF_LOAD1]] // BENUMLOADS-NEXT: [[BF_VALUE:%.*]] = and i64 [[TMP1]], 4294967295 // BENUMLOADS-NEXT: [[BF_SHL:%.*]] = shl i64 [[BF_VALUE]], 32 -// BENUMLOADS-NEXT: [[BF_CLEAR:%.*]] = and i64 [[BF_LOAD1]], 4294967295 +// BENUMLOADS-NEXT: [[BF_CLEAR:%.*]] = and i64 [[BF_FREEZE]], 4294967295 // BENUMLOADS-NEXT: [[BF_SET:%.*]] = or i64 [[BF_CLEAR]], [[BF_SHL]] // BENUMLOADS-NEXT: store volatile i64 [[BF_SET]], i64* [[TMP0]], align 4 // BENUMLOADS-NEXT: [[BF_RESULT_SHL:%.*]] = shl i64 [[BF_VALUE]], 32 @@ -4335,9 +4519,10 @@ // LE-NEXT: [[INC:%.*]] = add nsw i32 [[BF_CAST]], 1 // LE-NEXT: [[TMP1:%.*]] = zext i32 [[INC]] to i64 // LE-NEXT: [[BF_LOAD1:%.*]] = load volatile i64, i64* [[TMP0]], align 4 +// LE-NEXT: [[BF_FREEZE:%.*]] = freeze i64 [[BF_LOAD1]] // LE-NEXT: [[BF_VALUE:%.*]] = and i64 [[TMP1]], 65535 // LE-NEXT: [[BF_SHL2:%.*]] = shl i64 [[BF_VALUE]], 32 -// LE-NEXT: [[BF_CLEAR:%.*]] = and i64 [[BF_LOAD1]], -281470681743361 +// LE-NEXT: [[BF_CLEAR:%.*]] = and i64 [[BF_FREEZE]], -281470681743361 // LE-NEXT: [[BF_SET:%.*]] = or i64 [[BF_CLEAR]], [[BF_SHL2]] // LE-NEXT: store volatile i64 [[BF_SET]], i64* [[TMP0]], align 4 // LE-NEXT: [[BF_RESULT_SHL:%.*]] = shl i64 [[BF_VALUE]], 48 @@ -4356,9 +4541,10 @@ // BE-NEXT: [[INC:%.*]] = add nsw i32 [[BF_CAST]], 1 // BE-NEXT: [[TMP1:%.*]] = zext i32 [[INC]] to i64 // BE-NEXT: [[BF_LOAD1:%.*]] = load volatile i64, i64* [[TMP0]], align 4 +// BE-NEXT: [[BF_FREEZE:%.*]] = freeze i64 [[BF_LOAD1]] // BE-NEXT: [[BF_VALUE:%.*]] = and i64 [[TMP1]], 65535 // BE-NEXT: [[BF_SHL2:%.*]] = shl i64 [[BF_VALUE]], 16 -// BE-NEXT: [[BF_CLEAR:%.*]] = and i64 [[BF_LOAD1]], -4294901761 +// BE-NEXT: [[BF_CLEAR:%.*]] = and i64 [[BF_FREEZE]], -4294901761 // BE-NEXT: [[BF_SET:%.*]] = or i64 [[BF_CLEAR]], [[BF_SHL2]] // BE-NEXT: store volatile i64 [[BF_SET]], i64* [[TMP0]], align 4 // BE-NEXT: [[BF_RESULT_SHL:%.*]] = shl i64 [[BF_VALUE]], 48 @@ -4377,9 +4563,10 @@ // LENUMLOADS-NEXT: [[INC:%.*]] = add nsw i32 [[BF_CAST]], 1 // LENUMLOADS-NEXT: [[TMP1:%.*]] = zext i32 [[INC]] to i64 // LENUMLOADS-NEXT: [[BF_LOAD1:%.*]] = load volatile i64, i64* [[TMP0]], align 4 +// LENUMLOADS-NEXT: [[BF_FREEZE:%.*]] = freeze i64 [[BF_LOAD1]] // LENUMLOADS-NEXT: [[BF_VALUE:%.*]] = and i64 [[TMP1]], 65535 // LENUMLOADS-NEXT: [[BF_SHL2:%.*]] = shl i64 [[BF_VALUE]], 32 -// LENUMLOADS-NEXT: [[BF_CLEAR:%.*]] = and i64 [[BF_LOAD1]], -281470681743361 +// LENUMLOADS-NEXT: [[BF_CLEAR:%.*]] = and i64 [[BF_FREEZE]], -281470681743361 // LENUMLOADS-NEXT: [[BF_SET:%.*]] = or i64 [[BF_CLEAR]], [[BF_SHL2]] // LENUMLOADS-NEXT: store volatile i64 [[BF_SET]], i64* [[TMP0]], align 4 // LENUMLOADS-NEXT: [[BF_RESULT_SHL:%.*]] = shl i64 [[BF_VALUE]], 48 @@ -4398,9 +4585,10 @@ // BENUMLOADS-NEXT: [[INC:%.*]] = add nsw i32 [[BF_CAST]], 1 // BENUMLOADS-NEXT: [[TMP1:%.*]] = zext i32 [[INC]] to i64 // BENUMLOADS-NEXT: [[BF_LOAD1:%.*]] = load volatile i64, i64* [[TMP0]], align 4 +// BENUMLOADS-NEXT: [[BF_FREEZE:%.*]] = freeze i64 [[BF_LOAD1]] // BENUMLOADS-NEXT: [[BF_VALUE:%.*]] = and i64 [[TMP1]], 65535 // BENUMLOADS-NEXT: [[BF_SHL2:%.*]] = shl i64 [[BF_VALUE]], 16 -// BENUMLOADS-NEXT: [[BF_CLEAR:%.*]] = and i64 [[BF_LOAD1]], -4294901761 +// BENUMLOADS-NEXT: [[BF_CLEAR:%.*]] = and i64 [[BF_FREEZE]], -4294901761 // BENUMLOADS-NEXT: [[BF_SET:%.*]] = or i64 [[BF_CLEAR]], [[BF_SHL2]] // BENUMLOADS-NEXT: store volatile i64 [[BF_SET]], i64* [[TMP0]], align 4 // BENUMLOADS-NEXT: [[BF_RESULT_SHL:%.*]] = shl i64 [[BF_VALUE]], 48 @@ -4417,8 +4605,9 @@ // LEWIDTH-NEXT: [[BF_ASHR:%.*]] = ashr i32 [[BF_SHL]], 16 // LEWIDTH-NEXT: [[INC:%.*]] = add nsw i32 [[BF_ASHR]], 1 // LEWIDTH-NEXT: [[BF_LOAD1:%.*]] = load volatile i32, i32* [[TMP1]], align 4 +// LEWIDTH-NEXT: [[BF_FREEZE:%.*]] = freeze i32 [[BF_LOAD1]] // LEWIDTH-NEXT: [[BF_VALUE:%.*]] = and i32 [[INC]], 65535 -// LEWIDTH-NEXT: [[BF_CLEAR:%.*]] = and i32 [[BF_LOAD1]], -65536 +// LEWIDTH-NEXT: [[BF_CLEAR:%.*]] = and i32 [[BF_FREEZE]], -65536 // LEWIDTH-NEXT: [[BF_SET:%.*]] = or i32 [[BF_CLEAR]], [[BF_VALUE]] // LEWIDTH-NEXT: store volatile i32 [[BF_SET]], i32* [[TMP1]], align 4 // LEWIDTH-NEXT: [[BF_RESULT_SHL:%.*]] = shl i32 [[BF_VALUE]], 16 @@ -4433,9 +4622,10 @@ // BEWIDTH-NEXT: [[BF_ASHR:%.*]] = ashr i32 [[BF_LOAD]], 16 // BEWIDTH-NEXT: [[INC:%.*]] = add nsw i32 [[BF_ASHR]], 1 // BEWIDTH-NEXT: [[BF_LOAD1:%.*]] = load volatile i32, i32* [[TMP1]], align 4 +// BEWIDTH-NEXT: [[BF_FREEZE:%.*]] = freeze i32 [[BF_LOAD1]] // BEWIDTH-NEXT: [[BF_VALUE:%.*]] = and i32 [[INC]], 65535 // BEWIDTH-NEXT: [[BF_SHL:%.*]] = shl i32 [[BF_VALUE]], 16 -// BEWIDTH-NEXT: [[BF_CLEAR:%.*]] = and i32 [[BF_LOAD1]], 65535 +// BEWIDTH-NEXT: [[BF_CLEAR:%.*]] = and i32 [[BF_FREEZE]], 65535 // BEWIDTH-NEXT: [[BF_SET:%.*]] = or i32 [[BF_CLEAR]], [[BF_SHL]] // BEWIDTH-NEXT: store volatile i32 [[BF_SET]], i32* [[TMP1]], align 4 // BEWIDTH-NEXT: [[BF_RESULT_SHL:%.*]] = shl i32 [[BF_VALUE]], 16 @@ -4451,8 +4641,9 @@ // LEWIDTHNUM-NEXT: [[BF_ASHR:%.*]] = ashr i32 [[BF_SHL]], 16 // LEWIDTHNUM-NEXT: [[INC:%.*]] = add nsw i32 [[BF_ASHR]], 1 // LEWIDTHNUM-NEXT: [[BF_LOAD1:%.*]] = load volatile i32, i32* [[TMP1]], align 4 +// LEWIDTHNUM-NEXT: [[BF_FREEZE:%.*]] = freeze i32 [[BF_LOAD1]] // LEWIDTHNUM-NEXT: [[BF_VALUE:%.*]] = and i32 [[INC]], 65535 -// LEWIDTHNUM-NEXT: [[BF_CLEAR:%.*]] = and i32 [[BF_LOAD1]], -65536 +// LEWIDTHNUM-NEXT: [[BF_CLEAR:%.*]] = and i32 [[BF_FREEZE]], -65536 // LEWIDTHNUM-NEXT: [[BF_SET:%.*]] = or i32 [[BF_CLEAR]], [[BF_VALUE]] // LEWIDTHNUM-NEXT: store volatile i32 [[BF_SET]], i32* [[TMP1]], align 4 // LEWIDTHNUM-NEXT: [[BF_RESULT_SHL:%.*]] = shl i32 [[BF_VALUE]], 16 @@ -4467,9 +4658,10 @@ // BEWIDTHNUM-NEXT: [[BF_ASHR:%.*]] = ashr i32 [[BF_LOAD]], 16 // BEWIDTHNUM-NEXT: [[INC:%.*]] = add nsw i32 [[BF_ASHR]], 1 // BEWIDTHNUM-NEXT: [[BF_LOAD1:%.*]] = load volatile i32, i32* [[TMP1]], align 4 +// BEWIDTHNUM-NEXT: [[BF_FREEZE:%.*]] = freeze i32 [[BF_LOAD1]] // BEWIDTHNUM-NEXT: [[BF_VALUE:%.*]] = and i32 [[INC]], 65535 // BEWIDTHNUM-NEXT: [[BF_SHL:%.*]] = shl i32 [[BF_VALUE]], 16 -// BEWIDTHNUM-NEXT: [[BF_CLEAR:%.*]] = and i32 [[BF_LOAD1]], 65535 +// BEWIDTHNUM-NEXT: [[BF_CLEAR:%.*]] = and i32 [[BF_FREEZE]], 65535 // BEWIDTHNUM-NEXT: [[BF_SET:%.*]] = or i32 [[BF_CLEAR]], [[BF_SHL]] // BEWIDTHNUM-NEXT: store volatile i32 [[BF_SET]], i32* [[TMP1]], align 4 // BEWIDTHNUM-NEXT: [[BF_RESULT_SHL:%.*]] = shl i32 [[BF_VALUE]], 16 @@ -4496,8 +4688,9 @@ // LE-NEXT: [[INC:%.*]] = add nsw i32 [[BF_CAST]], 1 // LE-NEXT: [[TMP1:%.*]] = zext i32 [[INC]] to i40 // LE-NEXT: [[BF_LOAD1:%.*]] = load volatile i40, i40* [[TMP0]], align 1 +// LE-NEXT: [[BF_FREEZE:%.*]] = freeze i40 [[BF_LOAD1]] // LE-NEXT: [[BF_VALUE:%.*]] = and i40 [[TMP1]], 4294967295 -// LE-NEXT: [[BF_CLEAR:%.*]] = and i40 [[BF_LOAD1]], -4294967296 +// LE-NEXT: [[BF_CLEAR:%.*]] = and i40 [[BF_FREEZE]], -4294967296 // LE-NEXT: [[BF_SET:%.*]] = or i40 [[BF_CLEAR]], [[BF_VALUE]] // LE-NEXT: store volatile i40 [[BF_SET]], i40* [[TMP0]], align 1 // LE-NEXT: [[BF_RESULT_SHL:%.*]] = shl i40 [[BF_VALUE]], 8 @@ -4514,9 +4707,10 @@ // BE-NEXT: [[INC:%.*]] = add nsw i32 [[BF_CAST]], 1 // BE-NEXT: [[TMP1:%.*]] = zext i32 [[INC]] to i40 // BE-NEXT: [[BF_LOAD1:%.*]] = load volatile i40, i40* [[TMP0]], align 1 +// BE-NEXT: [[BF_FREEZE:%.*]] = freeze i40 [[BF_LOAD1]] // BE-NEXT: [[BF_VALUE:%.*]] = and i40 [[TMP1]], 4294967295 // BE-NEXT: [[BF_SHL:%.*]] = shl i40 [[BF_VALUE]], 8 -// BE-NEXT: [[BF_CLEAR:%.*]] = and i40 [[BF_LOAD1]], 255 +// BE-NEXT: [[BF_CLEAR:%.*]] = and i40 [[BF_FREEZE]], 255 // BE-NEXT: [[BF_SET:%.*]] = or i40 [[BF_CLEAR]], [[BF_SHL]] // BE-NEXT: store volatile i40 [[BF_SET]], i40* [[TMP0]], align 1 // BE-NEXT: [[BF_RESULT_SHL:%.*]] = shl i40 [[BF_VALUE]], 8 @@ -4534,8 +4728,9 @@ // LENUMLOADS-NEXT: [[INC:%.*]] = add nsw i32 [[BF_CAST]], 1 // LENUMLOADS-NEXT: [[TMP1:%.*]] = zext i32 [[INC]] to i40 // LENUMLOADS-NEXT: [[BF_LOAD1:%.*]] = load volatile i40, i40* [[TMP0]], align 1 +// LENUMLOADS-NEXT: [[BF_FREEZE:%.*]] = freeze i40 [[BF_LOAD1]] // LENUMLOADS-NEXT: [[BF_VALUE:%.*]] = and i40 [[TMP1]], 4294967295 -// LENUMLOADS-NEXT: [[BF_CLEAR:%.*]] = and i40 [[BF_LOAD1]], -4294967296 +// LENUMLOADS-NEXT: [[BF_CLEAR:%.*]] = and i40 [[BF_FREEZE]], -4294967296 // LENUMLOADS-NEXT: [[BF_SET:%.*]] = or i40 [[BF_CLEAR]], [[BF_VALUE]] // LENUMLOADS-NEXT: store volatile i40 [[BF_SET]], i40* [[TMP0]], align 1 // LENUMLOADS-NEXT: [[BF_RESULT_SHL:%.*]] = shl i40 [[BF_VALUE]], 8 @@ -4552,9 +4747,10 @@ // BENUMLOADS-NEXT: [[INC:%.*]] = add nsw i32 [[BF_CAST]], 1 // BENUMLOADS-NEXT: [[TMP1:%.*]] = zext i32 [[INC]] to i40 // BENUMLOADS-NEXT: [[BF_LOAD1:%.*]] = load volatile i40, i40* [[TMP0]], align 1 +// BENUMLOADS-NEXT: [[BF_FREEZE:%.*]] = freeze i40 [[BF_LOAD1]] // BENUMLOADS-NEXT: [[BF_VALUE:%.*]] = and i40 [[TMP1]], 4294967295 // BENUMLOADS-NEXT: [[BF_SHL:%.*]] = shl i40 [[BF_VALUE]], 8 -// BENUMLOADS-NEXT: [[BF_CLEAR:%.*]] = and i40 [[BF_LOAD1]], 255 +// BENUMLOADS-NEXT: [[BF_CLEAR:%.*]] = and i40 [[BF_FREEZE]], 255 // BENUMLOADS-NEXT: [[BF_SET:%.*]] = or i40 [[BF_CLEAR]], [[BF_SHL]] // BENUMLOADS-NEXT: store volatile i40 [[BF_SET]], i40* [[TMP0]], align 1 // BENUMLOADS-NEXT: [[BF_RESULT_SHL:%.*]] = shl i40 [[BF_VALUE]], 8 @@ -4572,8 +4768,9 @@ // LEWIDTH-NEXT: [[INC:%.*]] = add nsw i32 [[BF_CAST]], 1 // LEWIDTH-NEXT: [[TMP1:%.*]] = zext i32 [[INC]] to i40 // LEWIDTH-NEXT: [[BF_LOAD1:%.*]] = load volatile i40, i40* [[TMP0]], align 1 +// LEWIDTH-NEXT: [[BF_FREEZE:%.*]] = freeze i40 [[BF_LOAD1]] // LEWIDTH-NEXT: [[BF_VALUE:%.*]] = and i40 [[TMP1]], 4294967295 -// LEWIDTH-NEXT: [[BF_CLEAR:%.*]] = and i40 [[BF_LOAD1]], -4294967296 +// LEWIDTH-NEXT: [[BF_CLEAR:%.*]] = and i40 [[BF_FREEZE]], -4294967296 // LEWIDTH-NEXT: [[BF_SET:%.*]] = or i40 [[BF_CLEAR]], [[BF_VALUE]] // LEWIDTH-NEXT: store volatile i40 [[BF_SET]], i40* [[TMP0]], align 1 // LEWIDTH-NEXT: [[BF_RESULT_SHL:%.*]] = shl i40 [[BF_VALUE]], 8 @@ -4590,9 +4787,10 @@ // BEWIDTH-NEXT: [[INC:%.*]] = add nsw i32 [[BF_CAST]], 1 // BEWIDTH-NEXT: [[TMP1:%.*]] = zext i32 [[INC]] to i40 // BEWIDTH-NEXT: [[BF_LOAD1:%.*]] = load volatile i40, i40* [[TMP0]], align 1 +// BEWIDTH-NEXT: [[BF_FREEZE:%.*]] = freeze i40 [[BF_LOAD1]] // BEWIDTH-NEXT: [[BF_VALUE:%.*]] = and i40 [[TMP1]], 4294967295 // BEWIDTH-NEXT: [[BF_SHL:%.*]] = shl i40 [[BF_VALUE]], 8 -// BEWIDTH-NEXT: [[BF_CLEAR:%.*]] = and i40 [[BF_LOAD1]], 255 +// BEWIDTH-NEXT: [[BF_CLEAR:%.*]] = and i40 [[BF_FREEZE]], 255 // BEWIDTH-NEXT: [[BF_SET:%.*]] = or i40 [[BF_CLEAR]], [[BF_SHL]] // BEWIDTH-NEXT: store volatile i40 [[BF_SET]], i40* [[TMP0]], align 1 // BEWIDTH-NEXT: [[BF_RESULT_SHL:%.*]] = shl i40 [[BF_VALUE]], 8 @@ -4610,8 +4808,9 @@ // LEWIDTHNUM-NEXT: [[INC:%.*]] = add nsw i32 [[BF_CAST]], 1 // LEWIDTHNUM-NEXT: [[TMP1:%.*]] = zext i32 [[INC]] to i40 // LEWIDTHNUM-NEXT: [[BF_LOAD1:%.*]] = load volatile i40, i40* [[TMP0]], align 1 +// LEWIDTHNUM-NEXT: [[BF_FREEZE:%.*]] = freeze i40 [[BF_LOAD1]] // LEWIDTHNUM-NEXT: [[BF_VALUE:%.*]] = and i40 [[TMP1]], 4294967295 -// LEWIDTHNUM-NEXT: [[BF_CLEAR:%.*]] = and i40 [[BF_LOAD1]], -4294967296 +// LEWIDTHNUM-NEXT: [[BF_CLEAR:%.*]] = and i40 [[BF_FREEZE]], -4294967296 // LEWIDTHNUM-NEXT: [[BF_SET:%.*]] = or i40 [[BF_CLEAR]], [[BF_VALUE]] // LEWIDTHNUM-NEXT: store volatile i40 [[BF_SET]], i40* [[TMP0]], align 1 // LEWIDTHNUM-NEXT: [[BF_RESULT_SHL:%.*]] = shl i40 [[BF_VALUE]], 8 @@ -4628,9 +4827,10 @@ // BEWIDTHNUM-NEXT: [[INC:%.*]] = add nsw i32 [[BF_CAST]], 1 // BEWIDTHNUM-NEXT: [[TMP1:%.*]] = zext i32 [[INC]] to i40 // BEWIDTHNUM-NEXT: [[BF_LOAD1:%.*]] = load volatile i40, i40* [[TMP0]], align 1 +// BEWIDTHNUM-NEXT: [[BF_FREEZE:%.*]] = freeze i40 [[BF_LOAD1]] // BEWIDTHNUM-NEXT: [[BF_VALUE:%.*]] = and i40 [[TMP1]], 4294967295 // BEWIDTHNUM-NEXT: [[BF_SHL:%.*]] = shl i40 [[BF_VALUE]], 8 -// BEWIDTHNUM-NEXT: [[BF_CLEAR:%.*]] = and i40 [[BF_LOAD1]], 255 +// BEWIDTHNUM-NEXT: [[BF_CLEAR:%.*]] = and i40 [[BF_FREEZE]], 255 // BEWIDTHNUM-NEXT: [[BF_SET:%.*]] = or i40 [[BF_CLEAR]], [[BF_SHL]] // BEWIDTHNUM-NEXT: store volatile i40 [[BF_SET]], i40* [[TMP0]], align 1 // BEWIDTHNUM-NEXT: [[BF_RESULT_SHL:%.*]] = shl i40 [[BF_VALUE]], 8 @@ -4651,9 +4851,10 @@ // LE-NEXT: [[INC:%.*]] = add i8 [[BF_CAST]], 1 // LE-NEXT: [[TMP1:%.*]] = zext i8 [[INC]] to i40 // LE-NEXT: [[BF_LOAD1:%.*]] = load volatile i40, i40* [[TMP0]], align 1 +// LE-NEXT: [[BF_FREEZE:%.*]] = freeze i40 [[BF_LOAD1]] // LE-NEXT: [[BF_VALUE:%.*]] = and i40 [[TMP1]], 255 // LE-NEXT: [[BF_SHL:%.*]] = shl i40 [[BF_VALUE]], 32 -// LE-NEXT: [[BF_CLEAR:%.*]] = and i40 [[BF_LOAD1]], 4294967295 +// LE-NEXT: [[BF_CLEAR:%.*]] = and i40 [[BF_FREEZE]], 4294967295 // LE-NEXT: [[BF_SET:%.*]] = or i40 [[BF_CLEAR]], [[BF_SHL]] // LE-NEXT: store volatile i40 [[BF_SET]], i40* [[TMP0]], align 1 // LE-NEXT: [[BF_RESULT_SHL:%.*]] = shl i40 [[BF_VALUE]], 32 @@ -4671,8 +4872,9 @@ // BE-NEXT: [[INC:%.*]] = add i8 [[BF_CAST]], 1 // BE-NEXT: [[TMP1:%.*]] = zext i8 [[INC]] to i40 // BE-NEXT: [[BF_LOAD1:%.*]] = load volatile i40, i40* [[TMP0]], align 1 +// BE-NEXT: [[BF_FREEZE:%.*]] = freeze i40 [[BF_LOAD1]] // BE-NEXT: [[BF_VALUE:%.*]] = and i40 [[TMP1]], 255 -// BE-NEXT: [[BF_CLEAR:%.*]] = and i40 [[BF_LOAD1]], -256 +// BE-NEXT: [[BF_CLEAR:%.*]] = and i40 [[BF_FREEZE]], -256 // BE-NEXT: [[BF_SET:%.*]] = or i40 [[BF_CLEAR]], [[BF_VALUE]] // BE-NEXT: store volatile i40 [[BF_SET]], i40* [[TMP0]], align 1 // BE-NEXT: [[BF_RESULT_SHL:%.*]] = shl i40 [[BF_VALUE]], 32 @@ -4689,9 +4891,10 @@ // LENUMLOADS-NEXT: [[INC:%.*]] = add i8 [[BF_CAST]], 1 // LENUMLOADS-NEXT: [[TMP1:%.*]] = zext i8 [[INC]] to i40 // LENUMLOADS-NEXT: [[BF_LOAD1:%.*]] = load volatile i40, i40* [[TMP0]], align 1 +// LENUMLOADS-NEXT: [[BF_FREEZE:%.*]] = freeze i40 [[BF_LOAD1]] // LENUMLOADS-NEXT: [[BF_VALUE:%.*]] = and i40 [[TMP1]], 255 // LENUMLOADS-NEXT: [[BF_SHL:%.*]] = shl i40 [[BF_VALUE]], 32 -// LENUMLOADS-NEXT: [[BF_CLEAR:%.*]] = and i40 [[BF_LOAD1]], 4294967295 +// LENUMLOADS-NEXT: [[BF_CLEAR:%.*]] = and i40 [[BF_FREEZE]], 4294967295 // LENUMLOADS-NEXT: [[BF_SET:%.*]] = or i40 [[BF_CLEAR]], [[BF_SHL]] // LENUMLOADS-NEXT: store volatile i40 [[BF_SET]], i40* [[TMP0]], align 1 // LENUMLOADS-NEXT: [[BF_RESULT_SHL:%.*]] = shl i40 [[BF_VALUE]], 32 @@ -4709,8 +4912,9 @@ // BENUMLOADS-NEXT: [[INC:%.*]] = add i8 [[BF_CAST]], 1 // BENUMLOADS-NEXT: [[TMP1:%.*]] = zext i8 [[INC]] to i40 // BENUMLOADS-NEXT: [[BF_LOAD1:%.*]] = load volatile i40, i40* [[TMP0]], align 1 +// BENUMLOADS-NEXT: [[BF_FREEZE:%.*]] = freeze i40 [[BF_LOAD1]] // BENUMLOADS-NEXT: [[BF_VALUE:%.*]] = and i40 [[TMP1]], 255 -// BENUMLOADS-NEXT: [[BF_CLEAR:%.*]] = and i40 [[BF_LOAD1]], -256 +// BENUMLOADS-NEXT: [[BF_CLEAR:%.*]] = and i40 [[BF_FREEZE]], -256 // BENUMLOADS-NEXT: [[BF_SET:%.*]] = or i40 [[BF_CLEAR]], [[BF_VALUE]] // BENUMLOADS-NEXT: store volatile i40 [[BF_SET]], i40* [[TMP0]], align 1 // BENUMLOADS-NEXT: [[BF_RESULT_SHL:%.*]] = shl i40 [[BF_VALUE]], 32 @@ -4984,9 +5188,10 @@ // LE-NEXT: [[CONV4:%.*]] = trunc i32 [[ADD]] to i8 // LE-NEXT: [[TMP2:%.*]] = zext i8 [[CONV4]] to i16 // LE-NEXT: [[BF_LOAD5:%.*]] = load volatile i16, i16* [[TMP1]], align 4 +// LE-NEXT: [[BF_FREEZE:%.*]] = freeze i16 [[BF_LOAD5]] // LE-NEXT: [[BF_VALUE:%.*]] = and i16 [[TMP2]], 255 // LE-NEXT: [[BF_SHL6:%.*]] = shl i16 [[BF_VALUE]], 8 -// LE-NEXT: [[BF_CLEAR:%.*]] = and i16 [[BF_LOAD5]], 255 +// LE-NEXT: [[BF_CLEAR:%.*]] = and i16 [[BF_FREEZE]], 255 // LE-NEXT: [[BF_SET:%.*]] = or i16 [[BF_CLEAR]], [[BF_SHL6]] // LE-NEXT: store volatile i16 [[BF_SET]], i16* [[TMP1]], align 4 // LE-NEXT: [[BF_RESULT_SHL:%.*]] = shl i16 [[BF_VALUE]], 8 @@ -5010,8 +5215,9 @@ // BE-NEXT: [[CONV4:%.*]] = trunc i32 [[ADD]] to i8 // BE-NEXT: [[TMP2:%.*]] = zext i8 [[CONV4]] to i16 // BE-NEXT: [[BF_LOAD5:%.*]] = load volatile i16, i16* [[TMP1]], align 4 +// BE-NEXT: [[BF_FREEZE:%.*]] = freeze i16 [[BF_LOAD5]] // BE-NEXT: [[BF_VALUE:%.*]] = and i16 [[TMP2]], 255 -// BE-NEXT: [[BF_CLEAR:%.*]] = and i16 [[BF_LOAD5]], -256 +// BE-NEXT: [[BF_CLEAR:%.*]] = and i16 [[BF_FREEZE]], -256 // BE-NEXT: [[BF_SET:%.*]] = or i16 [[BF_CLEAR]], [[BF_VALUE]] // BE-NEXT: store volatile i16 [[BF_SET]], i16* [[TMP1]], align 4 // BE-NEXT: [[BF_RESULT_SHL:%.*]] = shl i16 [[BF_VALUE]], 8 @@ -5035,9 +5241,10 @@ // LENUMLOADS-NEXT: [[CONV4:%.*]] = trunc i32 [[ADD]] to i8 // LENUMLOADS-NEXT: [[TMP2:%.*]] = zext i8 [[CONV4]] to i16 // LENUMLOADS-NEXT: [[BF_LOAD5:%.*]] = load volatile i16, i16* [[TMP1]], align 4 +// LENUMLOADS-NEXT: [[BF_FREEZE:%.*]] = freeze i16 [[BF_LOAD5]] // LENUMLOADS-NEXT: [[BF_VALUE:%.*]] = and i16 [[TMP2]], 255 // LENUMLOADS-NEXT: [[BF_SHL6:%.*]] = shl i16 [[BF_VALUE]], 8 -// LENUMLOADS-NEXT: [[BF_CLEAR:%.*]] = and i16 [[BF_LOAD5]], 255 +// LENUMLOADS-NEXT: [[BF_CLEAR:%.*]] = and i16 [[BF_FREEZE]], 255 // LENUMLOADS-NEXT: [[BF_SET:%.*]] = or i16 [[BF_CLEAR]], [[BF_SHL6]] // LENUMLOADS-NEXT: store volatile i16 [[BF_SET]], i16* [[TMP1]], align 4 // LENUMLOADS-NEXT: [[BF_RESULT_SHL:%.*]] = shl i16 [[BF_VALUE]], 8 @@ -5061,8 +5268,9 @@ // BENUMLOADS-NEXT: [[CONV4:%.*]] = trunc i32 [[ADD]] to i8 // BENUMLOADS-NEXT: [[TMP2:%.*]] = zext i8 [[CONV4]] to i16 // BENUMLOADS-NEXT: [[BF_LOAD5:%.*]] = load volatile i16, i16* [[TMP1]], align 4 +// BENUMLOADS-NEXT: [[BF_FREEZE:%.*]] = freeze i16 [[BF_LOAD5]] // BENUMLOADS-NEXT: [[BF_VALUE:%.*]] = and i16 [[TMP2]], 255 -// BENUMLOADS-NEXT: [[BF_CLEAR:%.*]] = and i16 [[BF_LOAD5]], -256 +// BENUMLOADS-NEXT: [[BF_CLEAR:%.*]] = and i16 [[BF_FREEZE]], -256 // BENUMLOADS-NEXT: [[BF_SET:%.*]] = or i16 [[BF_CLEAR]], [[BF_VALUE]] // BENUMLOADS-NEXT: store volatile i16 [[BF_SET]], i16* [[TMP1]], align 4 // BENUMLOADS-NEXT: [[BF_RESULT_SHL:%.*]] = shl i16 [[BF_VALUE]], 8 @@ -5147,8 +5355,9 @@ // LE-NEXT: [[BF_ASHR:%.*]] = ashr i32 [[BF_SHL]], 8 // LE-NEXT: [[INC:%.*]] = add nsw i32 [[BF_ASHR]], 1 // LE-NEXT: [[BF_LOAD1:%.*]] = load volatile i32, i32* [[TMP0]], align 4 +// LE-NEXT: [[BF_FREEZE:%.*]] = freeze i32 [[BF_LOAD1]] // LE-NEXT: [[BF_VALUE:%.*]] = and i32 [[INC]], 16777215 -// LE-NEXT: [[BF_CLEAR:%.*]] = and i32 [[BF_LOAD1]], -16777216 +// LE-NEXT: [[BF_CLEAR:%.*]] = and i32 [[BF_FREEZE]], -16777216 // LE-NEXT: [[BF_SET:%.*]] = or i32 [[BF_CLEAR]], [[BF_VALUE]] // LE-NEXT: store volatile i32 [[BF_SET]], i32* [[TMP0]], align 4 // LE-NEXT: [[BF_RESULT_SHL:%.*]] = shl i32 [[BF_VALUE]], 8 @@ -5163,9 +5372,10 @@ // BE-NEXT: [[BF_ASHR:%.*]] = ashr i32 [[BF_LOAD]], 8 // BE-NEXT: [[INC:%.*]] = add nsw i32 [[BF_ASHR]], 1 // BE-NEXT: [[BF_LOAD1:%.*]] = load volatile i32, i32* [[TMP0]], align 4 +// BE-NEXT: [[BF_FREEZE:%.*]] = freeze i32 [[BF_LOAD1]] // BE-NEXT: [[BF_VALUE:%.*]] = and i32 [[INC]], 16777215 // BE-NEXT: [[BF_SHL:%.*]] = shl i32 [[BF_VALUE]], 8 -// BE-NEXT: [[BF_CLEAR:%.*]] = and i32 [[BF_LOAD1]], 255 +// BE-NEXT: [[BF_CLEAR:%.*]] = and i32 [[BF_FREEZE]], 255 // BE-NEXT: [[BF_SET:%.*]] = or i32 [[BF_CLEAR]], [[BF_SHL]] // BE-NEXT: store volatile i32 [[BF_SET]], i32* [[TMP0]], align 4 // BE-NEXT: [[BF_RESULT_SHL:%.*]] = shl i32 [[BF_VALUE]], 8 @@ -5181,8 +5391,9 @@ // LENUMLOADS-NEXT: [[BF_ASHR:%.*]] = ashr i32 [[BF_SHL]], 8 // LENUMLOADS-NEXT: [[INC:%.*]] = add nsw i32 [[BF_ASHR]], 1 // LENUMLOADS-NEXT: [[BF_LOAD1:%.*]] = load volatile i32, i32* [[TMP0]], align 4 +// LENUMLOADS-NEXT: [[BF_FREEZE:%.*]] = freeze i32 [[BF_LOAD1]] // LENUMLOADS-NEXT: [[BF_VALUE:%.*]] = and i32 [[INC]], 16777215 -// LENUMLOADS-NEXT: [[BF_CLEAR:%.*]] = and i32 [[BF_LOAD1]], -16777216 +// LENUMLOADS-NEXT: [[BF_CLEAR:%.*]] = and i32 [[BF_FREEZE]], -16777216 // LENUMLOADS-NEXT: [[BF_SET:%.*]] = or i32 [[BF_CLEAR]], [[BF_VALUE]] // LENUMLOADS-NEXT: store volatile i32 [[BF_SET]], i32* [[TMP0]], align 4 // LENUMLOADS-NEXT: [[BF_RESULT_SHL:%.*]] = shl i32 [[BF_VALUE]], 8 @@ -5197,9 +5408,10 @@ // BENUMLOADS-NEXT: [[BF_ASHR:%.*]] = ashr i32 [[BF_LOAD]], 8 // BENUMLOADS-NEXT: [[INC:%.*]] = add nsw i32 [[BF_ASHR]], 1 // BENUMLOADS-NEXT: [[BF_LOAD1:%.*]] = load volatile i32, i32* [[TMP0]], align 4 +// BENUMLOADS-NEXT: [[BF_FREEZE:%.*]] = freeze i32 [[BF_LOAD1]] // BENUMLOADS-NEXT: [[BF_VALUE:%.*]] = and i32 [[INC]], 16777215 // BENUMLOADS-NEXT: [[BF_SHL:%.*]] = shl i32 [[BF_VALUE]], 8 -// BENUMLOADS-NEXT: [[BF_CLEAR:%.*]] = and i32 [[BF_LOAD1]], 255 +// BENUMLOADS-NEXT: [[BF_CLEAR:%.*]] = and i32 [[BF_FREEZE]], 255 // BENUMLOADS-NEXT: [[BF_SET:%.*]] = or i32 [[BF_CLEAR]], [[BF_SHL]] // BENUMLOADS-NEXT: store volatile i32 [[BF_SET]], i32* [[TMP0]], align 4 // BENUMLOADS-NEXT: [[BF_RESULT_SHL:%.*]] = shl i32 [[BF_VALUE]], 8 @@ -5215,8 +5427,9 @@ // LEWIDTH-NEXT: [[BF_ASHR:%.*]] = ashr i32 [[BF_SHL]], 8 // LEWIDTH-NEXT: [[INC:%.*]] = add nsw i32 [[BF_ASHR]], 1 // LEWIDTH-NEXT: [[BF_LOAD1:%.*]] = load volatile i32, i32* [[TMP0]], align 4 +// LEWIDTH-NEXT: [[BF_FREEZE:%.*]] = freeze i32 [[BF_LOAD1]] // LEWIDTH-NEXT: [[BF_VALUE:%.*]] = and i32 [[INC]], 16777215 -// LEWIDTH-NEXT: [[BF_CLEAR:%.*]] = and i32 [[BF_LOAD1]], -16777216 +// LEWIDTH-NEXT: [[BF_CLEAR:%.*]] = and i32 [[BF_FREEZE]], -16777216 // LEWIDTH-NEXT: [[BF_SET:%.*]] = or i32 [[BF_CLEAR]], [[BF_VALUE]] // LEWIDTH-NEXT: store volatile i32 [[BF_SET]], i32* [[TMP0]], align 4 // LEWIDTH-NEXT: [[BF_RESULT_SHL:%.*]] = shl i32 [[BF_VALUE]], 8 @@ -5231,9 +5444,10 @@ // BEWIDTH-NEXT: [[BF_ASHR:%.*]] = ashr i32 [[BF_LOAD]], 8 // BEWIDTH-NEXT: [[INC:%.*]] = add nsw i32 [[BF_ASHR]], 1 // BEWIDTH-NEXT: [[BF_LOAD1:%.*]] = load volatile i32, i32* [[TMP0]], align 4 +// BEWIDTH-NEXT: [[BF_FREEZE:%.*]] = freeze i32 [[BF_LOAD1]] // BEWIDTH-NEXT: [[BF_VALUE:%.*]] = and i32 [[INC]], 16777215 // BEWIDTH-NEXT: [[BF_SHL:%.*]] = shl i32 [[BF_VALUE]], 8 -// BEWIDTH-NEXT: [[BF_CLEAR:%.*]] = and i32 [[BF_LOAD1]], 255 +// BEWIDTH-NEXT: [[BF_CLEAR:%.*]] = and i32 [[BF_FREEZE]], 255 // BEWIDTH-NEXT: [[BF_SET:%.*]] = or i32 [[BF_CLEAR]], [[BF_SHL]] // BEWIDTH-NEXT: store volatile i32 [[BF_SET]], i32* [[TMP0]], align 4 // BEWIDTH-NEXT: [[BF_RESULT_SHL:%.*]] = shl i32 [[BF_VALUE]], 8 @@ -5249,8 +5463,9 @@ // LEWIDTHNUM-NEXT: [[BF_ASHR:%.*]] = ashr i32 [[BF_SHL]], 8 // LEWIDTHNUM-NEXT: [[INC:%.*]] = add nsw i32 [[BF_ASHR]], 1 // LEWIDTHNUM-NEXT: [[BF_LOAD1:%.*]] = load volatile i32, i32* [[TMP0]], align 4 +// LEWIDTHNUM-NEXT: [[BF_FREEZE:%.*]] = freeze i32 [[BF_LOAD1]] // LEWIDTHNUM-NEXT: [[BF_VALUE:%.*]] = and i32 [[INC]], 16777215 -// LEWIDTHNUM-NEXT: [[BF_CLEAR:%.*]] = and i32 [[BF_LOAD1]], -16777216 +// LEWIDTHNUM-NEXT: [[BF_CLEAR:%.*]] = and i32 [[BF_FREEZE]], -16777216 // LEWIDTHNUM-NEXT: [[BF_SET:%.*]] = or i32 [[BF_CLEAR]], [[BF_VALUE]] // LEWIDTHNUM-NEXT: store volatile i32 [[BF_SET]], i32* [[TMP0]], align 4 // LEWIDTHNUM-NEXT: [[BF_RESULT_SHL:%.*]] = shl i32 [[BF_VALUE]], 8 @@ -5265,9 +5480,10 @@ // BEWIDTHNUM-NEXT: [[BF_ASHR:%.*]] = ashr i32 [[BF_LOAD]], 8 // BEWIDTHNUM-NEXT: [[INC:%.*]] = add nsw i32 [[BF_ASHR]], 1 // BEWIDTHNUM-NEXT: [[BF_LOAD1:%.*]] = load volatile i32, i32* [[TMP0]], align 4 +// BEWIDTHNUM-NEXT: [[BF_FREEZE:%.*]] = freeze i32 [[BF_LOAD1]] // BEWIDTHNUM-NEXT: [[BF_VALUE:%.*]] = and i32 [[INC]], 16777215 // BEWIDTHNUM-NEXT: [[BF_SHL:%.*]] = shl i32 [[BF_VALUE]], 8 -// BEWIDTHNUM-NEXT: [[BF_CLEAR:%.*]] = and i32 [[BF_LOAD1]], 255 +// BEWIDTHNUM-NEXT: [[BF_CLEAR:%.*]] = and i32 [[BF_FREEZE]], 255 // BEWIDTHNUM-NEXT: [[BF_SET:%.*]] = or i32 [[BF_CLEAR]], [[BF_SHL]] // BEWIDTHNUM-NEXT: store volatile i32 [[BF_SET]], i32* [[TMP0]], align 4 // BEWIDTHNUM-NEXT: [[BF_RESULT_SHL:%.*]] = shl i32 [[BF_VALUE]], 8 diff --git a/clang/test/CodeGen/no-bitfield-type-align.c b/clang/test/CodeGen/no-bitfield-type-align.c --- a/clang/test/CodeGen/no-bitfield-type-align.c +++ b/clang/test/CodeGen/no-bitfield-type-align.c @@ -18,8 +18,9 @@ // CHECK: %[[CONV1:.*]] = trunc i32 %[[ADD]] to i16 // CHECK: %[[V2:.*]] = zext i16 %[[CONV1]] to i32 // CHECK: %[[BF_LOAD2:.*]] = load i32, i32* %[[V1]], align 1 +// CHECK: %[[BF_FREEZE:.*]] = freeze i32 %[[BF_LOAD2]] // CHECK: %[[BF_VALUE:.*]] = and i32 %[[V2]], 32767 -// CHECK: %[[BF_CLEAR3:.*]] = and i32 %[[BF_LOAD2]], -32768 +// CHECK: %[[BF_CLEAR3:.*]] = and i32 %[[BF_FREEZE]], -32768 // CHECK: %[[BF_SET:.*]] = or i32 %[[BF_CLEAR3]], %[[BF_VALUE]] // CHECK: store i32 %[[BF_SET]], i32* %[[V1]], align 1 @@ -32,9 +33,10 @@ // CHECK: %[[CONV9:.*]] = trunc i32 %[[ADD8]] to i16 // CHECK: %[[V5:.*]] = zext i16 %[[CONV9]] to i32 // CHECK: %[[BF_LOAD10:.*]] = load i32, i32* %[[V4]], align 1 +// CHECK: %[[BF_FREEZE11:.*]] = freeze i32 %[[BF_LOAD10]] // CHECK: %[[BF_VALUE11:.*]] = and i32 %[[V5]], 32767 // CHECK: %[[BF_SHL:.*]] = shl i32 %[[BF_VALUE11]], 15 -// CHECK: %[[BF_CLEAR12:.*]] = and i32 %[[BF_LOAD10]], -1073709057 +// CHECK: %[[BF_CLEAR12:.*]] = and i32 %[[BF_FREEZE11]], -1073709057 // CHECK: %[[BF_SET13:.*]] = or i32 %[[BF_CLEAR12]], %[[BF_SHL]] // CHECK: store i32 %[[BF_SET13]], i32* %[[V4]], align 1 diff --git a/clang/test/CodeGenCXX/alignment.cpp b/clang/test/CodeGenCXX/alignment.cpp --- a/clang/test/CodeGenCXX/alignment.cpp +++ b/clang/test/CodeGenCXX/alignment.cpp @@ -30,8 +30,9 @@ // CHECK: [[FIELD_P:%.*]] = bitcast [[B]]* [[B_P]] to i8* // CHECK: [[TRUNC:%.*]] = trunc i32 [[CALL]] to i8 // CHECK: [[OLD_VALUE:%.*]] = load i8, i8* [[FIELD_P]], align 4 + // CHECK: [[FREEZE:%.*]] = freeze i8 [[OLD_VALUE]] // CHECK: [[T0:%.*]] = and i8 [[TRUNC]], 3 - // CHECK: [[T1:%.*]] = and i8 [[OLD_VALUE]], -4 + // CHECK: [[T1:%.*]] = and i8 [[FREEZE]], -4 // CHECK: [[T2:%.*]] = or i8 [[T1]], [[T0]] // CHECK: store i8 [[T2]], i8* [[FIELD_P]], align 4 b.onebit = int_source(); @@ -59,8 +60,9 @@ // CHECK: [[TRUNC:%.*]] = trunc i32 [[CALL]] to i8 // CHECK-V6COMPAT: [[OLD_VALUE:%.*]] = load i8, i8* [[FIELD_P]], align 2 // CHECK-NOCOMPAT: [[OLD_VALUE:%.*]] = load i8, i8* [[FIELD_P]], align 4 + // CHECK: [[FREEZE:%.*]] = freeze i8 [[OLD_VALUE]] // CHECK: [[T0:%.*]] = and i8 [[TRUNC]], 3 - // CHECK: [[T1:%.*]] = and i8 [[OLD_VALUE]], -4 + // CHECK: [[T1:%.*]] = and i8 [[FREEZE]], -4 // CHECK: [[T2:%.*]] = or i8 [[T1]], [[T0]] // CHECK-V6COMPAT: store i8 [[T2]], i8* [[FIELD_P]], align 2 // CHECK-NOCOMPAT: store i8 [[T2]], i8* [[FIELD_P]], align 4 @@ -91,8 +93,9 @@ // CHECK: [[TRUNC:%.*]] = trunc i32 [[CALL]] to i8 // CHECK-V6COMPAT: [[OLD_VALUE:%.*]] = load i8, i8* [[FIELD_P]], align 2 // CHECK-NOCOMPAT: [[OLD_VALUE:%.*]] = load i8, i8* [[FIELD_P]], align 4 + // CHECK: [[FREEZE:%.*]] = freeze i8 [[OLD_VALUE]] // CHECK: [[T0:%.*]] = and i8 [[TRUNC]], 3 - // CHECK: [[T1:%.*]] = and i8 [[OLD_VALUE]], -4 + // CHECK: [[T1:%.*]] = and i8 [[FREEZE]], -4 // CHECK: [[T2:%.*]] = or i8 [[T1]], [[T0]] // CHECK-V6COMPAT: store i8 [[T2]], i8* [[FIELD_P]], align 2 // CHECK-NOCOMPAT: store i8 [[T2]], i8* [[FIELD_P]], align 4 @@ -128,8 +131,9 @@ // CHECK: [[TRUNC:%.*]] = trunc i32 [[CALL]] to i8 // CHECK-V6COMPAT: [[OLD_VALUE:%.*]] = load i8, i8* [[FIELD_P]], align 2 // CHECK-NOCOMPAT: [[OLD_VALUE:%.*]] = load i8, i8* [[FIELD_P]], align 4 + // CHECK: [[FREEZE:%.*]] = freeze i8 [[OLD_VALUE]] // CHECK: [[T0:%.*]] = and i8 [[TRUNC]], 3 - // CHECK: [[T1:%.*]] = and i8 [[OLD_VALUE]], -4 + // CHECK: [[T1:%.*]] = and i8 [[FREEZE]], -4 // CHECK: [[T2:%.*]] = or i8 [[T1]], [[T0]] // CHECK-V6COMPAT: store i8 [[T2]], i8* [[FIELD_P]], align 2 // CHECK-NOCOMPAT: store i8 [[T2]], i8* [[FIELD_P]], align 4 @@ -162,8 +166,9 @@ // CHECK: [[FIELD_P:%.*]] = bitcast [[B]]* [[B_P]] to i8* // CHECK: [[TRUNC:%.*]] = trunc i32 [[CALL]] to i8 // CHECK: [[OLD_VALUE:%.*]] = load i8, i8* [[FIELD_P]], align 8 + // CHECK: [[FREEZE:%.*]] = freeze i8 [[OLD_VALUE]] // CHECK: [[T0:%.*]] = and i8 [[TRUNC]], 3 - // CHECK: [[T1:%.*]] = and i8 [[OLD_VALUE]], -4 + // CHECK: [[T1:%.*]] = and i8 [[FREEZE]], -4 // CHECK: [[T2:%.*]] = or i8 [[T1]], [[T0]] // CHECK: store i8 [[T2]], i8* [[FIELD_P]], align 8 c.onebit = int_source(); diff --git a/clang/test/CodeGenCXX/bitfield.cpp b/clang/test/CodeGenCXX/bitfield.cpp --- a/clang/test/CodeGenCXX/bitfield.cpp +++ b/clang/test/CodeGenCXX/bitfield.cpp @@ -185,17 +185,19 @@ // CHECK-X86-64: %[[ptr:.*]] = getelementptr inbounds %{{.*}}, %{{.*}}* %{{.*}}, i32 0, i32 1 // CHECK-X86-64: %[[x_trunc:.*]] = trunc i32 %{{.*}} to i8 // CHECK-X86-64: %[[old:.*]] = load i8, i8* %[[ptr]] + // CHECK-X86-64: %[[old_freeze:.*]] = freeze i8 %[[old]] // CHECK-X86-64: %[[x_and:.*]] = and i8 %[[x_trunc]], 1 - // CHECK-X86-64: %[[old_and:.*]] = and i8 %[[old]], -2 + // CHECK-X86-64: %[[old_and:.*]] = and i8 %[[old_freeze]], -2 // CHECK-X86-64: %[[new:.*]] = or i8 %[[old_and]], %[[x_and]] // CHECK-X86-64: store i8 %[[new]], i8* %[[ptr]] // CHECK-PPC64-LABEL: define{{.*}} void @_ZN2N15write // CHECK-PPC64: %[[ptr:.*]] = getelementptr inbounds %{{.*}}, %{{.*}}* %{{.*}}, i32 0, i32 1 // CHECK-PPC64: %[[x_trunc:.*]] = trunc i32 %{{.*}} to i8 // CHECK-PPC64: %[[old:.*]] = load i8, i8* %[[ptr]] + // CHECK-PPC64: %[[old_freeze:.*]] = freeze i8 %[[old]] // CHECK-PPC64: %[[x_and:.*]] = and i8 %[[x_trunc]], 1 // CHECK-PPC64: %[[x_shl:.*]] = shl i8 %[[x_and]], 7 - // CHECK-PPC64: %[[old_and:.*]] = and i8 %[[old]], 127 + // CHECK-PPC64: %[[old_and:.*]] = and i8 %[[old_freeze]], 127 // CHECK-PPC64: %[[new:.*]] = or i8 %[[old_and]], %[[x_shl]] // CHECK-PPC64: store i8 %[[new]], i8* %[[ptr]] s->b = x; @@ -226,16 +228,18 @@ // CHECK-X86-64-LABEL: define{{.*}} void @_ZN2N25write // CHECK-X86-64: %[[ptr:.*]] = bitcast %{{.*}}* %{{.*}} to i32* // CHECK-X86-64: %[[old:.*]] = load i32, i32* %[[ptr]] + // CHECK-X86-64: %[[old_freeze:.*]] = freeze i32 %[[old]] // CHECK-X86-64: %[[x_and:.*]] = and i32 %{{.*}}, 16777215 - // CHECK-X86-64: %[[old_and:.*]] = and i32 %[[old]], -16777216 + // CHECK-X86-64: %[[old_and:.*]] = and i32 %[[old_freeze]], -16777216 // CHECK-X86-64: %[[new:.*]] = or i32 %[[old_and]], %[[x_and]] // CHECK-X86-64: store i32 %[[new]], i32* %[[ptr]] // CHECK-PPC64-LABEL: define{{.*}} void @_ZN2N25write // CHECK-PPC64: %[[ptr:.*]] = bitcast %{{.*}}* %{{.*}} to i32* // CHECK-PPC64: %[[old:.*]] = load i32, i32* %[[ptr]] + // CHECK-PPC64 %[[old_freeze:.*]] = freeze i32 %[[old]] // CHECK-PPC64: %[[x_and:.*]] = and i32 %{{.*}}, 16777215 // CHECK-PPC64: %[[x_shl:.*]] = shl i32 %[[x_and]], 8 - // CHECK-PPC64: %[[old_and:.*]] = and i32 %[[old]], 255 + // CHECK-PPC64: %[[old_and:.*]] = and i32 %[[old_freeze]], 255 // CHECK-PPC64: %[[new:.*]] = or i32 %[[old_and]], %[[x_shl]] // CHECK-PPC64: store i32 %[[new]], i32* %[[ptr]] s->b = x; @@ -265,16 +269,18 @@ // CHECK-X86-64-LABEL: define{{.*}} void @_ZN2N35write // CHECK-X86-64: %[[ptr:.*]] = bitcast %{{.*}}* %{{.*}} to i32* // CHECK-X86-64: %[[old:.*]] = load i32, i32* %[[ptr]] + // CHECK-X86_64: %[[old_freeze:.*]] = freeze i32 %[[old]] // CHECK-X86-64: %[[x_and:.*]] = and i32 %{{.*}}, 16777215 - // CHECK-X86-64: %[[old_and:.*]] = and i32 %[[old]], -16777216 + // CHECK-X86-64: %[[old_and:.*]] = and i32 %[[old_freeze]], -16777216 // CHECK-X86-64: %[[new:.*]] = or i32 %[[old_and]], %[[x_and]] // CHECK-X86-64: store i32 %[[new]], i32* %[[ptr]] // CHECK-PPC64-LABEL: define{{.*}} void @_ZN2N35write // CHECK-PPC64: %[[ptr:.*]] = bitcast %{{.*}}* %{{.*}} to i32* // CHECK-PPC64: %[[old:.*]] = load i32, i32* %[[ptr]] + // CHECK-PPC64 %[[old_freeze:.*]] = freeze i32 %[[old]] // CHECK-PPC64: %[[x_and:.*]] = and i32 %{{.*}}, 16777215 // CHECK-PPC64: %[[x_shl:.*]] = shl i32 %[[x_and]], 8 - // CHECK-PPC64: %[[old_and:.*]] = and i32 %[[old]], 255 + // CHECK-PPC64: %[[old_and:.*]] = and i32 %[[old_freeze]], 255 // CHECK-PPC64: %[[new:.*]] = or i32 %[[old_and]], %[[x_shl]] // CHECK-PPC64: store i32 %[[new]], i32* %[[ptr]] s->b = x; @@ -358,16 +364,18 @@ // CHECK-X86-64-LABEL: define{{.*}} void @_ZN2N55write // CHECK-X86-64: %[[ptr:.*]] = bitcast %{{.*}}* %{{.*}} to i32* // CHECK-X86-64: %[[old:.*]] = load i32, i32* %[[ptr]] + // CHECK-X86-64: %[[old_freeze:.*]] = freeze i32 %[[old]] // CHECK-X86-64: %[[x_and:.*]] = and i32 %{{.*}}, 16777215 - // CHECK-X86-64: %[[old_and:.*]] = and i32 %[[old]], -16777216 + // CHECK-X86-64: %[[old_and:.*]] = and i32 %[[old_freeze]], -16777216 // CHECK-X86-64: %[[new:.*]] = or i32 %[[old_and]], %[[x_and]] // CHECK-X86-64: store i32 %[[new]], i32* %[[ptr]] // CHECK-PPC64-LABEL: define{{.*}} void @_ZN2N55write // CHECK-PPC64: %[[ptr:.*]] = bitcast %{{.*}}* %{{.*}} to i32* // CHECK-PPC64: %[[old:.*]] = load i32, i32* %[[ptr]] + // CHECK-PPC64 %[[old_freeze:.*]] = freeze i32 %[[old]] // CHECK-PPC64: %[[x_and:.*]] = and i32 %{{.*}}, 16777215 // CHECK-PPC64: %[[x_shl:.*]] = shl i32 %[[x_and]], 8 - // CHECK-PPC64: %[[old_and:.*]] = and i32 %[[old]], 255 + // CHECK-PPC64: %[[old_and:.*]] = and i32 %[[old_freeze]], 255 // CHECK-PPC64: %[[new:.*]] = or i32 %[[old_and]], %[[x_shl]] // CHECK-PPC64: store i32 %[[new]], i32* %[[ptr]] u->y.b = x; diff --git a/clang/test/CodeGenCXX/ext-int.cpp b/clang/test/CodeGenCXX/ext-int.cpp --- a/clang/test/CodeGenCXX/ext-int.cpp +++ b/clang/test/CodeGenCXX/ext-int.cpp @@ -90,15 +90,18 @@ // CHECK: bitcast %struct.BitFieldsByte* // CHECK: %[[BFType:.+]] = bitcast %struct.BitFieldsByte* // CHECK: %[[LOADA:.+]] = load i8, i8* %[[BFType]] - // CHECK: %[[CLEARA:.+]] = and i8 %[[LOADA]], -8 + // CHECK: %[[FREEZEA:.+]] = freeze i8 %[[LOADA]] + // CHECK: %[[CLEARA:.+]] = and i8 %[[FREEZEA]], -8 // CHECK: %[[SETA:.+]] = or i8 %[[CLEARA]], 3 // CHECK: %[[BFType:.+]] = bitcast %struct.BitFieldsByte* // CHECK: %[[LOADB:.+]] = load i8, i8* %[[BFType]] - // CHECK: %[[CLEARB:.+]] = and i8 %[[LOADB]], -57 + // CHECK: %[[FREEZEB:.+]] = freeze i8 %[[LOADB]] + // CHECK: %[[CLEARB:.+]] = and i8 %[[FREEZEB]], -57 // CHECK: %[[SETB:.+]] = or i8 %[[CLEARB]], 16 // CHECK: %[[BFType:.+]] = bitcast %struct.BitFieldsByte* // CHECK: %[[LOADC:.+]] = load i8, i8* %[[BFType]] - // CHECK: %[[CLEARC:.+]] = and i8 %[[LOADC]], 63 + // CHECK: %[[FREEZEC:.+]] = freeze i8 %[[LOADC]] + // CHECK: %[[CLEARC:.+]] = and i8 %[[FREEZEC]], 63 // CHECK: %[[SETC:.+]] = or i8 %[[CLEARC]], 64 } diff --git a/clang/test/CodeGenCXX/finegrain-bitfield-access.cpp b/clang/test/CodeGenCXX/finegrain-bitfield-access.cpp --- a/clang/test/CodeGenCXX/finegrain-bitfield-access.cpp +++ b/clang/test/CodeGenCXX/finegrain-bitfield-access.cpp @@ -31,7 +31,8 @@ // CHECK-NEXT: ret void // SANITIZE-LABEL: @_Z8write8_1v // SANITIZE: %bf.load = load i32, i32* getelementptr inbounds {{.*}}, align 4 - // SANITIZE-NEXT: %bf.clear = and i32 %bf.load, -65281 + // SANITIZE: %bf.freeze = freeze i32 %bf.load + // SANITIZE-NEXT: %bf.clear = and i32 %bf.freeze, -65281 // SANITIZE-NEXT: %bf.set = or i32 %bf.clear, 768 // SANITIZE-NEXT: store i32 %bf.set, i32* getelementptr inbounds {{.*}}, align 4 // SANITIZE-NEXT: ret void @@ -55,13 +56,15 @@ void write8_2() { // CHECK-LABEL: @_Z8write8_2v // CHECK: %bf.load = load i16, i16* getelementptr inbounds (%struct.S1, %struct.S1* @a1, i32 0, i32 2), align 2 - // CHECK-NEXT: %bf.clear = and i16 %bf.load, -4081 + // CHECK-NEXT: %bf.freeze = freeze i16 %bf.load + // CHECK-NEXT: %bf.clear = and i16 %bf.freeze, -4081 // CHECK-NEXT: %bf.set = or i16 %bf.clear, 48 // CHECK-NEXT: store i16 %bf.set, i16* getelementptr inbounds (%struct.S1, %struct.S1* @a1, i32 0, i32 2), align 2 // CHECK-NEXT: ret void // SANITIZE-LABEL: @_Z8write8_2v // SANITIZE: %bf.load = load i32, i32* getelementptr inbounds {{.*}}, align 4 - // SANITIZE-NEXT: %bf.clear = and i32 %bf.load, -267386881 + // SANITIZE-NEXT: %bf.freeze = freeze i32 %bf.load + // SANITIZE-NEXT: %bf.clear = and i32 %bf.freeze, -267386881 // SANITIZE-NEXT: %bf.set = or i32 %bf.clear, 3145728 // SANITIZE-NEXT: store i32 %bf.set, i32* getelementptr inbounds {{.*}}, align 4 // SANITIZE-NEXT: ret void @@ -109,7 +112,8 @@ // CHECK-NEXT: ret void // SANITIZE-LABEL: @_Z9write16_1v // SANITIZE: %bf.load = load i64, i64* bitcast {{.*}}, align 8 - // SANITIZE-NEXT: %bf.clear = and i64 %bf.load, -65536 + // SANITIZE-NEXT: %bf.freeze = freeze i64 %bf.load + // SANITIZE-NEXT: %bf.clear = and i64 %bf.freeze, -65536 // SANITIZE-NEXT: %bf.set = or i64 %bf.clear, 5 // SANITIZE-NEXT: store i64 %bf.set, i64* bitcast {{.*}}, align 8 // SANITIZE-NEXT: ret void @@ -121,7 +125,8 @@ // CHECK-NEXT: ret void // SANITIZE-LABEL: @_Z9write16_2v // SANITIZE: %bf.load = load i64, i64* bitcast {{.*}}, align 8 - // SANITIZE-NEXT: %bf.clear = and i64 %bf.load, -4294901761 + // SANITIZE-NEXT: %bf.freeze = freeze i64 %bf.load + // SANITIZE-NEXT: %bf.clear = and i64 %bf.freeze, -4294901761 // SANITIZE-NEXT: %bf.set = or i64 %bf.clear, 327680 // SANITIZE-NEXT: store i64 %bf.set, i64* bitcast {{.*}}, align 8 // SANITIZE-NEXT: ret void @@ -154,7 +159,8 @@ // CHECK-NEXT: ret void // SANITIZE-LABEL: @_Z9write32_1v // SANITIZE: %bf.load = load i64, i64* getelementptr inbounds {{.*}}, align 8 - // SANITIZE-NEXT: %bf.clear = and i64 %bf.load, 4294967295 + // SANITIZE-NEXT: %bf.freeze = freeze i64 %bf.load + // SANITIZE-NEXT: %bf.clear = and i64 %bf.freeze, 4294967295 // SANITIZE-NEXT: %bf.set = or i64 %bf.clear, 21474836480 // SANITIZE-NEXT: store i64 %bf.set, i64* getelementptr inbounds {{.*}}, align 8 // SANITIZE-NEXT: ret void diff --git a/clang/test/CodeGenCXX/ignored-bitfield-conditional.cpp b/clang/test/CodeGenCXX/ignored-bitfield-conditional.cpp --- a/clang/test/CodeGenCXX/ignored-bitfield-conditional.cpp +++ b/clang/test/CodeGenCXX/ignored-bitfield-conditional.cpp @@ -25,8 +25,9 @@ // CHECK: %[[VAL1LD:.+]] = load i32, ptr %[[VAL1]] // CHECK: %[[VAL1TRUNC:.+]] = trunc i32 %[[VAL1LD]] to i16 // CHECK: %[[BF_LOAD:.+]] = load i16, ptr %[[S1]] + // CHECK: %[[BF_FREEZE:.+]] = freeze i16 %[[BF_LOAD]] // CHECK: %[[BF_VAL:.+]] = and i16 %[[VAL1TRUNC]], 31 - // CHECK: %[[BF_CLEAR:.+]] = and i16 %[[BF_LOAD]], -32 + // CHECK: %[[BF_CLEAR:.+]] = and i16 %[[BF_FREEZE]], -32 // CHECK: %[[BF_SET:.+]] = or i16 %[[BF_CLEAR]], %[[BF_VAL]] // CHECK: store i16 %[[BF_SET]], ptr %[[S1]] // CHECK: br label %[[END:.+]] @@ -36,9 +37,10 @@ // CHECK: %[[VAL2LD:.+]] = load i32, ptr %[[VAL2]] // CHECK: %[[VAL2TRUNC:.+]] = trunc i32 %[[VAL2LD]] to i16 // CHECK: %[[BF_LOAD:.+]] = load i16, ptr %[[S1]] + // CHECK: %[[BF_FREEZE:.+]] = freeze i16 %[[BF_LOAD]] // CHECK: %[[BF_VAL:.+]] = and i16 %[[VAL2TRUNC]], 63 // CHECK: %[[BF_SHIFT:.+]] = shl i16 %[[BF_VAL]], 5 - // CHECK: %[[BF_CLEAR:.+]] = and i16 %[[BF_LOAD]], -2017 + // CHECK: %[[BF_CLEAR:.+]] = and i16 %[[BF_FREEZE]], -2017 // CHECK: %[[BF_SET:.+]] = or i16 %[[BF_CLEAR]], %[[BF_SHIFT]] // CHECK: store i16 %[[BF_SET]], ptr %[[S1]] // CHECK: br label %[[END:.+]] @@ -59,8 +61,9 @@ // CHECK: %[[VAL1LD:.+]] = load i32, ptr %[[VAL1]] // CHECK: %[[VAL1TRUNC:.+]] = trunc i32 %[[VAL1LD]] to i16 // CHECK: %[[BF_LOAD:.+]] = load i16, ptr %[[S2]] + // CHECK: %[[BF_FREEZE:.+]] = freeze i16 %[[BF_LOAD]] // CHECK: %[[BF_VAL:.+]] = and i16 %[[VAL1TRUNC]], 31 - // CHECK: %[[BF_CLEAR:.+]] = and i16 %[[BF_LOAD]], -32 + // CHECK: %[[BF_CLEAR:.+]] = and i16 %[[BF_FREEZE]], -32 // CHECK: %[[BF_SET:.+]] = or i16 %[[BF_CLEAR]], %[[BF_VAL]] // CHECK: store i16 %[[BF_SET]], ptr %[[S2]] // CHECK: br label %[[END:.+]] @@ -70,9 +73,10 @@ // CHECK: %[[VAL2LD:.+]] = load i32, ptr %[[VAL2]] // CHECK: %[[VAL2TRUNC:.+]] = trunc i32 %[[VAL2LD]] to i16 // CHECK: %[[BF_LOAD:.+]] = load i16, ptr %[[S2]] + // CHECK: %[[BF_FREEZE:.+]] = freeze i16 %[[BF_LOAD]] // CHECK: %[[BF_VAL:.+]] = and i16 %[[VAL2TRUNC]], 63 // CHECK: %[[BF_SHIFT:.+]] = shl i16 %[[BF_VAL]], 5 - // CHECK: %[[BF_CLEAR:.+]] = and i16 %[[BF_LOAD]], -2017 + // CHECK: %[[BF_CLEAR:.+]] = and i16 %[[BF_FREEZE]], -2017 // CHECK: %[[BF_SET:.+]] = or i16 %[[BF_CLEAR]], %[[BF_SHIFT]] // CHECK: store i16 %[[BF_SET]], ptr %[[S2]] // CHECK: br label %[[END:.+]] @@ -105,8 +109,9 @@ // CHECK: %[[VAL1LD:.+]] = load i32, ptr %[[VAL1]] // CHECK: %[[VAL1TRUNC:.+]] = trunc i32 %[[VAL1LD]] to i16 // CHECK: %[[BF_LOAD:.+]] = load i16, ptr %[[S1]] + // CHECK: %[[BF_FREEZE:.+]] = freeze i16 %[[BF_LOAD]] // CHECK: %[[BF_VAL:.+]] = and i16 %[[VAL1TRUNC]], 31 - // CHECK: %[[BF_CLEAR:.+]] = and i16 %[[BF_LOAD]], -32 + // CHECK: %[[BF_CLEAR:.+]] = and i16 %[[BF_FREEZE]], -32 // CHECK: %[[BF_SET:.+]] = or i16 %[[BF_CLEAR]], %[[BF_VAL]] // CHECK: store i16 %[[BF_SET]], ptr %[[S1]] // CHECK: br label %[[END:.+]] @@ -122,9 +127,10 @@ // CHECK: %[[VAL2LD:.+]] = load i32, ptr %[[VAL2]] // CHECK: %[[VAL2TRUNC:.+]] = trunc i32 %[[VAL2LD]] to i16 // CHECK: %[[BF_LOAD:.+]] = load i16, ptr %[[S1]] + // CHECK: %[[BF_FREEZE:.+]] = freeze i16 %[[BF_LOAD]] // CHECK: %[[BF_VAL:.+]] = and i16 %[[VAL2TRUNC]], 63 // CHECK: %[[BF_SHIFT:.+]] = shl i16 %[[BF_VAL]], 5 - // CHECK: %[[BF_CLEAR:.+]] = and i16 %[[BF_LOAD]], -2017 + // CHECK: %[[BF_CLEAR:.+]] = and i16 %[[BF_FREEZE]], -2017 // CHECK: %[[BF_SET:.+]] = or i16 %[[BF_CLEAR]], %[[BF_SHIFT]] // CHECK: store i16 %[[BF_SET]], ptr %[[S1]] // CHECK: br label %[[END:.+]] @@ -134,9 +140,10 @@ // CHECK: %[[VAL3LD:.+]] = load i32, ptr %[[VAL3]] // CHECK: %[[VAL3TRUNC:.+]] = trunc i32 %[[VAL3LD]] to i16 // CHECK: %[[BF_LOAD:.+]] = load i16, ptr %[[S1]] + // CHECK: %[[BF_FREEZE:.+]] = freeze i16 %[[BF_LOAD]] // CHECK: %[[BF_VAL:.+]] = and i16 %[[VAL3TRUNC]], 7 // CHECK: %[[BF_SHIFT:.+]] = shl i16 %[[BF_VAL]], 11 - // CHECK: %[[BF_CLEAR:.+]] = and i16 %[[BF_LOAD]], -14337 + // CHECK: %[[BF_CLEAR:.+]] = and i16 %[[BF_FREEZE]], -14337 // CHECK: %[[BF_SET:.+]] = or i16 %[[BF_CLEAR]], %[[BF_SHIFT]] // CHECK: store i16 %[[BF_SET]], ptr %[[S1]] // CHECK: br label %[[END:.+]] diff --git a/clang/test/CodeGenCXX/references.cpp b/clang/test/CodeGenCXX/references.cpp --- a/clang/test/CodeGenCXX/references.cpp +++ b/clang/test/CodeGenCXX/references.cpp @@ -295,6 +295,7 @@ const int &y = x.a; // CHECK-NEXT: bitcast // CHECK-NEXT: load + // CHECK-NEXT: freeze // CHECK-NEXT: and // CHECK-NEXT: or i32 {{.*}}, 19456 // CHECK-NEXT: store i32 diff --git a/clang/test/CodeGenObjC/strong-in-c-struct.m b/clang/test/CodeGenObjC/strong-in-c-struct.m --- a/clang/test/CodeGenObjC/strong-in-c-struct.m +++ b/clang/test/CodeGenObjC/strong-in-c-struct.m @@ -724,9 +724,10 @@ // CHECK: %[[BF_CAST:.*]] = sext i8 %[[BF_ASHR]] to i32 // CHECK: %[[V56:.*]] = trunc i32 %[[BF_CAST]] to i8 // CHECK: %[[BF_LOAD2:.*]] = load volatile i8, i8* %[[I5]], align 8 +// CHECK: %[[BF_FREEZE:.*]] = freeze i8 %[[BF_LOAD]] // CHECK: %[[BF_VALUE:.*]] = and i8 %[[V56]], 3 // CHECK: %[[BF_SHL3:.*]] = shl i8 %[[BF_VALUE]], 1 -// CHECK: %[[BF_CLEAR:.*]] = and i8 %[[BF_LOAD2]], -7 +// CHECK: %[[BF_CLEAR:.*]] = and i8 %[[BF_FREEZE]], -7 // CHECK: %[[BF_SET:.*]] = or i8 %[[BF_CLEAR]], %[[BF_SHL3]] // CHECK: store volatile i8 %[[BF_SET]], i8* %[[I5]], align 8 // CHECK: %[[V57:.*]] = bitcast i8** %[[V0]] to %[[STRUCT_BITFIELD1]]* diff --git a/clang/test/OpenMP/atomic_capture_codegen.cpp b/clang/test/OpenMP/atomic_capture_codegen.cpp --- a/clang/test/OpenMP/atomic_capture_codegen.cpp +++ b/clang/test/OpenMP/atomic_capture_codegen.cpp @@ -653,8 +653,9 @@ // CHECK: [[SUB:%.+]] = fsub x86_fp80 [[X_RVAL]], [[EXPR]] // CHECK: [[CONV:%.+]] = fptosi x86_fp80 [[SUB]] to i32 // CHECK: [[NEW_VAL:%.+]] = load i32, i32* [[TEMP1]], +// CHECK: [[BF_FREEZE:%.+]] = freeze i32 [[NEW_VAL]] // CHECK: [[BF_VALUE:%.+]] = and i32 [[CONV]], 2147483647 -// CHECK: [[BF_CLEAR:%.+]] = and i32 [[NEW_VAL]], -2147483648 +// CHECK: [[BF_CLEAR:%.+]] = and i32 [[BF_FREEZE]], -2147483648 // CHECK: [[BF_SET:%.+]] = or i32 [[BF_CLEAR]], [[BF_VALUE]] // CHECK: store i32 [[BF_SET]], i32* [[TEMP1]], // CHECK: [[NEW_BF_VALUE:%.+]] = load i32, i32* [[TEMP1]], @@ -682,8 +683,9 @@ // CHECK: [[MUL:%.+]] = fmul x86_fp80 [[X_RVAL]], [[EXPR]] // CHECK: [[CONV:%.+]] = fptosi x86_fp80 [[MUL]] to i32 // CHECK: [[NEW_VAL:%.+]] = load i32, i32* [[TEMP1]], +// CHECK: [[BF_FREEZE:%.+]] = freeze i32 [[NEW_VAL]] // CHECK: [[BF_VALUE:%.+]] = and i32 [[CONV]], 2147483647 -// CHECK: [[BF_CLEAR:%.+]] = and i32 [[NEW_VAL]], -2147483648 +// CHECK: [[BF_CLEAR:%.+]] = and i32 [[BF_FREEZE]], -2147483648 // CHECK: or i32 [[BF_CLEAR]], [[BF_VALUE]] // CHECK: store i32 %{{.+}}, i32* [[TEMP1]] // CHECK: [[BITCAST_TEMP_OLD_BF_ADDR:%.+]] = bitcast i32* [[LDTEMP]] to i8* @@ -707,9 +709,10 @@ // CHECK: [[SUB:%.+]] = fsub x86_fp80 [[X_RVAL]], [[EXPR]] // CHECK: [[CONV:%.+]] = fptosi x86_fp80 [[SUB]] to i32 // CHECK: [[NEW_VAL:%.+]] = load i32, i32* [[TEMP1]], +// CHECK: [[BF_FREEZE:%.+]] = freeze i32 [[NEW_VAL]] // CHECK: [[BF_AND:%.+]] = and i32 [[CONV]], 1 // CHECK: [[BF_VALUE:%.+]] = shl i32 [[BF_AND]], 31 -// CHECK: [[BF_CLEAR:%.+]] = and i32 [[NEW_VAL]], 2147483647 +// CHECK: [[BF_CLEAR:%.+]] = and i32 [[BF_FREEZE]], 2147483647 // CHECK: or i32 [[BF_CLEAR]], [[BF_VALUE]] // CHECK: store i32 %{{.+}}, i32* [[TEMP1]] // CHECK: [[NEW_BF_VALUE:%.+]] = load i32, i32* [[TEMP1]] @@ -799,9 +802,10 @@ // CHECK: [[NEW_VAL:%.+]] = fptosi x86_fp80 [[ADD]] to i32 // CHECK: [[TRUNC:%.+]] = trunc i32 [[NEW_VAL]] to i24 // CHECK: [[BF_LD:%.+]] = load i24, i24* [[BITCAST2]], +// CHECK: [[BF_FREEZE:%.+]] = freeze i24 [[BF_LD]] // CHECK: [[BF_AND:%.+]] = and i24 [[TRUNC]], 16383 // CHECK: [[BF_VALUE:%.+]] = shl i24 [[BF_AND]], 3 -// CHECK: [[BF_CLEAR:%.+]] = and i24 [[BF_LD]], -131065 +// CHECK: [[BF_CLEAR:%.+]] = and i24 [[BF_FREEZE]], -131065 // CHECK: or i24 [[BF_CLEAR]], [[BF_VALUE]] // CHECK: store i24 %{{.+}}, i24* [[BITCAST2]] // CHECK: [[BITCAST_TEMP_OLD_BF_ADDR:%.+]] = bitcast i24* [[LDTEMP]] to i8* @@ -828,9 +832,10 @@ // CHECK: [[NEW_VAL:%.+]] = fptosi x86_fp80 [[MUL]] to i32 // CHECK: [[ZEXT:%.+]] = zext i32 [[NEW_VAL]] to i64 // CHECK: [[BF_LD:%.+]] = load i64, i64* [[TEMP1]], +// CHECK: [[BF_FREEZE:%.+]] = freeze i64 [[BF_LD]] // CHECK: [[BF_AND:%.+]] = and i64 [[ZEXT]], 1 // CHECK: [[BF_VALUE:%.+]] = shl i64 [[BF_AND]], 16 -// CHECK: [[BF_CLEAR:%.+]] = and i64 [[BF_LD]], -65537 +// CHECK: [[BF_CLEAR:%.+]] = and i64 [[BF_FREEZE]], -65537 // CHECK: or i64 [[BF_CLEAR]], [[BF_VALUE]] // CHECK: store i64 %{{.+}}, i64* [[TEMP1]] // CHECK: [[NEW_BF_VALUE:%.+]] = load i64, i64* [[TEMP1]] @@ -860,8 +865,9 @@ // CHECK: [[CONV:%.+]] = fptosi x86_fp80 [[SUB:%.+]] to i32 // CHECK: [[NEW_VAL:%.+]] = trunc i32 [[CONV]] to i8 // CHECK: [[BF_LD:%.+]] = load i8, i8* [[BITCAST1]], +// CHECK: [[BF_FREEZE:%.+]] = freeze i8 [[BF_LD]] // CHECK: [[BF_VALUE:%.+]] = and i8 [[NEW_VAL]], 1 -// CHECK: [[BF_CLEAR:%.+]] = and i8 [[BF_LD]], -2 +// CHECK: [[BF_CLEAR:%.+]] = and i8 [[BF_FREEZE]], -2 // CHECK: or i8 [[BF_CLEAR]], [[BF_VALUE]] // CHECK: store i8 %{{.+}}, i8* [[BITCAST1]] // CHECK: [[NEW_BF_VALUE:%.+]] = load i8, i8* [[BITCAST1]] @@ -887,9 +893,10 @@ // CHECK: [[DIV:%.+]] = fdiv x86_fp80 [[CONV]], [[EXPR]] // CHECK: [[CONV:%.+]] = fptosi x86_fp80 [[DIV]] to i64 // CHECK: [[BF_LD:%.+]] = load i64, i64* [[TEMP1]], +// CHECK: [[BF_FREEZE:%.+]] = freeze i64 [[BF_LD]] // CHECK: [[BF_AND:%.+]] = and i64 [[CONV]], 127 // CHECK: [[BF_VALUE:%.+]] = shl i64 [[BF_AND:%.+]], 17 -// CHECK: [[BF_CLEAR:%.+]] = and i64 [[BF_LD]], -16646145 +// CHECK: [[BF_CLEAR:%.+]] = and i64 [[BF_FREEZE]], -16646145 // CHECK: [[VAL:%.+]] = or i64 [[BF_CLEAR]], [[BF_VALUE]] // CHECK: store i64 [[VAL]], i64* [[TEMP1]] // CHECK: [[NEW_BF_VALUE:%.+]] = load i64, i64* [[TEMP1]] @@ -920,9 +927,10 @@ // CHECK: [[NEW_VAL:%.+]] = fptosi x86_fp80 [[ADD]] to i64 // CHECK: [[TRUNC:%.+]] = trunc i64 [[NEW_VAL]] to i8 // CHECK: [[BF_LD:%.+]] = load i8, i8* [[BITCAST1]], +// CHECK: [[BF_FREEZE:%.+]] = freeze i8 [[BF_LD]] // CHECK: [[BF_AND:%.+]] = and i8 [[TRUNC]], 127 // CHECK: [[BF_VALUE:%.+]] = shl i8 [[BF_AND]], 1 -// CHECK: [[BF_CLEAR:%.+]] = and i8 [[BF_LD]], 1 +// CHECK: [[BF_CLEAR:%.+]] = and i8 [[BF_FREEZE]], 1 // CHECK: or i8 [[BF_CLEAR]], [[BF_VALUE]] // CHECK: store i8 %{{.+}}, i8* [[BITCAST1]] // CHECK: [[NEW_BF_VALUE:%.+]] = load i8, i8* [[BITCAST1]] diff --git a/clang/test/OpenMP/atomic_update_codegen.cpp b/clang/test/OpenMP/atomic_update_codegen.cpp --- a/clang/test/OpenMP/atomic_update_codegen.cpp +++ b/clang/test/OpenMP/atomic_update_codegen.cpp @@ -586,8 +586,9 @@ // CHECK: [[SUB:%.+]] = fsub x86_fp80 [[X_RVAL]], [[EXPR]] // CHECK: [[CONV:%.+]] = fptosi x86_fp80 [[SUB]] to i32 // CHECK: [[NEW_VAL:%.+]] = load i32, i32* [[TEMP1]], +// CHECK: [[BF_FREEZE:%.+]] = freeze i32 [[NEW_VAL]] // CHECK: [[BF_VALUE:%.+]] = and i32 [[CONV]], 2147483647 -// CHECK: [[BF_CLEAR:%.+]] = and i32 [[NEW_VAL]], -2147483648 +// CHECK: [[BF_CLEAR:%.+]] = and i32 [[BF_FREEZE]], -2147483648 // CHECK: or i32 [[BF_CLEAR]], [[BF_VALUE]] // CHECK: store i32 %{{.+}}, i32* [[TEMP1]] // CHECK: [[NEW_BF_VALUE:%.+]] = load i32, i32* [[TEMP1]] @@ -614,8 +615,9 @@ // CHECK: [[MUL:%.+]] = fmul x86_fp80 [[X_RVAL]], [[EXPR]] // CHECK: [[CONV:%.+]] = fptosi x86_fp80 [[MUL]] to i32 // CHECK: [[NEW_VAL:%.+]] = load i32, i32* [[TEMP1]], +// CHECK: [[BF_FREEZE:%.+]] = freeze i32 [[NEW_VAL]] // CHECK: [[BF_VALUE:%.+]] = and i32 [[CONV]], 2147483647 -// CHECK: [[BF_CLEAR:%.+]] = and i32 [[NEW_VAL]], -2147483648 +// CHECK: [[BF_CLEAR:%.+]] = and i32 [[BF_FREEZE]], -2147483648 // CHECK: or i32 [[BF_CLEAR]], [[BF_VALUE]] // CHECK: store i32 %{{.+}}, i32* [[TEMP1]] // CHECK: [[BITCAST_TEMP_OLD_BF_ADDR:%.+]] = bitcast i32* [[LDTEMP]] to i8* @@ -638,9 +640,10 @@ // CHECK: [[SUB:%.+]] = fsub x86_fp80 [[X_RVAL]], [[EXPR]] // CHECK: [[CONV:%.+]] = fptosi x86_fp80 [[SUB]] to i32 // CHECK: [[NEW_VAL:%.+]] = load i32, i32* [[TEMP1]], +// CHECK: [[BF_FREEZE:%.+]] = freeze i32 [[NEW_VAL]] // CHECK: [[BF_AND:%.+]] = and i32 [[CONV]], 1 // CHECK: [[BF_VALUE:%.+]] = shl i32 [[BF_AND]], 31 -// CHECK: [[BF_CLEAR:%.+]] = and i32 [[NEW_VAL]], 2147483647 +// CHECK: [[BF_CLEAR:%.+]] = and i32 [[BF_FREEZE]], 2147483647 // CHECK: or i32 [[BF_CLEAR]], [[BF_VALUE]] // CHECK: store i32 %{{.+}}, i32* [[TEMP1]] // CHECK: [[NEW_BF_VALUE:%.+]] = load i32, i32* [[TEMP1]] @@ -727,9 +730,10 @@ // CHECK: [[NEW_VAL:%.+]] = fptosi x86_fp80 [[ADD]] to i32 // CHECK: [[TRUNC:%.+]] = trunc i32 [[NEW_VAL]] to i24 // CHECK: [[BF_LD:%.+]] = load i24, i24* [[TEMP1]], +// CHECK: [[BF_FREEZE:%.+]] = freeze i24 [[BF_LD]] // CHECK: [[BF_AND:%.+]] = and i24 [[TRUNC]], 16383 // CHECK: [[BF_VALUE:%.+]] = shl i24 [[BF_AND]], 3 -// CHECK: [[BF_CLEAR:%.+]] = and i24 [[BF_LD]], -131065 +// CHECK: [[BF_CLEAR:%.+]] = and i24 [[BF_FREEZE]], -131065 // CHECK: or i24 [[BF_CLEAR]], [[BF_VALUE]] // CHECK: store i24 %{{.+}}, i24* [[TEMP1]] // CHECK: [[BITCAST_TEMP_OLD_BF_ADDR:%.+]] = bitcast i24* [[LDTEMP]] to i8* @@ -755,9 +759,10 @@ // CHECK: [[NEW_VAL:%.+]] = fptosi x86_fp80 [[MUL]] to i32 // CHECK: [[ZEXT:%.+]] = zext i32 [[NEW_VAL]] to i64 // CHECK: [[BF_LD:%.+]] = load i64, i64* [[TEMP1]], +// CHECK: [[BF_FREEZE:%.+]] = freeze i64 [[BF_LD]] // CHECK: [[BF_AND:%.+]] = and i64 [[ZEXT]], 1 // CHECK: [[BF_VALUE:%.+]] = shl i64 [[BF_AND]], 16 -// CHECK: [[BF_CLEAR:%.+]] = and i64 [[BF_LD]], -65537 +// CHECK: [[BF_CLEAR:%.+]] = and i64 [[BF_FREEZE]], -65537 // CHECK: or i64 [[BF_CLEAR]], [[BF_VALUE]] // CHECK: store i64 %{{.+}}, i64* [[TEMP1]] // CHECK: [[NEW_BF_VALUE:%.+]] = load i64, i64* [[TEMP1]] @@ -786,8 +791,9 @@ // CHECK: [[CONV:%.+]] = fptosi x86_fp80 [[SUB:%.+]] to i32 // CHECK: [[NEW_VAL:%.+]] = trunc i32 [[CONV]] to i8 // CHECK: [[BF_LD:%.+]] = load i8, i8* [[BITCAST1]], +// CHECK: [[BF_FREEZE:%.+]] = freeze i8 [[BF_LD]] // CHECK: [[BF_VALUE:%.+]] = and i8 [[NEW_VAL]], 1 -// CHECK: [[BF_CLEAR:%.+]] = and i8 [[BF_LD]], -2 +// CHECK: [[BF_CLEAR:%.+]] = and i8 [[BF_FREEZE]], -2 // CHECK: or i8 [[BF_CLEAR]], [[BF_VALUE]] // CHECK: store i8 %{{.+}}, i8* [[BITCAST1]] // CHECK: [[NEW_BF_VALUE:%.+]] = load i8, i8* [[BITCAST1]] @@ -812,9 +818,10 @@ // CHECK: [[DIV:%.+]] = fdiv x86_fp80 [[CONV]], [[EXPR]] // CHECK: [[CONV:%.+]] = fptosi x86_fp80 [[DIV]] to i64 // CHECK: [[BF_LD:%.+]] = load i64, i64* [[TEMP1]], +// CHECK: [[BF_FREEZE:%.+]] = freeze i64 [[BF_LD]] // CHECK: [[BF_AND:%.+]] = and i64 [[CONV]], 127 // CHECK: [[BF_VALUE:%.+]] = shl i64 [[BF_AND:%.+]], 17 -// CHECK: [[BF_CLEAR:%.+]] = and i64 [[BF_LD]], -16646145 +// CHECK: [[BF_CLEAR:%.+]] = and i64 [[BF_FREEZE]], -16646145 // CHECK: [[VAL:%.+]] = or i64 [[BF_CLEAR]], [[BF_VALUE]] // CHECK: store i64 [[VAL]], i64* [[TEMP1]] // CHECK: [[NEW_BF_VALUE:%.+]] = load i64, i64* [[TEMP1]] @@ -842,9 +849,10 @@ // CHECK: [[NEW_VAL:%.+]] = fptosi x86_fp80 [[ADD]] to i64 // CHECK: [[TRUNC:%.+]] = trunc i64 [[NEW_VAL]] to i8 // CHECK: [[BF_LD:%.+]] = load i8, i8* [[BITCAST1]], +// CHECK: [[BF_FREEZE:%.+]] = freeze i8 [[BF_LD]] // CHECK: [[BF_AND:%.+]] = and i8 [[TRUNC]], 127 // CHECK: [[BF_VALUE:%.+]] = shl i8 [[BF_AND]], 1 -// CHECK: [[BF_CLEAR:%.+]] = and i8 [[BF_LD]], 1 +// CHECK: [[BF_CLEAR:%.+]] = and i8 [[BF_FREEZE]], 1 // CHECK: or i8 [[BF_CLEAR]], [[BF_VALUE]] // CHECK: store i8 %{{.+}}, i8* [[BITCAST1]] // CHECK: [[NEW_BF_VALUE:%.+]] = load i8, i8* [[BITCAST1]] diff --git a/clang/test/OpenMP/atomic_write_codegen.c b/clang/test/OpenMP/atomic_write_codegen.c --- a/clang/test/OpenMP/atomic_write_codegen.c +++ b/clang/test/OpenMP/atomic_write_codegen.c @@ -319,8 +319,9 @@ // CHECK: [[OLD_BF_VALUE:%.+]] = load i32, i32* [[LDTEMP]], // CHECK: store i32 [[OLD_BF_VALUE]], i32* [[LDTEMP1:%.+]], // CHECK: [[OLD_BF_VALUE:%.+]] = load i32, i32* [[LDTEMP1]], +// CHECK: [[BF_FREEZE:%.+]] = freeze i32 [[OLD_BF_VALUE]] // CHECK: [[BF_VALUE:%.+]] = and i32 [[NEW_VAL]], 2147483647 -// CHECK: [[BF_CLEAR:%.+]] = and i32 [[OLD_BF_VALUE]], -2147483648 +// CHECK: [[BF_CLEAR:%.+]] = and i32 [[BF_FREEZE]], -2147483648 // CHECK: or i32 [[BF_CLEAR]], [[BF_VALUE]] // CHECK: store i32 %{{.+}}, i32* [[LDTEMP1]] // CHECK: [[BITCAST_TEMP_OLD_BF_ADDR:%.+]] = bitcast i32* [[LDTEMP]] to i8* diff --git a/clang/test/OpenMP/for_lastprivate_codegen.cpp b/clang/test/OpenMP/for_lastprivate_codegen.cpp --- a/clang/test/OpenMP/for_lastprivate_codegen.cpp +++ b/clang/test/OpenMP/for_lastprivate_codegen.cpp @@ -900,7 +900,8 @@ // CHECK1-NEXT: store i32 0, i32* [[A]], align 8 // CHECK1-NEXT: [[B:%.*]] = getelementptr inbounds [[STRUCT_SS]], %struct.SS* [[THIS1]], i32 0, i32 2 // CHECK1-NEXT: [[BF_LOAD:%.*]] = load i8, i8* [[B]], align 8 -// CHECK1-NEXT: [[BF_CLEAR:%.*]] = and i8 [[BF_LOAD]], -16 +// CHECK1-NEXT: [[BF_FREEZE:%.*]] = freeze i8 [[BF_LOAD]] +// CHECK1-NEXT: [[BF_CLEAR:%.*]] = and i8 [[BF_FREEZE]], -16 // CHECK1-NEXT: [[BF_SET:%.*]] = or i8 [[BF_CLEAR]], 0 // CHECK1-NEXT: store i8 [[BF_SET]], i8* [[B]], align 8 // CHECK1-NEXT: [[C:%.*]] = getelementptr inbounds [[STRUCT_SS]], %struct.SS* [[THIS1]], i32 0, i32 3 @@ -951,15 +952,16 @@ // CHECK1-NEXT: [[DEC:%.*]] = add nsw i32 [[BF_CAST]], -1 // CHECK1-NEXT: [[TMP11:%.*]] = trunc i32 [[DEC]] to i8 // CHECK1-NEXT: [[BF_LOAD8:%.*]] = load i8, i8* [[B6]], align 8 +// CHECK1-NEXT: [[BF_FREEZE9:%.*]] = freeze i8 [[BF_LOAD8]] // CHECK1-NEXT: [[BF_VALUE:%.*]] = and i8 [[TMP11]], 15 -// CHECK1-NEXT: [[BF_CLEAR9:%.*]] = and i8 [[BF_LOAD8]], -16 -// CHECK1-NEXT: [[BF_SET10:%.*]] = or i8 [[BF_CLEAR9]], [[BF_VALUE]] -// CHECK1-NEXT: store i8 [[BF_SET10]], i8* [[B6]], align 8 +// CHECK1-NEXT: [[BF_CLEAR10:%.*]] = and i8 [[BF_FREEZE9]], -16 +// CHECK1-NEXT: [[BF_SET11:%.*]] = or i8 [[BF_CLEAR10]], [[BF_VALUE]] +// CHECK1-NEXT: store i8 [[BF_SET11]], i8* [[B6]], align 8 // CHECK1-NEXT: [[BF_RESULT_SHL:%.*]] = shl i8 [[BF_VALUE]], 4 // CHECK1-NEXT: [[BF_RESULT_ASHR:%.*]] = ashr i8 [[BF_RESULT_SHL]], 4 // CHECK1-NEXT: [[BF_RESULT_CAST:%.*]] = sext i8 [[BF_RESULT_ASHR]] to i32 -// CHECK1-NEXT: [[C11:%.*]] = getelementptr inbounds [[STRUCT_SS]], %struct.SS* [[THIS1]], i32 0, i32 3 -// CHECK1-NEXT: [[TMP12:%.*]] = load i32*, i32** [[C11]], align 8 +// CHECK1-NEXT: [[C12:%.*]] = getelementptr inbounds [[STRUCT_SS]], %struct.SS* [[THIS1]], i32 0, i32 3 +// CHECK1-NEXT: [[TMP12:%.*]] = load i32*, i32** [[C12]], align 8 // CHECK1-NEXT: [[TMP13:%.*]] = load i32, i32* [[TMP12]], align 4 // CHECK1-NEXT: [[DIV:%.*]] = sdiv i32 [[TMP13]], 1 // CHECK1-NEXT: store i32 [[DIV]], i32* [[TMP12]], align 4 @@ -968,8 +970,8 @@ // CHECK1-NEXT: br label [[OMP_INNER_FOR_INC:%.*]] // CHECK1: omp.inner.for.inc: // CHECK1-NEXT: [[TMP14:%.*]] = load i32, i32* [[DOTOMP_IV]], align 4 -// CHECK1-NEXT: [[ADD12:%.*]] = add nsw i32 [[TMP14]], 1 -// CHECK1-NEXT: store i32 [[ADD12]], i32* [[DOTOMP_IV]], align 4 +// CHECK1-NEXT: [[ADD13:%.*]] = add nsw i32 [[TMP14]], 1 +// CHECK1-NEXT: store i32 [[ADD13]], i32* [[DOTOMP_IV]], align 4 // CHECK1-NEXT: br label [[OMP_INNER_FOR_COND]] // CHECK1: omp.inner.for.end: // CHECK1-NEXT: br label [[OMP_LOOP_EXIT:%.*]] @@ -1107,8 +1109,9 @@ // CHECK1-NEXT: [[B16:%.*]] = getelementptr inbounds [[STRUCT_SS]], %struct.SS* [[TMP0]], i32 0, i32 2 // CHECK1-NEXT: [[TMP35:%.*]] = trunc i32 [[TMP34]] to i8 // CHECK1-NEXT: [[BF_LOAD:%.*]] = load i8, i8* [[B16]], align 8 +// CHECK1-NEXT: [[BF_FREEZE:%.*]] = freeze i8 [[BF_LOAD]] // CHECK1-NEXT: [[BF_VALUE:%.*]] = and i8 [[TMP35]], 15 -// CHECK1-NEXT: [[BF_CLEAR:%.*]] = and i8 [[BF_LOAD]], -16 +// CHECK1-NEXT: [[BF_CLEAR:%.*]] = and i8 [[BF_FREEZE]], -16 // CHECK1-NEXT: [[BF_SET:%.*]] = or i8 [[BF_CLEAR]], [[BF_VALUE]] // CHECK1-NEXT: store i8 [[BF_SET]], i8* [[B16]], align 8 // CHECK1-NEXT: br label [[DOTOMP_LASTPRIVATE_DONE]] @@ -2077,7 +2080,8 @@ // CHECK2-NEXT: store i32 0, i32* [[A]], align 8 // CHECK2-NEXT: [[B:%.*]] = getelementptr inbounds [[STRUCT_SS]], %struct.SS* [[THIS1]], i32 0, i32 2 // CHECK2-NEXT: [[BF_LOAD:%.*]] = load i8, i8* [[B]], align 8 -// CHECK2-NEXT: [[BF_CLEAR:%.*]] = and i8 [[BF_LOAD]], -16 +// CHECK2-NEXT: [[BF_FREEZE:%.*]] = freeze i8 [[BF_LOAD]] +// CHECK2-NEXT: [[BF_CLEAR:%.*]] = and i8 [[BF_FREEZE]], -16 // CHECK2-NEXT: [[BF_SET:%.*]] = or i8 [[BF_CLEAR]], 0 // CHECK2-NEXT: store i8 [[BF_SET]], i8* [[B]], align 8 // CHECK2-NEXT: [[C:%.*]] = getelementptr inbounds [[STRUCT_SS]], %struct.SS* [[THIS1]], i32 0, i32 3 @@ -2128,15 +2132,16 @@ // CHECK2-NEXT: [[DEC:%.*]] = add nsw i32 [[BF_CAST]], -1 // CHECK2-NEXT: [[TMP11:%.*]] = trunc i32 [[DEC]] to i8 // CHECK2-NEXT: [[BF_LOAD8:%.*]] = load i8, i8* [[B6]], align 8 +// CHECK2-NEXT: [[BF_FREEZE9:%.*]] = freeze i8 [[BF_LOAD8]] // CHECK2-NEXT: [[BF_VALUE:%.*]] = and i8 [[TMP11]], 15 -// CHECK2-NEXT: [[BF_CLEAR9:%.*]] = and i8 [[BF_LOAD8]], -16 -// CHECK2-NEXT: [[BF_SET10:%.*]] = or i8 [[BF_CLEAR9]], [[BF_VALUE]] -// CHECK2-NEXT: store i8 [[BF_SET10]], i8* [[B6]], align 8 +// CHECK2-NEXT: [[BF_CLEAR10:%.*]] = and i8 [[BF_FREEZE9]], -16 +// CHECK2-NEXT: [[BF_SET11:%.*]] = or i8 [[BF_CLEAR10]], [[BF_VALUE]] +// CHECK2-NEXT: store i8 [[BF_SET11]], i8* [[B6]], align 8 // CHECK2-NEXT: [[BF_RESULT_SHL:%.*]] = shl i8 [[BF_VALUE]], 4 // CHECK2-NEXT: [[BF_RESULT_ASHR:%.*]] = ashr i8 [[BF_RESULT_SHL]], 4 // CHECK2-NEXT: [[BF_RESULT_CAST:%.*]] = sext i8 [[BF_RESULT_ASHR]] to i32 -// CHECK2-NEXT: [[C11:%.*]] = getelementptr inbounds [[STRUCT_SS]], %struct.SS* [[THIS1]], i32 0, i32 3 -// CHECK2-NEXT: [[TMP12:%.*]] = load i32*, i32** [[C11]], align 8 +// CHECK2-NEXT: [[C12:%.*]] = getelementptr inbounds [[STRUCT_SS]], %struct.SS* [[THIS1]], i32 0, i32 3 +// CHECK2-NEXT: [[TMP12:%.*]] = load i32*, i32** [[C12]], align 8 // CHECK2-NEXT: [[TMP13:%.*]] = load i32, i32* [[TMP12]], align 4 // CHECK2-NEXT: [[DIV:%.*]] = sdiv i32 [[TMP13]], 1 // CHECK2-NEXT: store i32 [[DIV]], i32* [[TMP12]], align 4 @@ -2145,8 +2150,8 @@ // CHECK2-NEXT: br label [[OMP_INNER_FOR_INC:%.*]] // CHECK2: omp.inner.for.inc: // CHECK2-NEXT: [[TMP14:%.*]] = load i32, i32* [[DOTOMP_IV]], align 4 -// CHECK2-NEXT: [[ADD12:%.*]] = add nsw i32 [[TMP14]], 1 -// CHECK2-NEXT: store i32 [[ADD12]], i32* [[DOTOMP_IV]], align 4 +// CHECK2-NEXT: [[ADD13:%.*]] = add nsw i32 [[TMP14]], 1 +// CHECK2-NEXT: store i32 [[ADD13]], i32* [[DOTOMP_IV]], align 4 // CHECK2-NEXT: br label [[OMP_INNER_FOR_COND]] // CHECK2: omp.inner.for.end: // CHECK2-NEXT: br label [[OMP_LOOP_EXIT:%.*]] @@ -2284,8 +2289,9 @@ // CHECK2-NEXT: [[B16:%.*]] = getelementptr inbounds [[STRUCT_SS]], %struct.SS* [[TMP0]], i32 0, i32 2 // CHECK2-NEXT: [[TMP35:%.*]] = trunc i32 [[TMP34]] to i8 // CHECK2-NEXT: [[BF_LOAD:%.*]] = load i8, i8* [[B16]], align 8 +// CHECK2-NEXT: [[BF_FREEZE:%.*]] = freeze i8 [[BF_LOAD]] // CHECK2-NEXT: [[BF_VALUE:%.*]] = and i8 [[TMP35]], 15 -// CHECK2-NEXT: [[BF_CLEAR:%.*]] = and i8 [[BF_LOAD]], -16 +// CHECK2-NEXT: [[BF_CLEAR:%.*]] = and i8 [[BF_FREEZE]], -16 // CHECK2-NEXT: [[BF_SET:%.*]] = or i8 [[BF_CLEAR]], [[BF_VALUE]] // CHECK2-NEXT: store i8 [[BF_SET]], i8* [[B16]], align 8 // CHECK2-NEXT: br label [[DOTOMP_LASTPRIVATE_DONE]] @@ -2763,7 +2769,8 @@ // CHECK3-NEXT: store i32 0, i32* [[A]], align 8 // CHECK3-NEXT: [[B:%.*]] = getelementptr inbounds [[STRUCT_SS]], %struct.SS* [[THIS1]], i32 0, i32 2 // CHECK3-NEXT: [[BF_LOAD:%.*]] = load i8, i8* [[B]], align 8 -// CHECK3-NEXT: [[BF_CLEAR:%.*]] = and i8 [[BF_LOAD]], -16 +// CHECK3-NEXT: [[BF_FREEZE:%.*]] = freeze i8 [[BF_LOAD]] +// CHECK3-NEXT: [[BF_CLEAR:%.*]] = and i8 [[BF_FREEZE]], -16 // CHECK3-NEXT: [[BF_SET:%.*]] = or i8 [[BF_CLEAR]], 0 // CHECK3-NEXT: store i8 [[BF_SET]], i8* [[B]], align 8 // CHECK3-NEXT: [[C:%.*]] = getelementptr inbounds [[STRUCT_SS]], %struct.SS* [[THIS1]], i32 0, i32 3 @@ -2953,8 +2960,9 @@ // CHECK3-NEXT: [[B16:%.*]] = getelementptr inbounds [[STRUCT_SS]], %struct.SS* [[TMP0]], i32 0, i32 2 // CHECK3-NEXT: [[TMP36:%.*]] = trunc i32 [[TMP35]] to i8 // CHECK3-NEXT: [[BF_LOAD:%.*]] = load i8, i8* [[B16]], align 8 +// CHECK3-NEXT: [[BF_FREEZE:%.*]] = freeze i8 [[BF_LOAD]] // CHECK3-NEXT: [[BF_VALUE:%.*]] = and i8 [[TMP36]], 15 -// CHECK3-NEXT: [[BF_CLEAR:%.*]] = and i8 [[BF_LOAD]], -16 +// CHECK3-NEXT: [[BF_CLEAR:%.*]] = and i8 [[BF_FREEZE]], -16 // CHECK3-NEXT: [[BF_SET:%.*]] = or i8 [[BF_CLEAR]], [[BF_VALUE]] // CHECK3-NEXT: store i8 [[BF_SET]], i8* [[B16]], align 8 // CHECK3-NEXT: br label [[DOTOMP_LASTPRIVATE_DONE]] @@ -3017,8 +3025,9 @@ // CHECK3-NEXT: [[INC:%.*]] = add nsw i32 [[BF_CAST]], 1 // CHECK3-NEXT: [[TMP5:%.*]] = trunc i32 [[INC]] to i8 // CHECK3-NEXT: [[BF_LOAD2:%.*]] = load i8, i8* [[B]], align 8 +// CHECK3-NEXT: [[BF_FREEZE:%.*]] = freeze i8 [[BF_LOAD2]] // CHECK3-NEXT: [[BF_VALUE:%.*]] = and i8 [[TMP5]], 15 -// CHECK3-NEXT: [[BF_CLEAR:%.*]] = and i8 [[BF_LOAD2]], -16 +// CHECK3-NEXT: [[BF_CLEAR:%.*]] = and i8 [[BF_FREEZE]], -16 // CHECK3-NEXT: [[BF_SET:%.*]] = or i8 [[BF_CLEAR]], [[BF_VALUE]] // CHECK3-NEXT: store i8 [[BF_SET]], i8* [[B]], align 8 // CHECK3-NEXT: [[BF_RESULT_SHL:%.*]] = shl i8 [[BF_VALUE]], 4 @@ -3245,8 +3254,9 @@ // CHECK3-NEXT: [[B7:%.*]] = getelementptr inbounds [[STRUCT_SS]], %struct.SS* [[TMP0]], i32 0, i32 2 // CHECK3-NEXT: [[TMP21:%.*]] = trunc i32 [[TMP20]] to i8 // CHECK3-NEXT: [[BF_LOAD:%.*]] = load i8, i8* [[B7]], align 8 +// CHECK3-NEXT: [[BF_FREEZE:%.*]] = freeze i8 [[BF_LOAD]] // CHECK3-NEXT: [[BF_VALUE:%.*]] = and i8 [[TMP21]], 15 -// CHECK3-NEXT: [[BF_CLEAR:%.*]] = and i8 [[BF_LOAD]], -16 +// CHECK3-NEXT: [[BF_CLEAR:%.*]] = and i8 [[BF_FREEZE]], -16 // CHECK3-NEXT: [[BF_SET:%.*]] = or i8 [[BF_CLEAR]], [[BF_VALUE]] // CHECK3-NEXT: store i8 [[BF_SET]], i8* [[B7]], align 8 // CHECK3-NEXT: br label [[DOTOMP_LASTPRIVATE_DONE]] @@ -3571,7 +3581,8 @@ // CHECK4-NEXT: store i32 0, i32* [[A]], align 8 // CHECK4-NEXT: [[B:%.*]] = getelementptr inbounds [[STRUCT_SS]], %struct.SS* [[THIS1]], i32 0, i32 2 // CHECK4-NEXT: [[BF_LOAD:%.*]] = load i8, i8* [[B]], align 8 -// CHECK4-NEXT: [[BF_CLEAR:%.*]] = and i8 [[BF_LOAD]], -16 +// CHECK4-NEXT: [[BF_FREEZE:%.*]] = freeze i8 [[BF_LOAD]] +// CHECK4-NEXT: [[BF_CLEAR:%.*]] = and i8 [[BF_FREEZE]], -16 // CHECK4-NEXT: [[BF_SET:%.*]] = or i8 [[BF_CLEAR]], 0 // CHECK4-NEXT: store i8 [[BF_SET]], i8* [[B]], align 8 // CHECK4-NEXT: [[C:%.*]] = getelementptr inbounds [[STRUCT_SS]], %struct.SS* [[THIS1]], i32 0, i32 3 @@ -3794,8 +3805,9 @@ // CHECK4-NEXT: [[B18:%.*]] = getelementptr inbounds [[STRUCT_SS]], %struct.SS* [[TMP0]], i32 0, i32 2 // CHECK4-NEXT: [[TMP38:%.*]] = trunc i32 [[TMP37]] to i8 // CHECK4-NEXT: [[BF_LOAD:%.*]] = load i8, i8* [[B18]], align 8 +// CHECK4-NEXT: [[BF_FREEZE:%.*]] = freeze i8 [[BF_LOAD]] // CHECK4-NEXT: [[BF_VALUE:%.*]] = and i8 [[TMP38]], 15 -// CHECK4-NEXT: [[BF_CLEAR:%.*]] = and i8 [[BF_LOAD]], -16 +// CHECK4-NEXT: [[BF_CLEAR:%.*]] = and i8 [[BF_FREEZE]], -16 // CHECK4-NEXT: [[BF_SET:%.*]] = or i8 [[BF_CLEAR]], [[BF_VALUE]] // CHECK4-NEXT: store i8 [[BF_SET]], i8* [[B18]], align 8 // CHECK4-NEXT: br label [[DOTOMP_LASTPRIVATE_DONE]] @@ -3977,8 +3989,9 @@ // CHECK4-NEXT: [[DEC:%.*]] = add nsw i32 [[BF_CAST]], -1 // CHECK4-NEXT: [[TMP2:%.*]] = trunc i32 [[DEC]] to i8 // CHECK4-NEXT: [[BF_LOAD1:%.*]] = load i8, i8* [[B]], align 8 +// CHECK4-NEXT: [[BF_FREEZE:%.*]] = freeze i8 [[BF_LOAD1]] // CHECK4-NEXT: [[BF_VALUE:%.*]] = and i8 [[TMP2]], 15 -// CHECK4-NEXT: [[BF_CLEAR:%.*]] = and i8 [[BF_LOAD1]], -16 +// CHECK4-NEXT: [[BF_CLEAR:%.*]] = and i8 [[BF_FREEZE]], -16 // CHECK4-NEXT: [[BF_SET:%.*]] = or i8 [[BF_CLEAR]], [[BF_VALUE]] // CHECK4-NEXT: store i8 [[BF_SET]], i8* [[B]], align 8 // CHECK4-NEXT: [[BF_RESULT_SHL:%.*]] = shl i8 [[BF_VALUE]], 4 @@ -4068,8 +4081,9 @@ // CHECK4-NEXT: [[DEC:%.*]] = add nsw i32 [[BF_CAST]], -1 // CHECK4-NEXT: [[TMP14:%.*]] = trunc i32 [[DEC]] to i8 // CHECK4-NEXT: [[BF_LOAD6:%.*]] = load i8, i8* [[B]], align 8 +// CHECK4-NEXT: [[BF_FREEZE:%.*]] = freeze i8 [[BF_LOAD6]] // CHECK4-NEXT: [[BF_VALUE:%.*]] = and i8 [[TMP14]], 15 -// CHECK4-NEXT: [[BF_CLEAR:%.*]] = and i8 [[BF_LOAD6]], -16 +// CHECK4-NEXT: [[BF_CLEAR:%.*]] = and i8 [[BF_FREEZE]], -16 // CHECK4-NEXT: [[BF_SET:%.*]] = or i8 [[BF_CLEAR]], [[BF_VALUE]] // CHECK4-NEXT: store i8 [[BF_SET]], i8* [[B]], align 8 // CHECK4-NEXT: [[BF_RESULT_SHL:%.*]] = shl i8 [[BF_VALUE]], 4 @@ -4654,7 +4668,8 @@ // CHECK5-NEXT: store i32 0, i32* [[A]], align 8 // CHECK5-NEXT: [[B:%.*]] = getelementptr inbounds [[STRUCT_SS]], %struct.SS* [[THIS1]], i32 0, i32 2 // CHECK5-NEXT: [[BF_LOAD:%.*]] = load i8, i8* [[B]], align 8 -// CHECK5-NEXT: [[BF_CLEAR:%.*]] = and i8 [[BF_LOAD]], -16 +// CHECK5-NEXT: [[BF_FREEZE:%.*]] = freeze i8 [[BF_LOAD]] +// CHECK5-NEXT: [[BF_CLEAR:%.*]] = and i8 [[BF_FREEZE]], -16 // CHECK5-NEXT: [[BF_SET:%.*]] = or i8 [[BF_CLEAR]], 0 // CHECK5-NEXT: store i8 [[BF_SET]], i8* [[B]], align 8 // CHECK5-NEXT: [[C:%.*]] = getelementptr inbounds [[STRUCT_SS]], %struct.SS* [[THIS1]], i32 0, i32 3 @@ -4705,15 +4720,16 @@ // CHECK5-NEXT: [[DEC:%.*]] = add nsw i32 [[BF_CAST]], -1 // CHECK5-NEXT: [[TMP11:%.*]] = trunc i32 [[DEC]] to i8 // CHECK5-NEXT: [[BF_LOAD8:%.*]] = load i8, i8* [[B6]], align 8 +// CHECK5-NEXT: [[BF_FREEZE9:%.*]] = freeze i8 [[BF_LOAD8]] // CHECK5-NEXT: [[BF_VALUE:%.*]] = and i8 [[TMP11]], 15 -// CHECK5-NEXT: [[BF_CLEAR9:%.*]] = and i8 [[BF_LOAD8]], -16 -// CHECK5-NEXT: [[BF_SET10:%.*]] = or i8 [[BF_CLEAR9]], [[BF_VALUE]] -// CHECK5-NEXT: store i8 [[BF_SET10]], i8* [[B6]], align 8 +// CHECK5-NEXT: [[BF_CLEAR10:%.*]] = and i8 [[BF_FREEZE9]], -16 +// CHECK5-NEXT: [[BF_SET11:%.*]] = or i8 [[BF_CLEAR10]], [[BF_VALUE]] +// CHECK5-NEXT: store i8 [[BF_SET11]], i8* [[B6]], align 8 // CHECK5-NEXT: [[BF_RESULT_SHL:%.*]] = shl i8 [[BF_VALUE]], 4 // CHECK5-NEXT: [[BF_RESULT_ASHR:%.*]] = ashr i8 [[BF_RESULT_SHL]], 4 // CHECK5-NEXT: [[BF_RESULT_CAST:%.*]] = sext i8 [[BF_RESULT_ASHR]] to i32 -// CHECK5-NEXT: [[C11:%.*]] = getelementptr inbounds [[STRUCT_SS]], %struct.SS* [[THIS1]], i32 0, i32 3 -// CHECK5-NEXT: [[TMP12:%.*]] = load i32*, i32** [[C11]], align 8 +// CHECK5-NEXT: [[C12:%.*]] = getelementptr inbounds [[STRUCT_SS]], %struct.SS* [[THIS1]], i32 0, i32 3 +// CHECK5-NEXT: [[TMP12:%.*]] = load i32*, i32** [[C12]], align 8 // CHECK5-NEXT: [[TMP13:%.*]] = load i32, i32* [[TMP12]], align 4 // CHECK5-NEXT: [[DIV:%.*]] = sdiv i32 [[TMP13]], 1 // CHECK5-NEXT: store i32 [[DIV]], i32* [[TMP12]], align 4 @@ -4722,8 +4738,8 @@ // CHECK5-NEXT: br label [[OMP_INNER_FOR_INC:%.*]] // CHECK5: omp.inner.for.inc: // CHECK5-NEXT: [[TMP14:%.*]] = load i32, i32* [[DOTOMP_IV]], align 4 -// CHECK5-NEXT: [[ADD12:%.*]] = add nsw i32 [[TMP14]], 1 -// CHECK5-NEXT: store i32 [[ADD12]], i32* [[DOTOMP_IV]], align 4 +// CHECK5-NEXT: [[ADD13:%.*]] = add nsw i32 [[TMP14]], 1 +// CHECK5-NEXT: store i32 [[ADD13]], i32* [[DOTOMP_IV]], align 4 // CHECK5-NEXT: br label [[OMP_INNER_FOR_COND]] // CHECK5: omp.inner.for.end: // CHECK5-NEXT: br label [[OMP_LOOP_EXIT:%.*]] @@ -4861,8 +4877,9 @@ // CHECK5-NEXT: [[B16:%.*]] = getelementptr inbounds [[STRUCT_SS]], %struct.SS* [[TMP0]], i32 0, i32 2 // CHECK5-NEXT: [[TMP35:%.*]] = trunc i32 [[TMP34]] to i8 // CHECK5-NEXT: [[BF_LOAD:%.*]] = load i8, i8* [[B16]], align 8 +// CHECK5-NEXT: [[BF_FREEZE:%.*]] = freeze i8 [[BF_LOAD]] // CHECK5-NEXT: [[BF_VALUE:%.*]] = and i8 [[TMP35]], 15 -// CHECK5-NEXT: [[BF_CLEAR:%.*]] = and i8 [[BF_LOAD]], -16 +// CHECK5-NEXT: [[BF_CLEAR:%.*]] = and i8 [[BF_FREEZE]], -16 // CHECK5-NEXT: [[BF_SET:%.*]] = or i8 [[BF_CLEAR]], [[BF_VALUE]] // CHECK5-NEXT: store i8 [[BF_SET]], i8* [[B16]], align 8 // CHECK5-NEXT: br label [[DOTOMP_LASTPRIVATE_DONE]] @@ -5849,7 +5866,8 @@ // CHECK6-NEXT: store i32 0, i32* [[A]], align 8 // CHECK6-NEXT: [[B:%.*]] = getelementptr inbounds [[STRUCT_SS]], %struct.SS* [[THIS1]], i32 0, i32 2 // CHECK6-NEXT: [[BF_LOAD:%.*]] = load i8, i8* [[B]], align 8 -// CHECK6-NEXT: [[BF_CLEAR:%.*]] = and i8 [[BF_LOAD]], -16 +// CHECK6-NEXT: [[BF_FREEZE:%.*]] = freeze i8 [[BF_LOAD]] +// CHECK6-NEXT: [[BF_CLEAR:%.*]] = and i8 [[BF_FREEZE]], -16 // CHECK6-NEXT: [[BF_SET:%.*]] = or i8 [[BF_CLEAR]], 0 // CHECK6-NEXT: store i8 [[BF_SET]], i8* [[B]], align 8 // CHECK6-NEXT: [[C:%.*]] = getelementptr inbounds [[STRUCT_SS]], %struct.SS* [[THIS1]], i32 0, i32 3 @@ -5900,15 +5918,16 @@ // CHECK6-NEXT: [[DEC:%.*]] = add nsw i32 [[BF_CAST]], -1 // CHECK6-NEXT: [[TMP11:%.*]] = trunc i32 [[DEC]] to i8 // CHECK6-NEXT: [[BF_LOAD8:%.*]] = load i8, i8* [[B6]], align 8 +// CHECK6-NEXT: [[BF_FREEZE9:%.*]] = freeze i8 [[BF_LOAD8]] // CHECK6-NEXT: [[BF_VALUE:%.*]] = and i8 [[TMP11]], 15 -// CHECK6-NEXT: [[BF_CLEAR9:%.*]] = and i8 [[BF_LOAD8]], -16 -// CHECK6-NEXT: [[BF_SET10:%.*]] = or i8 [[BF_CLEAR9]], [[BF_VALUE]] -// CHECK6-NEXT: store i8 [[BF_SET10]], i8* [[B6]], align 8 +// CHECK6-NEXT: [[BF_CLEAR10:%.*]] = and i8 [[BF_FREEZE9]], -16 +// CHECK6-NEXT: [[BF_SET11:%.*]] = or i8 [[BF_CLEAR10]], [[BF_VALUE]] +// CHECK6-NEXT: store i8 [[BF_SET11]], i8* [[B6]], align 8 // CHECK6-NEXT: [[BF_RESULT_SHL:%.*]] = shl i8 [[BF_VALUE]], 4 // CHECK6-NEXT: [[BF_RESULT_ASHR:%.*]] = ashr i8 [[BF_RESULT_SHL]], 4 // CHECK6-NEXT: [[BF_RESULT_CAST:%.*]] = sext i8 [[BF_RESULT_ASHR]] to i32 -// CHECK6-NEXT: [[C11:%.*]] = getelementptr inbounds [[STRUCT_SS]], %struct.SS* [[THIS1]], i32 0, i32 3 -// CHECK6-NEXT: [[TMP12:%.*]] = load i32*, i32** [[C11]], align 8 +// CHECK6-NEXT: [[C12:%.*]] = getelementptr inbounds [[STRUCT_SS]], %struct.SS* [[THIS1]], i32 0, i32 3 +// CHECK6-NEXT: [[TMP12:%.*]] = load i32*, i32** [[C12]], align 8 // CHECK6-NEXT: [[TMP13:%.*]] = load i32, i32* [[TMP12]], align 4 // CHECK6-NEXT: [[DIV:%.*]] = sdiv i32 [[TMP13]], 1 // CHECK6-NEXT: store i32 [[DIV]], i32* [[TMP12]], align 4 @@ -5917,8 +5936,8 @@ // CHECK6-NEXT: br label [[OMP_INNER_FOR_INC:%.*]] // CHECK6: omp.inner.for.inc: // CHECK6-NEXT: [[TMP14:%.*]] = load i32, i32* [[DOTOMP_IV]], align 4 -// CHECK6-NEXT: [[ADD12:%.*]] = add nsw i32 [[TMP14]], 1 -// CHECK6-NEXT: store i32 [[ADD12]], i32* [[DOTOMP_IV]], align 4 +// CHECK6-NEXT: [[ADD13:%.*]] = add nsw i32 [[TMP14]], 1 +// CHECK6-NEXT: store i32 [[ADD13]], i32* [[DOTOMP_IV]], align 4 // CHECK6-NEXT: br label [[OMP_INNER_FOR_COND]] // CHECK6: omp.inner.for.end: // CHECK6-NEXT: br label [[OMP_LOOP_EXIT:%.*]] @@ -6056,8 +6075,9 @@ // CHECK6-NEXT: [[B16:%.*]] = getelementptr inbounds [[STRUCT_SS]], %struct.SS* [[TMP0]], i32 0, i32 2 // CHECK6-NEXT: [[TMP35:%.*]] = trunc i32 [[TMP34]] to i8 // CHECK6-NEXT: [[BF_LOAD:%.*]] = load i8, i8* [[B16]], align 8 +// CHECK6-NEXT: [[BF_FREEZE:%.*]] = freeze i8 [[BF_LOAD]] // CHECK6-NEXT: [[BF_VALUE:%.*]] = and i8 [[TMP35]], 15 -// CHECK6-NEXT: [[BF_CLEAR:%.*]] = and i8 [[BF_LOAD]], -16 +// CHECK6-NEXT: [[BF_CLEAR:%.*]] = and i8 [[BF_FREEZE]], -16 // CHECK6-NEXT: [[BF_SET:%.*]] = or i8 [[BF_CLEAR]], [[BF_VALUE]] // CHECK6-NEXT: store i8 [[BF_SET]], i8* [[B16]], align 8 // CHECK6-NEXT: br label [[DOTOMP_LASTPRIVATE_DONE]] @@ -6535,7 +6555,8 @@ // CHECK7-NEXT: store i32 0, i32* [[A]], align 8 // CHECK7-NEXT: [[B:%.*]] = getelementptr inbounds [[STRUCT_SS]], %struct.SS* [[THIS1]], i32 0, i32 2 // CHECK7-NEXT: [[BF_LOAD:%.*]] = load i8, i8* [[B]], align 8 -// CHECK7-NEXT: [[BF_CLEAR:%.*]] = and i8 [[BF_LOAD]], -16 +// CHECK7-NEXT: [[BF_FREEZE:%.*]] = freeze i8 [[BF_LOAD]] +// CHECK7-NEXT: [[BF_CLEAR:%.*]] = and i8 [[BF_FREEZE]], -16 // CHECK7-NEXT: [[BF_SET:%.*]] = or i8 [[BF_CLEAR]], 0 // CHECK7-NEXT: store i8 [[BF_SET]], i8* [[B]], align 8 // CHECK7-NEXT: [[C:%.*]] = getelementptr inbounds [[STRUCT_SS]], %struct.SS* [[THIS1]], i32 0, i32 3 @@ -6725,8 +6746,9 @@ // CHECK7-NEXT: [[B16:%.*]] = getelementptr inbounds [[STRUCT_SS]], %struct.SS* [[TMP0]], i32 0, i32 2 // CHECK7-NEXT: [[TMP36:%.*]] = trunc i32 [[TMP35]] to i8 // CHECK7-NEXT: [[BF_LOAD:%.*]] = load i8, i8* [[B16]], align 8 +// CHECK7-NEXT: [[BF_FREEZE:%.*]] = freeze i8 [[BF_LOAD]] // CHECK7-NEXT: [[BF_VALUE:%.*]] = and i8 [[TMP36]], 15 -// CHECK7-NEXT: [[BF_CLEAR:%.*]] = and i8 [[BF_LOAD]], -16 +// CHECK7-NEXT: [[BF_CLEAR:%.*]] = and i8 [[BF_FREEZE]], -16 // CHECK7-NEXT: [[BF_SET:%.*]] = or i8 [[BF_CLEAR]], [[BF_VALUE]] // CHECK7-NEXT: store i8 [[BF_SET]], i8* [[B16]], align 8 // CHECK7-NEXT: br label [[DOTOMP_LASTPRIVATE_DONE]] @@ -6789,8 +6811,9 @@ // CHECK7-NEXT: [[INC:%.*]] = add nsw i32 [[BF_CAST]], 1 // CHECK7-NEXT: [[TMP5:%.*]] = trunc i32 [[INC]] to i8 // CHECK7-NEXT: [[BF_LOAD2:%.*]] = load i8, i8* [[B]], align 8 +// CHECK7-NEXT: [[BF_FREEZE:%.*]] = freeze i8 [[BF_LOAD2]] // CHECK7-NEXT: [[BF_VALUE:%.*]] = and i8 [[TMP5]], 15 -// CHECK7-NEXT: [[BF_CLEAR:%.*]] = and i8 [[BF_LOAD2]], -16 +// CHECK7-NEXT: [[BF_CLEAR:%.*]] = and i8 [[BF_FREEZE]], -16 // CHECK7-NEXT: [[BF_SET:%.*]] = or i8 [[BF_CLEAR]], [[BF_VALUE]] // CHECK7-NEXT: store i8 [[BF_SET]], i8* [[B]], align 8 // CHECK7-NEXT: [[BF_RESULT_SHL:%.*]] = shl i8 [[BF_VALUE]], 4 @@ -7017,8 +7040,9 @@ // CHECK7-NEXT: [[B7:%.*]] = getelementptr inbounds [[STRUCT_SS]], %struct.SS* [[TMP0]], i32 0, i32 2 // CHECK7-NEXT: [[TMP21:%.*]] = trunc i32 [[TMP20]] to i8 // CHECK7-NEXT: [[BF_LOAD:%.*]] = load i8, i8* [[B7]], align 8 +// CHECK7-NEXT: [[BF_FREEZE:%.*]] = freeze i8 [[BF_LOAD]] // CHECK7-NEXT: [[BF_VALUE:%.*]] = and i8 [[TMP21]], 15 -// CHECK7-NEXT: [[BF_CLEAR:%.*]] = and i8 [[BF_LOAD]], -16 +// CHECK7-NEXT: [[BF_CLEAR:%.*]] = and i8 [[BF_FREEZE]], -16 // CHECK7-NEXT: [[BF_SET:%.*]] = or i8 [[BF_CLEAR]], [[BF_VALUE]] // CHECK7-NEXT: store i8 [[BF_SET]], i8* [[B7]], align 8 // CHECK7-NEXT: br label [[DOTOMP_LASTPRIVATE_DONE]] @@ -7343,7 +7367,8 @@ // CHECK8-NEXT: store i32 0, i32* [[A]], align 8 // CHECK8-NEXT: [[B:%.*]] = getelementptr inbounds [[STRUCT_SS]], %struct.SS* [[THIS1]], i32 0, i32 2 // CHECK8-NEXT: [[BF_LOAD:%.*]] = load i8, i8* [[B]], align 8 -// CHECK8-NEXT: [[BF_CLEAR:%.*]] = and i8 [[BF_LOAD]], -16 +// CHECK8-NEXT: [[BF_FREEZE:%.*]] = freeze i8 [[BF_LOAD]] +// CHECK8-NEXT: [[BF_CLEAR:%.*]] = and i8 [[BF_FREEZE]], -16 // CHECK8-NEXT: [[BF_SET:%.*]] = or i8 [[BF_CLEAR]], 0 // CHECK8-NEXT: store i8 [[BF_SET]], i8* [[B]], align 8 // CHECK8-NEXT: [[C:%.*]] = getelementptr inbounds [[STRUCT_SS]], %struct.SS* [[THIS1]], i32 0, i32 3 @@ -7566,8 +7591,9 @@ // CHECK8-NEXT: [[B18:%.*]] = getelementptr inbounds [[STRUCT_SS]], %struct.SS* [[TMP0]], i32 0, i32 2 // CHECK8-NEXT: [[TMP38:%.*]] = trunc i32 [[TMP37]] to i8 // CHECK8-NEXT: [[BF_LOAD:%.*]] = load i8, i8* [[B18]], align 8 +// CHECK8-NEXT: [[BF_FREEZE:%.*]] = freeze i8 [[BF_LOAD]] // CHECK8-NEXT: [[BF_VALUE:%.*]] = and i8 [[TMP38]], 15 -// CHECK8-NEXT: [[BF_CLEAR:%.*]] = and i8 [[BF_LOAD]], -16 +// CHECK8-NEXT: [[BF_CLEAR:%.*]] = and i8 [[BF_FREEZE]], -16 // CHECK8-NEXT: [[BF_SET:%.*]] = or i8 [[BF_CLEAR]], [[BF_VALUE]] // CHECK8-NEXT: store i8 [[BF_SET]], i8* [[B18]], align 8 // CHECK8-NEXT: br label [[DOTOMP_LASTPRIVATE_DONE]] @@ -7749,8 +7775,9 @@ // CHECK8-NEXT: [[DEC:%.*]] = add nsw i32 [[BF_CAST]], -1 // CHECK8-NEXT: [[TMP2:%.*]] = trunc i32 [[DEC]] to i8 // CHECK8-NEXT: [[BF_LOAD1:%.*]] = load i8, i8* [[B]], align 8 +// CHECK8-NEXT: [[BF_FREEZE:%.*]] = freeze i8 [[BF_LOAD1]] // CHECK8-NEXT: [[BF_VALUE:%.*]] = and i8 [[TMP2]], 15 -// CHECK8-NEXT: [[BF_CLEAR:%.*]] = and i8 [[BF_LOAD1]], -16 +// CHECK8-NEXT: [[BF_CLEAR:%.*]] = and i8 [[BF_FREEZE]], -16 // CHECK8-NEXT: [[BF_SET:%.*]] = or i8 [[BF_CLEAR]], [[BF_VALUE]] // CHECK8-NEXT: store i8 [[BF_SET]], i8* [[B]], align 8 // CHECK8-NEXT: [[BF_RESULT_SHL:%.*]] = shl i8 [[BF_VALUE]], 4 @@ -7840,8 +7867,9 @@ // CHECK8-NEXT: [[DEC:%.*]] = add nsw i32 [[BF_CAST]], -1 // CHECK8-NEXT: [[TMP14:%.*]] = trunc i32 [[DEC]] to i8 // CHECK8-NEXT: [[BF_LOAD6:%.*]] = load i8, i8* [[B]], align 8 +// CHECK8-NEXT: [[BF_FREEZE:%.*]] = freeze i8 [[BF_LOAD6]] // CHECK8-NEXT: [[BF_VALUE:%.*]] = and i8 [[TMP14]], 15 -// CHECK8-NEXT: [[BF_CLEAR:%.*]] = and i8 [[BF_LOAD6]], -16 +// CHECK8-NEXT: [[BF_CLEAR:%.*]] = and i8 [[BF_FREEZE]], -16 // CHECK8-NEXT: [[BF_SET:%.*]] = or i8 [[BF_CLEAR]], [[BF_VALUE]] // CHECK8-NEXT: store i8 [[BF_SET]], i8* [[B]], align 8 // CHECK8-NEXT: [[BF_RESULT_SHL:%.*]] = shl i8 [[BF_VALUE]], 4 diff --git a/clang/test/OpenMP/for_linear_codegen.cpp b/clang/test/OpenMP/for_linear_codegen.cpp --- a/clang/test/OpenMP/for_linear_codegen.cpp +++ b/clang/test/OpenMP/for_linear_codegen.cpp @@ -379,7 +379,8 @@ // CHECK1-NEXT: store i32 0, i32* [[A]], align 8 // CHECK1-NEXT: [[B:%.*]] = getelementptr inbounds [[STRUCT_SS]], %struct.SS* [[THIS1]], i32 0, i32 1 // CHECK1-NEXT: [[BF_LOAD:%.*]] = load i8, i8* [[B]], align 4 -// CHECK1-NEXT: [[BF_CLEAR:%.*]] = and i8 [[BF_LOAD]], -16 +// CHECK1-NEXT: [[BF_FREEZE:%.*]] = freeze i8 [[BF_LOAD]] +// CHECK1-NEXT: [[BF_CLEAR:%.*]] = and i8 [[BF_FREEZE]], -16 // CHECK1-NEXT: [[BF_SET:%.*]] = or i8 [[BF_CLEAR]], 0 // CHECK1-NEXT: store i8 [[BF_SET]], i8* [[B]], align 4 // CHECK1-NEXT: [[C:%.*]] = getelementptr inbounds [[STRUCT_SS]], %struct.SS* [[THIS1]], i32 0, i32 2 @@ -530,8 +531,9 @@ // CHECK1-NEXT: [[B22:%.*]] = getelementptr inbounds [[STRUCT_SS]], %struct.SS* [[TMP0]], i32 0, i32 1 // CHECK1-NEXT: [[TMP39:%.*]] = trunc i32 [[TMP38]] to i8 // CHECK1-NEXT: [[BF_LOAD:%.*]] = load i8, i8* [[B22]], align 4 +// CHECK1-NEXT: [[BF_FREEZE:%.*]] = freeze i8 [[BF_LOAD]] // CHECK1-NEXT: [[BF_VALUE:%.*]] = and i8 [[TMP39]], 15 -// CHECK1-NEXT: [[BF_CLEAR:%.*]] = and i8 [[BF_LOAD]], -16 +// CHECK1-NEXT: [[BF_CLEAR:%.*]] = and i8 [[BF_FREEZE]], -16 // CHECK1-NEXT: [[BF_SET:%.*]] = or i8 [[BF_CLEAR]], [[BF_VALUE]] // CHECK1-NEXT: store i8 [[BF_SET]], i8* [[B22]], align 4 // CHECK1-NEXT: br label [[DOTOMP_LINEAR_PU_DONE]] @@ -1032,7 +1034,8 @@ // CHECK2-NEXT: store i32 0, i32* [[A]], align 8 // CHECK2-NEXT: [[B:%.*]] = getelementptr inbounds [[STRUCT_SS]], %struct.SS* [[THIS1]], i32 0, i32 1 // CHECK2-NEXT: [[BF_LOAD:%.*]] = load i8, i8* [[B]], align 4 -// CHECK2-NEXT: [[BF_CLEAR:%.*]] = and i8 [[BF_LOAD]], -16 +// CHECK2-NEXT: [[BF_FREEZE:%.*]] = freeze i8 [[BF_LOAD]] +// CHECK2-NEXT: [[BF_CLEAR:%.*]] = and i8 [[BF_FREEZE]], -16 // CHECK2-NEXT: [[BF_SET:%.*]] = or i8 [[BF_CLEAR]], 0 // CHECK2-NEXT: store i8 [[BF_SET]], i8* [[B]], align 4 // CHECK2-NEXT: [[C:%.*]] = getelementptr inbounds [[STRUCT_SS]], %struct.SS* [[THIS1]], i32 0, i32 2 @@ -1183,8 +1186,9 @@ // CHECK2-NEXT: [[B22:%.*]] = getelementptr inbounds [[STRUCT_SS]], %struct.SS* [[TMP0]], i32 0, i32 1 // CHECK2-NEXT: [[TMP39:%.*]] = trunc i32 [[TMP38]] to i8 // CHECK2-NEXT: [[BF_LOAD:%.*]] = load i8, i8* [[B22]], align 4 +// CHECK2-NEXT: [[BF_FREEZE:%.*]] = freeze i8 [[BF_LOAD]] // CHECK2-NEXT: [[BF_VALUE:%.*]] = and i8 [[TMP39]], 15 -// CHECK2-NEXT: [[BF_CLEAR:%.*]] = and i8 [[BF_LOAD]], -16 +// CHECK2-NEXT: [[BF_CLEAR:%.*]] = and i8 [[BF_FREEZE]], -16 // CHECK2-NEXT: [[BF_SET:%.*]] = or i8 [[BF_CLEAR]], [[BF_VALUE]] // CHECK2-NEXT: store i8 [[BF_SET]], i8* [[B22]], align 4 // CHECK2-NEXT: br label [[DOTOMP_LINEAR_PU_DONE]] @@ -1527,7 +1531,8 @@ // CHECK3-NEXT: store i32 0, i32* [[A]], align 8 // CHECK3-NEXT: [[B:%.*]] = getelementptr inbounds [[STRUCT_SS]], %struct.SS* [[THIS1]], i32 0, i32 1 // CHECK3-NEXT: [[BF_LOAD:%.*]] = load i8, i8* [[B]], align 4 -// CHECK3-NEXT: [[BF_CLEAR:%.*]] = and i8 [[BF_LOAD]], -16 +// CHECK3-NEXT: [[BF_FREEZE:%.*]] = freeze i8 [[BF_LOAD]] +// CHECK3-NEXT: [[BF_CLEAR:%.*]] = and i8 [[BF_FREEZE]], -16 // CHECK3-NEXT: [[BF_SET:%.*]] = or i8 [[BF_CLEAR]], 0 // CHECK3-NEXT: store i8 [[BF_SET]], i8* [[B]], align 4 // CHECK3-NEXT: [[C:%.*]] = getelementptr inbounds [[STRUCT_SS]], %struct.SS* [[THIS1]], i32 0, i32 2 @@ -1679,8 +1684,9 @@ // CHECK3-NEXT: [[B22:%.*]] = getelementptr inbounds [[STRUCT_SS]], %struct.SS* [[TMP0]], i32 0, i32 1 // CHECK3-NEXT: [[TMP40:%.*]] = trunc i32 [[TMP39]] to i8 // CHECK3-NEXT: [[BF_LOAD:%.*]] = load i8, i8* [[B22]], align 4 +// CHECK3-NEXT: [[BF_FREEZE:%.*]] = freeze i8 [[BF_LOAD]] // CHECK3-NEXT: [[BF_VALUE:%.*]] = and i8 [[TMP40]], 15 -// CHECK3-NEXT: [[BF_CLEAR:%.*]] = and i8 [[BF_LOAD]], -16 +// CHECK3-NEXT: [[BF_CLEAR:%.*]] = and i8 [[BF_FREEZE]], -16 // CHECK3-NEXT: [[BF_SET:%.*]] = or i8 [[BF_CLEAR]], [[BF_VALUE]] // CHECK3-NEXT: store i8 [[BF_SET]], i8* [[B22]], align 4 // CHECK3-NEXT: br label [[DOTOMP_LINEAR_PU_DONE]] @@ -2182,7 +2188,8 @@ // CHECK4-NEXT: store i32 0, i32* [[A]], align 8 // CHECK4-NEXT: [[B:%.*]] = getelementptr inbounds [[STRUCT_SS]], %struct.SS* [[THIS1]], i32 0, i32 1 // CHECK4-NEXT: [[BF_LOAD:%.*]] = load i8, i8* [[B]], align 4 -// CHECK4-NEXT: [[BF_CLEAR:%.*]] = and i8 [[BF_LOAD]], -16 +// CHECK4-NEXT: [[BF_FREEZE:%.*]] = freeze i8 [[BF_LOAD]] +// CHECK4-NEXT: [[BF_CLEAR:%.*]] = and i8 [[BF_FREEZE]], -16 // CHECK4-NEXT: [[BF_SET:%.*]] = or i8 [[BF_CLEAR]], 0 // CHECK4-NEXT: store i8 [[BF_SET]], i8* [[B]], align 4 // CHECK4-NEXT: [[C:%.*]] = getelementptr inbounds [[STRUCT_SS]], %struct.SS* [[THIS1]], i32 0, i32 2 @@ -2351,8 +2358,9 @@ // CHECK4-NEXT: [[B24:%.*]] = getelementptr inbounds [[STRUCT_SS]], %struct.SS* [[TMP0]], i32 0, i32 1 // CHECK4-NEXT: [[TMP42:%.*]] = trunc i32 [[TMP41]] to i8 // CHECK4-NEXT: [[BF_LOAD:%.*]] = load i8, i8* [[B24]], align 4 +// CHECK4-NEXT: [[BF_FREEZE:%.*]] = freeze i8 [[BF_LOAD]] // CHECK4-NEXT: [[BF_VALUE:%.*]] = and i8 [[TMP42]], 15 -// CHECK4-NEXT: [[BF_CLEAR:%.*]] = and i8 [[BF_LOAD]], -16 +// CHECK4-NEXT: [[BF_CLEAR:%.*]] = and i8 [[BF_FREEZE]], -16 // CHECK4-NEXT: [[BF_SET:%.*]] = or i8 [[BF_CLEAR]], [[BF_VALUE]] // CHECK4-NEXT: store i8 [[BF_SET]], i8* [[B24]], align 4 // CHECK4-NEXT: br label [[DOTOMP_LINEAR_PU_DONE]] diff --git a/clang/test/OpenMP/parallel_firstprivate_codegen.cpp b/clang/test/OpenMP/parallel_firstprivate_codegen.cpp --- a/clang/test/OpenMP/parallel_firstprivate_codegen.cpp +++ b/clang/test/OpenMP/parallel_firstprivate_codegen.cpp @@ -521,7 +521,8 @@ // CHECK1-NEXT: store i32 0, i32* [[A]], align 4 // CHECK1-NEXT: [[B:%.*]] = getelementptr inbounds [[STRUCT_SS]], %struct.SS* [[THIS1]], i32 0, i32 1 // CHECK1-NEXT: [[BF_LOAD:%.*]] = load i8, i8* [[B]], align 4 -// CHECK1-NEXT: [[BF_CLEAR:%.*]] = and i8 [[BF_LOAD]], -16 +// CHECK1-NEXT: [[BF_FREEZE:%.*]] = freeze i8 [[BF_LOAD]] +// CHECK1-NEXT: [[BF_CLEAR:%.*]] = and i8 [[BF_FREEZE]], -16 // CHECK1-NEXT: [[BF_SET:%.*]] = or i8 [[BF_CLEAR]], 0 // CHECK1-NEXT: store i8 [[BF_SET]], i8* [[B]], align 4 // CHECK1-NEXT: [[C:%.*]] = getelementptr inbounds [[STRUCT_SS]], %struct.SS* [[THIS1]], i32 0, i32 2 @@ -1207,7 +1208,8 @@ // CHECK2-NEXT: store i32 0, i32* [[A]], align 4 // CHECK2-NEXT: [[B:%.*]] = getelementptr inbounds [[STRUCT_SS]], %struct.SS* [[THIS1]], i32 0, i32 1 // CHECK2-NEXT: [[BF_LOAD:%.*]] = load i8, i8* [[B]], align 4 -// CHECK2-NEXT: [[BF_CLEAR:%.*]] = and i8 [[BF_LOAD]], -16 +// CHECK2-NEXT: [[BF_FREEZE:%.*]] = freeze i8 [[BF_LOAD]] +// CHECK2-NEXT: [[BF_CLEAR:%.*]] = and i8 [[BF_FREEZE]], -16 // CHECK2-NEXT: [[BF_SET:%.*]] = or i8 [[BF_CLEAR]], 0 // CHECK2-NEXT: store i8 [[BF_SET]], i8* [[B]], align 4 // CHECK2-NEXT: [[C:%.*]] = getelementptr inbounds [[STRUCT_SS]], %struct.SS* [[THIS1]], i32 0, i32 2 @@ -1657,7 +1659,8 @@ // CHECK3-NEXT: store i32 0, i32* [[A]], align 4 // CHECK3-NEXT: [[B:%.*]] = getelementptr inbounds [[STRUCT_SS]], %struct.SS* [[THIS1]], i32 0, i32 1 // CHECK3-NEXT: [[BF_LOAD:%.*]] = load i8, i8* [[B]], align 4 -// CHECK3-NEXT: [[BF_CLEAR:%.*]] = and i8 [[BF_LOAD]], -16 +// CHECK3-NEXT: [[BF_FREEZE:%.*]] = freeze i8 [[BF_LOAD]] +// CHECK3-NEXT: [[BF_CLEAR:%.*]] = and i8 [[BF_FREEZE]], -16 // CHECK3-NEXT: [[BF_SET:%.*]] = or i8 [[BF_CLEAR]], 0 // CHECK3-NEXT: store i8 [[BF_SET]], i8* [[B]], align 4 // CHECK3-NEXT: [[C:%.*]] = getelementptr inbounds [[STRUCT_SS]], %struct.SS* [[THIS1]], i32 0, i32 2 @@ -1982,7 +1985,8 @@ // CHECK4-NEXT: store i32 0, i32* [[A]], align 4 // CHECK4-NEXT: [[B:%.*]] = getelementptr inbounds [[STRUCT_SS]], %struct.SS* [[THIS1]], i32 0, i32 1 // CHECK4-NEXT: [[BF_LOAD:%.*]] = load i8, i8* [[B]], align 4 -// CHECK4-NEXT: [[BF_CLEAR:%.*]] = and i8 [[BF_LOAD]], -16 +// CHECK4-NEXT: [[BF_FREEZE:%.*]] = freeze i8 [[BF_LOAD]] +// CHECK4-NEXT: [[BF_CLEAR:%.*]] = and i8 [[BF_FREEZE]], -16 // CHECK4-NEXT: [[BF_SET:%.*]] = or i8 [[BF_CLEAR]], 0 // CHECK4-NEXT: store i8 [[BF_SET]], i8* [[B]], align 4 // CHECK4-NEXT: [[C:%.*]] = getelementptr inbounds [[STRUCT_SS]], %struct.SS* [[THIS1]], i32 0, i32 2 @@ -2448,7 +2452,8 @@ // CHECK9-NEXT: store i32 0, i32* [[A]], align 8 // CHECK9-NEXT: [[B:%.*]] = getelementptr inbounds [[STRUCT_SS]], %struct.SS* [[THIS1]], i32 0, i32 1 // CHECK9-NEXT: [[BF_LOAD:%.*]] = load i8, i8* [[B]], align 4 -// CHECK9-NEXT: [[BF_CLEAR:%.*]] = and i8 [[BF_LOAD]], -16 +// CHECK9-NEXT: [[BF_FREEZE:%.*]] = freeze i8 [[BF_LOAD]] +// CHECK9-NEXT: [[BF_CLEAR:%.*]] = and i8 [[BF_FREEZE]], -16 // CHECK9-NEXT: [[BF_SET:%.*]] = or i8 [[BF_CLEAR]], 0 // CHECK9-NEXT: store i8 [[BF_SET]], i8* [[B]], align 4 // CHECK9-NEXT: [[C:%.*]] = getelementptr inbounds [[STRUCT_SS]], %struct.SS* [[THIS1]], i32 0, i32 2 @@ -3148,7 +3153,8 @@ // CHECK10-NEXT: store i32 0, i32* [[A]], align 8 // CHECK10-NEXT: [[B:%.*]] = getelementptr inbounds [[STRUCT_SS]], %struct.SS* [[THIS1]], i32 0, i32 1 // CHECK10-NEXT: [[BF_LOAD:%.*]] = load i8, i8* [[B]], align 4 -// CHECK10-NEXT: [[BF_CLEAR:%.*]] = and i8 [[BF_LOAD]], -16 +// CHECK10-NEXT: [[BF_FREEZE:%.*]] = freeze i8 [[BF_LOAD]] +// CHECK10-NEXT: [[BF_CLEAR:%.*]] = and i8 [[BF_FREEZE]], -16 // CHECK10-NEXT: [[BF_SET:%.*]] = or i8 [[BF_CLEAR]], 0 // CHECK10-NEXT: store i8 [[BF_SET]], i8* [[B]], align 4 // CHECK10-NEXT: [[C:%.*]] = getelementptr inbounds [[STRUCT_SS]], %struct.SS* [[THIS1]], i32 0, i32 2 @@ -3606,7 +3612,8 @@ // CHECK11-NEXT: store i32 0, i32* [[A]], align 8 // CHECK11-NEXT: [[B:%.*]] = getelementptr inbounds [[STRUCT_SS]], %struct.SS* [[THIS1]], i32 0, i32 1 // CHECK11-NEXT: [[BF_LOAD:%.*]] = load i8, i8* [[B]], align 4 -// CHECK11-NEXT: [[BF_CLEAR:%.*]] = and i8 [[BF_LOAD]], -16 +// CHECK11-NEXT: [[BF_FREEZE:%.*]] = freeze i8 [[BF_LOAD]] +// CHECK11-NEXT: [[BF_CLEAR:%.*]] = and i8 [[BF_FREEZE]], -16 // CHECK11-NEXT: [[BF_SET:%.*]] = or i8 [[BF_CLEAR]], 0 // CHECK11-NEXT: store i8 [[BF_SET]], i8* [[B]], align 4 // CHECK11-NEXT: [[C:%.*]] = getelementptr inbounds [[STRUCT_SS]], %struct.SS* [[THIS1]], i32 0, i32 2 @@ -3946,7 +3953,8 @@ // CHECK12-NEXT: store i32 0, i32* [[A]], align 8 // CHECK12-NEXT: [[B:%.*]] = getelementptr inbounds [[STRUCT_SS]], %struct.SS* [[THIS1]], i32 0, i32 1 // CHECK12-NEXT: [[BF_LOAD:%.*]] = load i8, i8* [[B]], align 4 -// CHECK12-NEXT: [[BF_CLEAR:%.*]] = and i8 [[BF_LOAD]], -16 +// CHECK12-NEXT: [[BF_FREEZE:%.*]] = freeze i8 [[BF_LOAD]] +// CHECK12-NEXT: [[BF_CLEAR:%.*]] = and i8 [[BF_FREEZE]], -16 // CHECK12-NEXT: [[BF_SET:%.*]] = or i8 [[BF_CLEAR]], 0 // CHECK12-NEXT: store i8 [[BF_SET]], i8* [[B]], align 4 // CHECK12-NEXT: [[C:%.*]] = getelementptr inbounds [[STRUCT_SS]], %struct.SS* [[THIS1]], i32 0, i32 2 diff --git a/clang/test/OpenMP/parallel_private_codegen.cpp b/clang/test/OpenMP/parallel_private_codegen.cpp --- a/clang/test/OpenMP/parallel_private_codegen.cpp +++ b/clang/test/OpenMP/parallel_private_codegen.cpp @@ -348,7 +348,8 @@ // CHECK1-NEXT: store i32 0, i32* [[A]], align 8 // CHECK1-NEXT: [[B:%.*]] = getelementptr inbounds [[STRUCT_SS]], %struct.SS* [[THIS1]], i32 0, i32 1 // CHECK1-NEXT: [[BF_LOAD:%.*]] = load i8, i8* [[B]], align 4 -// CHECK1-NEXT: [[BF_CLEAR:%.*]] = and i8 [[BF_LOAD]], -16 +// CHECK1-NEXT: [[BF_FREEZE:%.*]] = freeze i8 [[BF_LOAD]] +// CHECK1-NEXT: [[BF_CLEAR:%.*]] = and i8 [[BF_FREEZE]], -16 // CHECK1-NEXT: [[BF_SET:%.*]] = or i8 [[BF_CLEAR]], 0 // CHECK1-NEXT: store i8 [[BF_SET]], i8* [[B]], align 4 // CHECK1-NEXT: [[C:%.*]] = getelementptr inbounds [[STRUCT_SS]], %struct.SS* [[THIS1]], i32 0, i32 2 @@ -761,7 +762,8 @@ // CHECK2-NEXT: store i32 0, i32* [[A]], align 8 // CHECK2-NEXT: [[B:%.*]] = getelementptr inbounds [[STRUCT_SS]], %struct.SS* [[THIS1]], i32 0, i32 1 // CHECK2-NEXT: [[BF_LOAD:%.*]] = load i8, i8* [[B]], align 4 -// CHECK2-NEXT: [[BF_CLEAR:%.*]] = and i8 [[BF_LOAD]], -16 +// CHECK2-NEXT: [[BF_FREEZE:%.*]] = freeze i8 [[BF_LOAD]] +// CHECK2-NEXT: [[BF_CLEAR:%.*]] = and i8 [[BF_FREEZE]], -16 // CHECK2-NEXT: [[BF_SET:%.*]] = or i8 [[BF_CLEAR]], 0 // CHECK2-NEXT: store i8 [[BF_SET]], i8* [[B]], align 4 // CHECK2-NEXT: [[C:%.*]] = getelementptr inbounds [[STRUCT_SS]], %struct.SS* [[THIS1]], i32 0, i32 2 @@ -1030,7 +1032,8 @@ // CHECK3-NEXT: store i32 0, i32* [[A]], align 8 // CHECK3-NEXT: [[B:%.*]] = getelementptr inbounds [[STRUCT_SS]], %struct.SS* [[THIS1]], i32 0, i32 1 // CHECK3-NEXT: [[BF_LOAD:%.*]] = load i8, i8* [[B]], align 4 -// CHECK3-NEXT: [[BF_CLEAR:%.*]] = and i8 [[BF_LOAD]], -16 +// CHECK3-NEXT: [[BF_FREEZE:%.*]] = freeze i8 [[BF_LOAD]] +// CHECK3-NEXT: [[BF_CLEAR:%.*]] = and i8 [[BF_FREEZE]], -16 // CHECK3-NEXT: [[BF_SET:%.*]] = or i8 [[BF_CLEAR]], 0 // CHECK3-NEXT: store i8 [[BF_SET]], i8* [[B]], align 4 // CHECK3-NEXT: [[C:%.*]] = getelementptr inbounds [[STRUCT_SS]], %struct.SS* [[THIS1]], i32 0, i32 2 @@ -1253,7 +1256,8 @@ // CHECK4-NEXT: store i32 0, i32* [[A]], align 8 // CHECK4-NEXT: [[B:%.*]] = getelementptr inbounds [[STRUCT_SS]], %struct.SS* [[THIS1]], i32 0, i32 1 // CHECK4-NEXT: [[BF_LOAD:%.*]] = load i8, i8* [[B]], align 4 -// CHECK4-NEXT: [[BF_CLEAR:%.*]] = and i8 [[BF_LOAD]], -16 +// CHECK4-NEXT: [[BF_FREEZE:%.*]] = freeze i8 [[BF_LOAD]] +// CHECK4-NEXT: [[BF_CLEAR:%.*]] = and i8 [[BF_FREEZE]], -16 // CHECK4-NEXT: [[BF_SET:%.*]] = or i8 [[BF_CLEAR]], 0 // CHECK4-NEXT: store i8 [[BF_SET]], i8* [[B]], align 4 // CHECK4-NEXT: [[C:%.*]] = getelementptr inbounds [[STRUCT_SS]], %struct.SS* [[THIS1]], i32 0, i32 2 diff --git a/clang/test/OpenMP/parallel_reduction_codegen.cpp b/clang/test/OpenMP/parallel_reduction_codegen.cpp --- a/clang/test/OpenMP/parallel_reduction_codegen.cpp +++ b/clang/test/OpenMP/parallel_reduction_codegen.cpp @@ -1090,7 +1090,8 @@ // CHECK1-NEXT: store i32 0, i32* [[A]], align 8 // CHECK1-NEXT: [[B:%.*]] = getelementptr inbounds [[STRUCT_SS]], %struct.SS* [[THIS1]], i32 0, i32 1 // CHECK1-NEXT: [[BF_LOAD:%.*]] = load i8, i8* [[B]], align 4 -// CHECK1-NEXT: [[BF_CLEAR:%.*]] = and i8 [[BF_LOAD]], -16 +// CHECK1-NEXT: [[BF_FREEZE:%.*]] = freeze i8 [[BF_LOAD]] +// CHECK1-NEXT: [[BF_CLEAR:%.*]] = and i8 [[BF_FREEZE]], -16 // CHECK1-NEXT: [[BF_SET:%.*]] = or i8 [[BF_CLEAR]], 0 // CHECK1-NEXT: store i8 [[BF_SET]], i8* [[B]], align 4 // CHECK1-NEXT: [[C:%.*]] = getelementptr inbounds [[STRUCT_SS]], %struct.SS* [[THIS1]], i32 0, i32 2 @@ -1108,10 +1109,11 @@ // CHECK1-NEXT: [[B7:%.*]] = getelementptr inbounds [[STRUCT_SS]], %struct.SS* [[THIS1]], i32 0, i32 1 // CHECK1-NEXT: [[TMP5:%.*]] = trunc i32 [[TMP4]] to i8 // CHECK1-NEXT: [[BF_LOAD8:%.*]] = load i8, i8* [[B7]], align 4 +// CHECK1-NEXT: [[BF_FREEZE9:%.*]] = freeze i8 [[BF_LOAD8]] // CHECK1-NEXT: [[BF_VALUE:%.*]] = and i8 [[TMP5]], 15 -// CHECK1-NEXT: [[BF_CLEAR9:%.*]] = and i8 [[BF_LOAD8]], -16 -// CHECK1-NEXT: [[BF_SET10:%.*]] = or i8 [[BF_CLEAR9]], [[BF_VALUE]] -// CHECK1-NEXT: store i8 [[BF_SET10]], i8* [[B7]], align 4 +// CHECK1-NEXT: [[BF_CLEAR10:%.*]] = and i8 [[BF_FREEZE9]], -16 +// CHECK1-NEXT: [[BF_SET11:%.*]] = or i8 [[BF_CLEAR10]], [[BF_VALUE]] +// CHECK1-NEXT: store i8 [[BF_SET11]], i8* [[B7]], align 4 // CHECK1-NEXT: ret void // // @@ -2470,7 +2472,8 @@ // CHECK2-NEXT: store i32 0, i32* [[A]], align 8 // CHECK2-NEXT: [[B:%.*]] = getelementptr inbounds [[STRUCT_SS]], %struct.SS* [[THIS1]], i32 0, i32 1 // CHECK2-NEXT: [[BF_LOAD:%.*]] = load i8, i8* [[B]], align 4 -// CHECK2-NEXT: [[BF_CLEAR:%.*]] = and i8 [[BF_LOAD]], -16 +// CHECK2-NEXT: [[BF_FREEZE:%.*]] = freeze i8 [[BF_LOAD]] +// CHECK2-NEXT: [[BF_CLEAR:%.*]] = and i8 [[BF_FREEZE]], -16 // CHECK2-NEXT: [[BF_SET:%.*]] = or i8 [[BF_CLEAR]], 0 // CHECK2-NEXT: store i8 [[BF_SET]], i8* [[B]], align 4 // CHECK2-NEXT: [[C:%.*]] = getelementptr inbounds [[STRUCT_SS]], %struct.SS* [[THIS1]], i32 0, i32 2 @@ -2488,10 +2491,11 @@ // CHECK2-NEXT: [[B7:%.*]] = getelementptr inbounds [[STRUCT_SS]], %struct.SS* [[THIS1]], i32 0, i32 1 // CHECK2-NEXT: [[TMP5:%.*]] = trunc i32 [[TMP4]] to i8 // CHECK2-NEXT: [[BF_LOAD8:%.*]] = load i8, i8* [[B7]], align 4 +// CHECK2-NEXT: [[BF_FREEZE9:%.*]] = freeze i8 [[BF_LOAD8]] // CHECK2-NEXT: [[BF_VALUE:%.*]] = and i8 [[TMP5]], 15 -// CHECK2-NEXT: [[BF_CLEAR9:%.*]] = and i8 [[BF_LOAD8]], -16 -// CHECK2-NEXT: [[BF_SET10:%.*]] = or i8 [[BF_CLEAR9]], [[BF_VALUE]] -// CHECK2-NEXT: store i8 [[BF_SET10]], i8* [[B7]], align 4 +// CHECK2-NEXT: [[BF_CLEAR10:%.*]] = and i8 [[BF_FREEZE9]], -16 +// CHECK2-NEXT: [[BF_SET11:%.*]] = or i8 [[BF_CLEAR10]], [[BF_VALUE]] +// CHECK2-NEXT: store i8 [[BF_SET11]], i8* [[B7]], align 4 // CHECK2-NEXT: ret void // // @@ -3299,7 +3303,8 @@ // CHECK3-NEXT: store i32 0, i32* [[A]], align 8 // CHECK3-NEXT: [[B:%.*]] = getelementptr inbounds [[STRUCT_SS]], %struct.SS* [[THIS1]], i32 0, i32 1 // CHECK3-NEXT: [[BF_LOAD:%.*]] = load i8, i8* [[B]], align 4 -// CHECK3-NEXT: [[BF_CLEAR:%.*]] = and i8 [[BF_LOAD]], -16 +// CHECK3-NEXT: [[BF_FREEZE:%.*]] = freeze i8 [[BF_LOAD]] +// CHECK3-NEXT: [[BF_CLEAR:%.*]] = and i8 [[BF_FREEZE]], -16 // CHECK3-NEXT: [[BF_SET:%.*]] = or i8 [[BF_CLEAR]], 0 // CHECK3-NEXT: store i8 [[BF_SET]], i8* [[B]], align 4 // CHECK3-NEXT: [[C:%.*]] = getelementptr inbounds [[STRUCT_SS]], %struct.SS* [[THIS1]], i32 0, i32 2 @@ -3317,10 +3322,11 @@ // CHECK3-NEXT: [[B7:%.*]] = getelementptr inbounds [[STRUCT_SS]], %struct.SS* [[THIS1]], i32 0, i32 1 // CHECK3-NEXT: [[TMP5:%.*]] = trunc i32 [[TMP4]] to i8 // CHECK3-NEXT: [[BF_LOAD8:%.*]] = load i8, i8* [[B7]], align 4 +// CHECK3-NEXT: [[BF_FREEZE9:%.*]] = freeze i8 [[BF_LOAD8]] // CHECK3-NEXT: [[BF_VALUE:%.*]] = and i8 [[TMP5]], 15 -// CHECK3-NEXT: [[BF_CLEAR9:%.*]] = and i8 [[BF_LOAD8]], -16 -// CHECK3-NEXT: [[BF_SET10:%.*]] = or i8 [[BF_CLEAR9]], [[BF_VALUE]] -// CHECK3-NEXT: store i8 [[BF_SET10]], i8* [[B7]], align 4 +// CHECK3-NEXT: [[BF_CLEAR10:%.*]] = and i8 [[BF_FREEZE9]], -16 +// CHECK3-NEXT: [[BF_SET11:%.*]] = or i8 [[BF_CLEAR10]], [[BF_VALUE]] +// CHECK3-NEXT: store i8 [[BF_SET11]], i8* [[B7]], align 4 // CHECK3-NEXT: ret void // // @@ -4018,7 +4024,8 @@ // CHECK4-NEXT: store i32 0, i32* [[A]], align 8 // CHECK4-NEXT: [[B:%.*]] = getelementptr inbounds [[STRUCT_SS]], %struct.SS* [[THIS1]], i32 0, i32 1 // CHECK4-NEXT: [[BF_LOAD:%.*]] = load i8, i8* [[B]], align 4 -// CHECK4-NEXT: [[BF_CLEAR:%.*]] = and i8 [[BF_LOAD]], -16 +// CHECK4-NEXT: [[BF_FREEZE:%.*]] = freeze i8 [[BF_LOAD]] +// CHECK4-NEXT: [[BF_CLEAR:%.*]] = and i8 [[BF_FREEZE]], -16 // CHECK4-NEXT: [[BF_SET:%.*]] = or i8 [[BF_CLEAR]], 0 // CHECK4-NEXT: store i8 [[BF_SET]], i8* [[B]], align 4 // CHECK4-NEXT: [[C:%.*]] = getelementptr inbounds [[STRUCT_SS]], %struct.SS* [[THIS1]], i32 0, i32 2 @@ -4036,10 +4043,11 @@ // CHECK4-NEXT: [[B7:%.*]] = getelementptr inbounds [[STRUCT_SS]], %struct.SS* [[THIS1]], i32 0, i32 1 // CHECK4-NEXT: [[TMP5:%.*]] = trunc i32 [[TMP4]] to i8 // CHECK4-NEXT: [[BF_LOAD8:%.*]] = load i8, i8* [[B7]], align 4 +// CHECK4-NEXT: [[BF_FREEZE9:%.*]] = freeze i8 [[BF_LOAD8]] // CHECK4-NEXT: [[BF_VALUE:%.*]] = and i8 [[TMP5]], 15 -// CHECK4-NEXT: [[BF_CLEAR9:%.*]] = and i8 [[BF_LOAD8]], -16 -// CHECK4-NEXT: [[BF_SET10:%.*]] = or i8 [[BF_CLEAR9]], [[BF_VALUE]] -// CHECK4-NEXT: store i8 [[BF_SET10]], i8* [[B7]], align 4 +// CHECK4-NEXT: [[BF_CLEAR10:%.*]] = and i8 [[BF_FREEZE9]], -16 +// CHECK4-NEXT: [[BF_SET11:%.*]] = or i8 [[BF_CLEAR10]], [[BF_VALUE]] +// CHECK4-NEXT: store i8 [[BF_SET11]], i8* [[B7]], align 4 // CHECK4-NEXT: ret void // // diff --git a/clang/test/OpenMP/single_codegen.cpp b/clang/test/OpenMP/single_codegen.cpp --- a/clang/test/OpenMP/single_codegen.cpp +++ b/clang/test/OpenMP/single_codegen.cpp @@ -728,7 +728,8 @@ // CHECK1-NEXT: store i32 0, i32* [[A]], align 8 // CHECK1-NEXT: [[B:%.*]] = getelementptr inbounds [[STRUCT_SS]], %struct.SS* [[THIS1]], i32 0, i32 1 // CHECK1-NEXT: [[BF_LOAD:%.*]] = load i8, i8* [[B]], align 4 -// CHECK1-NEXT: [[BF_CLEAR:%.*]] = and i8 [[BF_LOAD]], -16 +// CHECK1-NEXT: [[BF_FREEZE:%.*]] = freeze i8 [[BF_LOAD]] +// CHECK1-NEXT: [[BF_CLEAR:%.*]] = and i8 [[BF_FREEZE]], -16 // CHECK1-NEXT: [[BF_SET:%.*]] = or i8 [[BF_CLEAR]], 0 // CHECK1-NEXT: store i8 [[BF_SET]], i8* [[B]], align 4 // CHECK1-NEXT: [[C:%.*]] = getelementptr inbounds [[STRUCT_SS]], %struct.SS* [[THIS1]], i32 0, i32 2 @@ -1529,7 +1530,8 @@ // CHECK2-NEXT: store i32 0, i32* [[A]], align 8 // CHECK2-NEXT: [[B:%.*]] = getelementptr inbounds [[STRUCT_SS]], %struct.SS* [[THIS1]], i32 0, i32 1 // CHECK2-NEXT: [[BF_LOAD:%.*]] = load i8, i8* [[B]], align 4 -// CHECK2-NEXT: [[BF_CLEAR:%.*]] = and i8 [[BF_LOAD]], -16 +// CHECK2-NEXT: [[BF_FREEZE:%.*]] = freeze i8 [[BF_LOAD]] +// CHECK2-NEXT: [[BF_CLEAR:%.*]] = and i8 [[BF_FREEZE]], -16 // CHECK2-NEXT: [[BF_SET:%.*]] = or i8 [[BF_CLEAR]], 0 // CHECK2-NEXT: store i8 [[BF_SET]], i8* [[B]], align 4 // CHECK2-NEXT: [[C:%.*]] = getelementptr inbounds [[STRUCT_SS]], %struct.SS* [[THIS1]], i32 0, i32 2 @@ -2676,7 +2678,8 @@ // CHECK3-NEXT: store i32 0, i32* [[A]], align 8 // CHECK3-NEXT: [[B:%.*]] = getelementptr inbounds [[STRUCT_SS]], %struct.SS* [[THIS1]], i32 0, i32 1 // CHECK3-NEXT: [[BF_LOAD:%.*]] = load i8, i8* [[B]], align 4 -// CHECK3-NEXT: [[BF_CLEAR:%.*]] = and i8 [[BF_LOAD]], -16 +// CHECK3-NEXT: [[BF_FREEZE:%.*]] = freeze i8 [[BF_LOAD]] +// CHECK3-NEXT: [[BF_CLEAR:%.*]] = and i8 [[BF_FREEZE]], -16 // CHECK3-NEXT: [[BF_SET:%.*]] = or i8 [[BF_CLEAR]], 0 // CHECK3-NEXT: store i8 [[BF_SET]], i8* [[B]], align 4 // CHECK3-NEXT: [[C:%.*]] = getelementptr inbounds [[STRUCT_SS]], %struct.SS* [[THIS1]], i32 0, i32 2 @@ -3465,7 +3468,8 @@ // CHECK4-NEXT: store i32 0, i32* [[A]], align 8 // CHECK4-NEXT: [[B:%.*]] = getelementptr inbounds [[STRUCT_SS]], %struct.SS* [[THIS1]], i32 0, i32 1 // CHECK4-NEXT: [[BF_LOAD:%.*]] = load i8, i8* [[B]], align 4 -// CHECK4-NEXT: [[BF_CLEAR:%.*]] = and i8 [[BF_LOAD]], -16 +// CHECK4-NEXT: [[BF_FREEZE:%.*]] = freeze i8 [[BF_LOAD]] +// CHECK4-NEXT: [[BF_CLEAR:%.*]] = and i8 [[BF_FREEZE]], -16 // CHECK4-NEXT: [[BF_SET:%.*]] = or i8 [[BF_CLEAR]], 0 // CHECK4-NEXT: store i8 [[BF_SET]], i8* [[B]], align 4 // CHECK4-NEXT: [[C:%.*]] = getelementptr inbounds [[STRUCT_SS]], %struct.SS* [[THIS1]], i32 0, i32 2 @@ -4610,7 +4614,8 @@ // CHECK5-NEXT: store i32 0, i32* [[A]], align 8, !dbg [[DBG122]] // CHECK5-NEXT: [[B:%.*]] = getelementptr inbounds [[STRUCT_SS]], %struct.SS* [[THIS1]], i32 0, i32 1, !dbg [[DBG123:![0-9]+]] // CHECK5-NEXT: [[BF_LOAD:%.*]] = load i8, i8* [[B]], align 4, !dbg [[DBG123]] -// CHECK5-NEXT: [[BF_CLEAR:%.*]] = and i8 [[BF_LOAD]], -16, !dbg [[DBG123]] +// CHECK5-NEXT: [[BF_FREEZE:%.*]] = freeze i8 [[BF_LOAD]], !dbg [[DBG123]] +// CHECK5-NEXT: [[BF_CLEAR:%.*]] = and i8 [[BF_FREEZE]], -16, !dbg [[DBG123]] // CHECK5-NEXT: [[BF_SET:%.*]] = or i8 [[BF_CLEAR]], 0, !dbg [[DBG123]] // CHECK5-NEXT: store i8 [[BF_SET]], i8* [[B]], align 4, !dbg [[DBG123]] // CHECK5-NEXT: [[C:%.*]] = getelementptr inbounds [[STRUCT_SS]], %struct.SS* [[THIS1]], i32 0, i32 2, !dbg [[DBG124:![0-9]+]] diff --git a/clang/test/OpenMP/teams_private_codegen.cpp b/clang/test/OpenMP/teams_private_codegen.cpp --- a/clang/test/OpenMP/teams_private_codegen.cpp +++ b/clang/test/OpenMP/teams_private_codegen.cpp @@ -203,7 +203,8 @@ // CHECK1-NEXT: store i32 0, i32* [[A]], align 8 // CHECK1-NEXT: [[B:%.*]] = getelementptr inbounds [[STRUCT_SS]], %struct.SS* [[THIS1]], i32 0, i32 1 // CHECK1-NEXT: [[BF_LOAD:%.*]] = load i8, i8* [[B]], align 4 -// CHECK1-NEXT: [[BF_CLEAR:%.*]] = and i8 [[BF_LOAD]], -16 +// CHECK1-NEXT: [[BF_FREEZE:%.*]] = freeze i8 [[BF_LOAD]] +// CHECK1-NEXT: [[BF_CLEAR:%.*]] = and i8 [[BF_FREEZE]], -16 // CHECK1-NEXT: [[BF_SET:%.*]] = or i8 [[BF_CLEAR]], 0 // CHECK1-NEXT: store i8 [[BF_SET]], i8* [[B]], align 4 // CHECK1-NEXT: [[C:%.*]] = getelementptr inbounds [[STRUCT_SS]], %struct.SS* [[THIS1]], i32 0, i32 2 @@ -371,7 +372,8 @@ // CHECK2-NEXT: store i32 0, i32* [[A]], align 8 // CHECK2-NEXT: [[B:%.*]] = getelementptr inbounds [[STRUCT_SS]], %struct.SS* [[THIS1]], i32 0, i32 1 // CHECK2-NEXT: [[BF_LOAD:%.*]] = load i8, i8* [[B]], align 4 -// CHECK2-NEXT: [[BF_CLEAR:%.*]] = and i8 [[BF_LOAD]], -16 +// CHECK2-NEXT: [[BF_FREEZE:%.*]] = freeze i8 [[BF_LOAD]] +// CHECK2-NEXT: [[BF_CLEAR:%.*]] = and i8 [[BF_FREEZE]], -16 // CHECK2-NEXT: [[BF_SET:%.*]] = or i8 [[BF_CLEAR]], 0 // CHECK2-NEXT: store i8 [[BF_SET]], i8* [[B]], align 4 // CHECK2-NEXT: [[C:%.*]] = getelementptr inbounds [[STRUCT_SS]], %struct.SS* [[THIS1]], i32 0, i32 2 @@ -539,7 +541,8 @@ // CHECK3-NEXT: store i32 0, i32* [[A]], align 4 // CHECK3-NEXT: [[B:%.*]] = getelementptr inbounds [[STRUCT_SS]], %struct.SS* [[THIS1]], i32 0, i32 1 // CHECK3-NEXT: [[BF_LOAD:%.*]] = load i8, i8* [[B]], align 4 -// CHECK3-NEXT: [[BF_CLEAR:%.*]] = and i8 [[BF_LOAD]], -16 +// CHECK3-NEXT: [[BF_FREEZE:%.*]] = freeze i8 [[BF_LOAD]] +// CHECK3-NEXT: [[BF_CLEAR:%.*]] = and i8 [[BF_FREEZE]], -16 // CHECK3-NEXT: [[BF_SET:%.*]] = or i8 [[BF_CLEAR]], 0 // CHECK3-NEXT: store i8 [[BF_SET]], i8* [[B]], align 4 // CHECK3-NEXT: [[C:%.*]] = getelementptr inbounds [[STRUCT_SS]], %struct.SS* [[THIS1]], i32 0, i32 2 @@ -707,7 +710,8 @@ // CHECK4-NEXT: store i32 0, i32* [[A]], align 4 // CHECK4-NEXT: [[B:%.*]] = getelementptr inbounds [[STRUCT_SS]], %struct.SS* [[THIS1]], i32 0, i32 1 // CHECK4-NEXT: [[BF_LOAD:%.*]] = load i8, i8* [[B]], align 4 -// CHECK4-NEXT: [[BF_CLEAR:%.*]] = and i8 [[BF_LOAD]], -16 +// CHECK4-NEXT: [[BF_FREEZE:%.*]] = freeze i8 [[BF_LOAD]] +// CHECK4-NEXT: [[BF_CLEAR:%.*]] = and i8 [[BF_FREEZE]], -16 // CHECK4-NEXT: [[BF_SET:%.*]] = or i8 [[BF_CLEAR]], 0 // CHECK4-NEXT: store i8 [[BF_SET]], i8* [[B]], align 4 // CHECK4-NEXT: [[C:%.*]] = getelementptr inbounds [[STRUCT_SS]], %struct.SS* [[THIS1]], i32 0, i32 2 @@ -1038,7 +1042,8 @@ // CHECK9-NEXT: store i32 0, i32* [[A]], align 8 // CHECK9-NEXT: [[B:%.*]] = getelementptr inbounds [[STRUCT_SS]], %struct.SS* [[THIS1]], i32 0, i32 1 // CHECK9-NEXT: [[BF_LOAD:%.*]] = load i8, i8* [[B]], align 4 -// CHECK9-NEXT: [[BF_CLEAR:%.*]] = and i8 [[BF_LOAD]], -16 +// CHECK9-NEXT: [[BF_FREEZE:%.*]] = freeze i8 [[BF_LOAD]] +// CHECK9-NEXT: [[BF_CLEAR:%.*]] = and i8 [[BF_FREEZE]], -16 // CHECK9-NEXT: [[BF_SET:%.*]] = or i8 [[BF_CLEAR]], 0 // CHECK9-NEXT: store i8 [[BF_SET]], i8* [[B]], align 4 // CHECK9-NEXT: [[C:%.*]] = getelementptr inbounds [[STRUCT_SS]], %struct.SS* [[THIS1]], i32 0, i32 2 @@ -1537,7 +1542,8 @@ // CHECK10-NEXT: store i32 0, i32* [[A]], align 8 // CHECK10-NEXT: [[B:%.*]] = getelementptr inbounds [[STRUCT_SS]], %struct.SS* [[THIS1]], i32 0, i32 1 // CHECK10-NEXT: [[BF_LOAD:%.*]] = load i8, i8* [[B]], align 4 -// CHECK10-NEXT: [[BF_CLEAR:%.*]] = and i8 [[BF_LOAD]], -16 +// CHECK10-NEXT: [[BF_FREEZE:%.*]] = freeze i8 [[BF_LOAD]] +// CHECK10-NEXT: [[BF_CLEAR:%.*]] = and i8 [[BF_FREEZE]], -16 // CHECK10-NEXT: [[BF_SET:%.*]] = or i8 [[BF_CLEAR]], 0 // CHECK10-NEXT: store i8 [[BF_SET]], i8* [[B]], align 4 // CHECK10-NEXT: [[C:%.*]] = getelementptr inbounds [[STRUCT_SS]], %struct.SS* [[THIS1]], i32 0, i32 2 @@ -2036,7 +2042,8 @@ // CHECK11-NEXT: store i32 0, i32* [[A]], align 4 // CHECK11-NEXT: [[B:%.*]] = getelementptr inbounds [[STRUCT_SS]], %struct.SS* [[THIS1]], i32 0, i32 1 // CHECK11-NEXT: [[BF_LOAD:%.*]] = load i8, i8* [[B]], align 4 -// CHECK11-NEXT: [[BF_CLEAR:%.*]] = and i8 [[BF_LOAD]], -16 +// CHECK11-NEXT: [[BF_FREEZE:%.*]] = freeze i8 [[BF_LOAD]] +// CHECK11-NEXT: [[BF_CLEAR:%.*]] = and i8 [[BF_FREEZE]], -16 // CHECK11-NEXT: [[BF_SET:%.*]] = or i8 [[BF_CLEAR]], 0 // CHECK11-NEXT: store i8 [[BF_SET]], i8* [[B]], align 4 // CHECK11-NEXT: [[C:%.*]] = getelementptr inbounds [[STRUCT_SS]], %struct.SS* [[THIS1]], i32 0, i32 2 @@ -2535,7 +2542,8 @@ // CHECK12-NEXT: store i32 0, i32* [[A]], align 4 // CHECK12-NEXT: [[B:%.*]] = getelementptr inbounds [[STRUCT_SS]], %struct.SS* [[THIS1]], i32 0, i32 1 // CHECK12-NEXT: [[BF_LOAD:%.*]] = load i8, i8* [[B]], align 4 -// CHECK12-NEXT: [[BF_CLEAR:%.*]] = and i8 [[BF_LOAD]], -16 +// CHECK12-NEXT: [[BF_FREEZE:%.*]] = freeze i8 [[BF_LOAD]] +// CHECK12-NEXT: [[BF_CLEAR:%.*]] = and i8 [[BF_FREEZE]], -16 // CHECK12-NEXT: [[BF_SET:%.*]] = or i8 [[BF_CLEAR]], 0 // CHECK12-NEXT: store i8 [[BF_SET]], i8* [[B]], align 4 // CHECK12-NEXT: [[C:%.*]] = getelementptr inbounds [[STRUCT_SS]], %struct.SS* [[THIS1]], i32 0, i32 2