Unstable register allocation with R600/SI

Christian König christian.koenig at amd.com
Mon Mar 25 06:49:42 PDT 2013


Hi Michel, Tom & everybody on the list,

for a couple of weeks now I'm trying to figure out what is going wrong 
here, but no luck so far.

The basic problem is that the attached .ll file compiled with "llc 
-march=r600 -mcpu=SI -o -" doesn't seems to produce stable register 
allocation, e.g. you run it twice on the same machine and get different 
output each time. The generated code seems to be always correct, but I 
still think that this is quite a serious bug.

So any idea how we could narrow this down and figure out what's going 
wrong here?

Regards,
Christian.
-------------- next part --------------
; ModuleID = 'tgsi'

define void @main(<16 x i8> addrspace(2)* inreg, <16 x i8> addrspace(2)* inreg, <32 x i8> addrspace(2)* inreg, i32 inreg, <2 x i32>, <2 x i32>, <2 x i32>, <3 x i32>, <2 x i32>, <2 x i32>, <2 x i32>, float, float, float, float, float, float, float, float, float) #0 {
main_body:
  %20 = getelementptr <16 x i8> addrspace(2)* %0, i32 0
  %21 = load <16 x i8> addrspace(2)* %20, !tbaa !0
  %22 = call float @llvm.SI.fs.interp(i32 0, i32 0, i32 %3, <2 x i32> %5)
  %23 = call float @llvm.SI.fs.interp(i32 1, i32 0, i32 %3, <2 x i32> %5)
  %24 = call float @llvm.SI.load.const(<16 x i8> %21, i32 16)
  %25 = bitcast float %24 to i32
  %26 = icmp eq i32 %25, 0
  %27 = sext i1 %26 to i32
  %28 = bitcast i32 %27 to float
  %29 = bitcast float %28 to i32
  %30 = icmp ne i32 %29, 0
  %31 = call float @llvm.SI.load.const(<16 x i8> %21, i32 0)
  %32 = bitcast float %31 to i32
  br i1 %30, label %IF, label %ELSE

IF:                                               ; preds = %main_body
  %33 = icmp ne i32 %32, 0
  %34 = sext i1 %33 to i32
  %35 = bitcast i32 %34 to float
  %36 = call float @llvm.SI.load.const(<16 x i8> %21, i32 0)
  %37 = bitcast float %36 to i32
  %38 = icmp ne i32 %37, 3
  %39 = sext i1 %38 to i32
  %40 = bitcast i32 %39 to float
  %41 = bitcast float %35 to i32
  %42 = bitcast float %40 to i32
  %43 = and i32 %41, %42
  %44 = bitcast i32 %43 to float
  %45 = bitcast float %44 to i32
  %46 = icmp ne i32 %45, 0
  %47 = bitcast float %22 to i32
  %48 = bitcast float %23 to i32
  %49 = insertelement <2 x i32> undef, i32 %47, i32 0
  %50 = insertelement <2 x i32> %49, i32 %48, i32 1
  %51 = getelementptr <32 x i8> addrspace(2)* %2, i32 0
  %52 = load <32 x i8> addrspace(2)* %51, !tbaa !0
  %53 = getelementptr <16 x i8> addrspace(2)* %1, i32 0
  %54 = load <16 x i8> addrspace(2)* %53, !tbaa !0
  %55 = call <4 x float> @llvm.SI.sample.v2i32(i32 15, <2 x i32> %50, <32 x i8> %52, <16 x i8> %54, i32 2)
  %56 = extractelement <4 x float> %55, i32 0
  %57 = extractelement <4 x float> %55, i32 1
  %58 = extractelement <4 x float> %55, i32 2
  %59 = extractelement <4 x float> %55, i32 3
  %. = select i1 %46, float %58, float %56
  %.23 = select i1 %46, float %56, float %58
  br label %ENDIF

ELSE:                                             ; preds = %main_body
  %60 = icmp eq i32 %32, 1
  %61 = sext i1 %60 to i32
  %62 = bitcast i32 %61 to float
  %63 = bitcast float %62 to i32
  %64 = icmp ne i32 %63, 0
  br i1 %64, label %IF12, label %ELSE13

ENDIF:                                            ; preds = %IF21, %ELSE19, %IF18, %IF15, %IF12, %IF
  %temp.0 = phi float [ %., %IF ], [ %85, %IF12 ], [ %105, %IF15 ], [ %123, %IF18 ], [ %145, %IF21 ], [ %28, %ELSE19 ]
  %temp1.0 = phi float [ %57, %IF ], [ %82, %IF12 ], [ %104, %IF15 ], [ %124, %IF18 ], [ %144, %IF21 ], [ 0.000000e+00, %ELSE19 ]
  %temp2.0 = phi float [ %.23, %IF ], [ %83, %IF12 ], [ %103, %IF15 ], [ %125, %IF18 ], [ %143, %IF21 ], [ 0.000000e+00, %ELSE19 ]
  %temp3.0 = phi float [ %59, %IF ], [ %84, %IF12 ], [ %102, %IF15 ], [ %122, %IF18 ], [ %142, %IF21 ], [ 0.000000e+00, %ELSE19 ]
  %65 = call float @llvm.AMDIL.clamp.(float %temp.0, float 0.000000e+00, float 1.000000e+00)
  %66 = call float @llvm.AMDIL.clamp.(float %temp1.0, float 0.000000e+00, float 1.000000e+00)
  %67 = call float @llvm.AMDIL.clamp.(float %temp2.0, float 0.000000e+00, float 1.000000e+00)
  %68 = call float @llvm.AMDIL.clamp.(float %temp3.0, float 0.000000e+00, float 1.000000e+00)
  %69 = call i32 @llvm.SI.packf16(float %65, float %66)
  %70 = bitcast i32 %69 to float
  %71 = call i32 @llvm.SI.packf16(float %67, float %68)
  %72 = bitcast i32 %71 to float
  call void @llvm.SI.export(i32 15, i32 1, i32 1, i32 0, i32 1, float %70, float %72, float %70, float %72)
  ret void

IF12:                                             ; preds = %ELSE
  %73 = bitcast float %22 to i32
  %74 = bitcast float %23 to i32
  %75 = insertelement <2 x i32> undef, i32 %73, i32 0
  %76 = insertelement <2 x i32> %75, i32 %74, i32 1
  %77 = getelementptr <32 x i8> addrspace(2)* %2, i32 0
  %78 = load <32 x i8> addrspace(2)* %77, !tbaa !0
  %79 = getelementptr <16 x i8> addrspace(2)* %1, i32 0
  %80 = load <16 x i8> addrspace(2)* %79, !tbaa !0
  %81 = call <4 x float> @llvm.SI.sample.v2i32(i32 15, <2 x i32> %76, <32 x i8> %78, <16 x i8> %80, i32 2)
  %82 = extractelement <4 x float> %81, i32 0
  %83 = extractelement <4 x float> %81, i32 1
  %84 = extractelement <4 x float> %81, i32 2
  %85 = extractelement <4 x float> %81, i32 3
  br label %ENDIF

ELSE13:                                           ; preds = %ELSE
  %86 = call float @llvm.SI.load.const(<16 x i8> %21, i32 0)
  %87 = bitcast float %86 to i32
  %88 = icmp eq i32 %87, 0
  %89 = sext i1 %88 to i32
  %90 = bitcast i32 %89 to float
  %91 = bitcast float %90 to i32
  %92 = icmp ne i32 %91, 0
  br i1 %92, label %IF15, label %ELSE16

IF15:                                             ; preds = %ELSE13
  %93 = bitcast float %22 to i32
  %94 = bitcast float %23 to i32
  %95 = insertelement <2 x i32> undef, i32 %93, i32 0
  %96 = insertelement <2 x i32> %95, i32 %94, i32 1
  %97 = getelementptr <32 x i8> addrspace(2)* %2, i32 0
  %98 = load <32 x i8> addrspace(2)* %97, !tbaa !0
  %99 = getelementptr <16 x i8> addrspace(2)* %1, i32 0
  %100 = load <16 x i8> addrspace(2)* %99, !tbaa !0
  %101 = call <4 x float> @llvm.SI.sample.v2i32(i32 15, <2 x i32> %96, <32 x i8> %98, <16 x i8> %100, i32 2)
  %102 = extractelement <4 x float> %101, i32 0
  %103 = extractelement <4 x float> %101, i32 1
  %104 = extractelement <4 x float> %101, i32 2
  %105 = extractelement <4 x float> %101, i32 3
  br label %ENDIF

ELSE16:                                           ; preds = %ELSE13
  %106 = call float @llvm.SI.load.const(<16 x i8> %21, i32 0)
  %107 = bitcast float %106 to i32
  %108 = icmp eq i32 %107, 2
  %109 = sext i1 %108 to i32
  %110 = bitcast i32 %109 to float
  %111 = bitcast float %110 to i32
  %112 = icmp ne i32 %111, 0
  br i1 %112, label %IF18, label %ELSE19

IF18:                                             ; preds = %ELSE16
  %113 = bitcast float %22 to i32
  %114 = bitcast float %23 to i32
  %115 = insertelement <2 x i32> undef, i32 %113, i32 0
  %116 = insertelement <2 x i32> %115, i32 %114, i32 1
  %117 = getelementptr <32 x i8> addrspace(2)* %2, i32 0
  %118 = load <32 x i8> addrspace(2)* %117, !tbaa !0
  %119 = getelementptr <16 x i8> addrspace(2)* %1, i32 0
  %120 = load <16 x i8> addrspace(2)* %119, !tbaa !0
  %121 = call <4 x float> @llvm.SI.sample.v2i32(i32 15, <2 x i32> %116, <32 x i8> %118, <16 x i8> %120, i32 2)
  %122 = extractelement <4 x float> %121, i32 0
  %123 = extractelement <4 x float> %121, i32 1
  %124 = extractelement <4 x float> %121, i32 2
  %125 = extractelement <4 x float> %121, i32 3
  br label %ENDIF

ELSE19:                                           ; preds = %ELSE16
  %126 = call float @llvm.SI.load.const(<16 x i8> %21, i32 0)
  %127 = bitcast float %126 to i32
  %128 = icmp eq i32 %127, 3
  %129 = sext i1 %128 to i32
  %130 = bitcast i32 %129 to float
  %131 = bitcast float %130 to i32
  %132 = icmp ne i32 %131, 0
  br i1 %132, label %IF21, label %ENDIF

IF21:                                             ; preds = %ELSE19
  %133 = bitcast float %22 to i32
  %134 = bitcast float %23 to i32
  %135 = insertelement <2 x i32> undef, i32 %133, i32 0
  %136 = insertelement <2 x i32> %135, i32 %134, i32 1
  %137 = getelementptr <32 x i8> addrspace(2)* %2, i32 0
  %138 = load <32 x i8> addrspace(2)* %137, !tbaa !0
  %139 = getelementptr <16 x i8> addrspace(2)* %1, i32 0
  %140 = load <16 x i8> addrspace(2)* %139, !tbaa !0
  %141 = call <4 x float> @llvm.SI.sample.v2i32(i32 15, <2 x i32> %136, <32 x i8> %138, <16 x i8> %140, i32 2)
  %142 = extractelement <4 x float> %141, i32 0
  %143 = extractelement <4 x float> %141, i32 1
  %144 = extractelement <4 x float> %141, i32 2
  %145 = extractelement <4 x float> %141, i32 3
  br label %ENDIF
}

declare float @llvm.SI.load.const(<16 x i8>, i32) #1

declare float @llvm.SI.fs.interp(i32, i32, i32, <2 x i32>) #1

declare <4 x float> @llvm.SI.sample.v2i32(i32, <2 x i32>, <32 x i8>, <16 x i8>, i32) #1

declare float @llvm.AMDIL.clamp.(float, float, float) #2

declare i32 @llvm.SI.packf16(float, float) #2

declare void @llvm.SI.export(i32, i32, i32, i32, i32, float, float, float, float)

attributes #0 = { "ShaderType"="0" }
attributes #1 = { nounwind readonly }
attributes #2 = { readnone }

!0 = metadata !{metadata !"const", null, i32 1}


More information about the llvm-commits mailing list